Ela*_*782 5 c++ opencv stl 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;
}
Run Code Online (Sandbox Code Playgroud)
在mat.hpp中调用的内容似乎很奇怪:
template<typename _Tp> inline Mat::operator std::vector<_Tp>() const {
std::vector<_Tp> v;
copyTo(v);
return v; // <- breaks here
}
Run Code Online (Sandbox Code Playgroud)
和copyTo似乎记忆数据.
它没有给出错误消息,但我在堆栈跟踪中看到它在return语句处断开,然后深入到'operator new'和'ntdll.dll!RtlpAllocateHeap()'.
奇怪的是,在我的完整代码中,它在一个稍微不同的地方中断:在memcpy的copyTo(v)内部,并抛出"访问冲突写入位置0x0000000001F43D4C.".我的完整代码看起来与上面的代码完全相同,但矩阵更大.
编辑:如果在上面的示例中,我将矩阵更改为
Mat m1 = Mat::zeros(5900, 1, CV_32FC1);
Mat m2 = Mat::zeros(5900, 3, CV_32FC1);
Run Code Online (Sandbox Code Playgroud)
由于访问冲突错误,代码段在与完整代码相同的位置失败.
我有超过2GB的RAM免费,并且该应用程序被编译为64位应用程序,因此它不应该是"内存不足"问题(?)
我不太了解 OpenCV Mat 类,但我猜矩阵中的列共享一些东西,所以内存复制它可能不是一个好主意。检查 Mat::row 方法的 OpenCV 文档(这里,Mat::col 方法对于“共享头”有相同的参数),有一条注释表明以下不是一个好主意:
Mat A;
...
A.row(i) = A.row(j); // will not work
Run Code Online (Sandbox Code Playgroud)
并且您应该使用以下内容:
A.row(j).copyTo(A.row(i));
Run Code Online (Sandbox Code Playgroud)
所以,也许在你的代码中你应该使用这个:
vector<float> v3;
m2sub.copyTo(v3);
Run Code Online (Sandbox Code Playgroud)