OpenCV std::vector for cv::Mat arguments

OpenCV std::vector for cv::Mat arguments

本文关键字:Mat arguments cv vector std OpenCV for      更新时间:2023-10-16

正在执行此操作:

std::vector<cv::Point2f> pts; // contains 4 elements
cv::Mat ptsMat = ((cv::InputArray)pts).getMat();

在一台机器上,我得到了一个带有 2 个通道的4 x 1cv::Mat。每个元素代表一个 2D 点。 在另一台机器上,我得到了一个2090 x 1 的cv::Mat,其中包含 2 个带有奇怪数据的通道。这是错误的,这是一个问题,因为向量只包含 4 个项目。

在两台使用 OpenCV 3.1 的计算机上,使用 Windows 10 上的 CMake 从源代码构建。

编辑

我开始在另一台机器上遇到类似的问题。 在调试模式下的Visual Studio中,以下代码片段工作正常:

std::vector<cv::Point2f> points = { cv::Point2f(2, 1), cv::Point2f(2, 1), cv::Point2f(1, 3) };
cv::InputArray arr = points;
cv::Mat ma = arr.getMat();
std::cout << ma.ptr<float>(0)[1];

但是当我在发布中编译它时,它在最后一行与访问冲突读取位置崩溃......

进一步的调查显示,产生影响的关键标志是:

运行时库:多线程 DLL (/MD)-------->崩溃

运行时库:多线程 DLL 调试 (/MDd) -------->工作

编辑 2

根据Mateen Ulhaq的评论,我检查了

std::vector<cv::Point2f> points;
cv::Mat image(points);

这工作正常。 问题在于,一些OpenCV较大的函数(例如undistortPoints)在内部使用getMat()转换。如果我在发布时运行它,应用程序就会崩溃。

编辑 3

刚刚检查,同样的问题发生在OpenCV 3.2上

这不是我一直在寻找的答案,但在这里。

似乎每次发生这种情况时,都是在Windows更新之后立即发生的。

我完全删除并重建了以下库: VTK,OpenCV,Eigen,最后是我的项目。

这为我修复了它。