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会报错的主要内容,如果未能解决你的问题,请参考以下文章

Tiny6410的OpenCV2.4.2移植笔记

bzoj 2083 [Poi2010]Intelligence test——思路+vector/链表

在不同的目录中安装 opencv 2.2

[POI] 大都市meg

3747: [POI2015]Kinoman|线段树

OpenCV 2.4.2 findContours(),如何只得到直线轮廓