Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么将cv::Mat的列复制到向量失败?_C++_Opencv_Vector_Stl - Fatal编程技术网

C++ 为什么将cv::Mat的列复制到向量失败?

C++ 为什么将cv::Mat的列复制到向量失败?,c++,opencv,vector,stl,C++,Opencv,Vector,Stl,考虑下面的代码示例。为什么下面标记的行在运行时触发断点/异常 int main() { Mat m1 = Mat::zeros(10, 1, CV_32FC1); Mat m2 = Mat::zeros(10, 3, CV_32FC1); vector<float> v1(m1); // works Mat m2sub = m2.col(0); Mat m2subClone = m2.col(0).clone(); vector<

考虑下面的代码示例。为什么下面标记的行在运行时触发断点/异常

int main() {
    Mat m1 = Mat::zeros(10, 1, CV_32FC1);
    Mat m2 = Mat::zeros(10, 3, CV_32FC1);

    vector<float> v1(m1); // works
    Mat m2sub = m2.col(0);
    Mat m2subClone = m2.col(0).clone();
    vector<float> v2(m2subClone); // works
    vector<float> v3(m2sub); // doesn't work
return 0;
}
代码段在与我的完整代码相同的位置失败,并出现访问冲突错误


我有超过2GB的可用内存,并且该应用程序被编译为64位应用程序,因此它不应该是“内存不足”问题(?)

我不太了解OpenCV Mat类,但我猜矩阵中的列共享了一些内容,所以memcopying它可能不是一个好主意。查看Mat::row方法的OpenCV文档(,Mat::col方法具有关于“共享头”的相同参数),有一条注释指出以下不是一个好主意

Mat A;
...
A.row(i) = A.row(j); // will not work
您应该使用以下选项:

A.row(j).copyTo(A.row(i));
因此,也许在您的代码中应该使用以下内容:

vector<float> v3;
m2sub.copyTo(v3);
vectorv3;
m2sub.copyTo(v3);

这并不能解决OP的问题。如问题中所述,
copyTo()
的调用方式与您在转换中建议的方式完全相同。不过,我只是在这里测试了代码(MSVC 10,Windows 7,32位二进制),它没有与m2sub.copyTo(v3)中断;(即使它与vector v3(m2sub);)中断)。我的观点是,问题可能与双重删除或类似的内容有关,因为OpenCV实现了引用计数(而std vector没有)。在本页中,有一些关于使用克隆(m2subClone中使用的克隆)和copyTo的必要性的讨论:这实际上是一个有趣的观察结果。这两个版本都使用Xcode和OpenCV 2.4.5。奇怪的是,OP只有10个元素的代码对我来说并没有中断。代码在memcpy函数处中断。我在OpenCV文档的某个地方读到(再也找不到)内部指针是以基于行的方式处理的。因此,由于col方法只是返回一个引用,memcopying就把事情搞砸了。我做了一个快速测试,并更改为Mat m2=Mat::zeros(5900,300,CV_32FC1);此外,我将每个对col的调用都更改为对row的调用。代码运行良好。因此,对我来说,问题在于子部分没有被克隆,列指针也不是连续的(这里有更多信息)。根据您使用的平台,行为似乎有所不同(请参见Luiz答案下的注释)。你使用的是什么编译器和版本的OpenCV?@Aurelius我使用的是VS2012,64位,OpenCV来自Git,已经有几个月了(3月到7月左右。Git显示2.4.4/2.4.5,但是dll的后缀是249。我可能会深入挖掘,看看是否相关。)
A.row(j).copyTo(A.row(i));
vector<float> v3;
m2sub.copyTo(v3);