OpenCV2.4.2将vector<Point2f>转换为Mat,释放mat会报错
Posted
技术标签:
【中文标题】OpenCV2.4.2将vector<Point2f>转换为Mat,释放mat会报错【英文标题】:OpenCV2.4.2 converting vector<Point2f> to Mat, and releasing the mat causes error 【发布时间】:2014-07-15 05:59:13 【问题描述】:我将向量更改为 Mat,因为由于某种原因 findHomography() 如果采用向量,则只会产生零矩阵。
以下是简短的代码。
std::vector<Point2f> img1;
std::vector<Point2f> img2;
Mat mat_from_img1 = Mat(img1,true);
Mat mat_from_img2 = Mat(img2,true);
Mat H = cv::findHomography(mat_from_img1,mat_from_img2, CV_RANSAC);
//Do THINGS
//as soons as getting out of this scope,
//it calls ~MAT() then Mat::release and causes memory reading violation error.
如何正确地将矢量转换为垫子以避免错误? 我试过了
Mat mat_from_img1 = Mat(img1,true);要么
【问题讨论】:
由于Mat mat_from_img1 = Mat(img1,true)
复制了它必须为其分配空间的数据。如果未释放数据,您将发生内存泄漏。你得到“内存读取冲突错误”的代码是什么?
传递Point2f
的向量是正确的方法——如果你得到一个不好的结果,你可能没有足够的优点。尝试使用CV_LMEDS
而不是CV_RANSAC
,看看是否有什么不同。在您的代码 sn-p 中,您实际上并没有将任何点推入向量中,我假设这不是您实际上所做的?
将向量传递给 findHomography 是正确的方法,但我不知道为什么如果我传递向量它会返回零矩阵。我必须使用矩阵来获得正确的 H 矩阵。我意识到在销毁 mat H 时,会导致内存冲突读取错误。
哦,我找到了,这只是我的链接器问题。在发布模式下,我使用了调试模式库。
【参考方案1】:
您不需要将这些向量转换为 Mats。您可以将它们直接传递给cv::findHomography() - 它需要一个InputArray
和一个InputArray can be a std::vector。
参见示例 http://docs.opencv.org/doc/tutorials/features2d/feature_homography/feature_homography.html
检查 img1 和 img2 中的内容——根据您的代码,它们是空的!
【讨论】:
以上是关于OpenCV2.4.2将vector<Point2f>转换为Mat,释放mat会报错的主要内容,如果未能解决你的问题,请参考以下文章