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

标签 c++ opencv

执行这个:

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/

相关文章:

python - 从图像 OpenCv 中删除合并线

c++ - 绕过 Eigen 静态断言

C++读写UTF-32文件

c++ - OpenCV 3.1 ANN 预测返回 nan

opencv - 图像中的圆圈检测

c++ - 特定对象的立体对应和 3D 位置 (ROI)

c++ - 使用 -O3 编译时将函数标记为内联?

C++ 嵌套类方法

c++ - 选择在 Windows 7 上无法正常工作

c++ - 人物轮廓的选择