执行此操作:
std::vector<cv::Point2f> pts; // contains 4 elements
cv::Mat ptsMat = ((cv::InputArray)pts).getMat();
在一台机器上,我得到一个带有2个频道的 4-by cv::Mat
。每个元素代表一个2D点。
在另一台机器上,我得到一个 2090-by-1 cv::Mat
,其中包含2个带有奇怪数据的通道。 这是错误的,这是一个问题,因为向量只包含4个项目。
在使用Windows 10上的CMake从源代码构建的OpenCV 3.1的两台计算机上。
修改
我开始在不同的机器上遇到类似的问题。 在调试模式下的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中编译它时,它会在访问冲突读取位置的最后一行崩溃...
进一步的调查显示,产生影响的关键标志是:
运行时库:多线程DLL( / MD )--------&gt; 的碰撞
运行时库:多线程DLL调试( / MDd )--------&gt;的工作原理
编辑2
根据Mateen Ulhaq的评论,我检查了
std::vector<cv::Point2f> points;
cv::Mat image(points);
这很好用。
问题是一些OpenCV较大的函数(例如undistortPoints)在内部使用getMat()
转换。如果我在发布时运行它,应用程序崩溃。
编辑3
刚刚检查过,OpenCV 3.2上出现同样的问题
答案 0 :(得分:0)
这不是我正在寻找的答案,但现在就是这样。
似乎每次发生这种情况,都是在Windows Update之后发生的。
我完全删除并重新构建了以下库: VTK,OpenCV,Eigen,最后,我的项目。
这为我解决了。