c – 用于cv :: Mat参数的OpenCV std :: vector

执行此:

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

在一台机器上,我得到了一个带有2个通道的4乘1 cv :: Mat.每个元素代表一个2D点.
在另一台机器上,我得到一个2090乘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中编译它时,它会在Access违规读取位置的最后一行崩溃…

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

运行时库:多线程DLL(/ MD)——–>
紧急

运行时库:多线程DLL调试(/ MDd)——–>作品

编辑2

根据Mateen Ulhaq的评论,我查了一下

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

这很好用.
问题是一些OpenCV较大的函数(例如undistortPoints)在内部使用getMat()转换.如果我在发布时运行它,应用程序崩溃.

编辑3

刚刚检查过,OpenCV 3.2也出现同样的问题

最佳答案
这不是我正在寻找的答案,但这里就是这样.

似乎每次发生这种情况,都是在Windows Update之后立即发生的.

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

这为我修好了.

转载注明原文:c – 用于cv :: Mat参数的OpenCV std :: vector - 代码日志