执行这个:
std::vector<cv::Point2f> pts; // contains 4 elements
cv::Mat ptsMat = ((cv::InputArray)pts).getMat();
在一台机器上,我得到一个带有 2 个 channel 的 4-by-1 cv::Mat
。每个元素代表一个二维点。
在另一台机器上,我得到一个 2090-by-1 cv::Mat
,它有 2 个 channel ,数据很奇怪。 这是错误的,这是一个问题,因为 vector 只包含 4 个项目。
在两台机器上都使用 OpenCV 3.1 从源代码构建,在 Windows 10 上使用 CMake。
编辑
我开始在另一台机器上遇到类似的问题。 在 Debug模式下的 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];
但是当我在 Release 中编译它时,它在最后一行崩溃并显示 Access violation reading location...
进一步调查显示,产生差异的关键标志是:
运行库:多线程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,最后是我的项目。
这为我解决了问题。
关于c++ - 用于 cv::Mat 参数的 OpenCV std::vector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43894642/