OpenCV std::vector for cv::Mat arguments
OpenCV std::vector for cv::Mat arguments
正在执行此操作:
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,最后是我的项目。
这为我修复了它。
相关文章:
- Difference in displaying cv2 Mat
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 将CHW格式的浮点向量转换为cv::Mat
- 具有变量Number of Arguments的std::函数的矢量
- C++中的openCV Mat访问冲突
- OpenCV 和从 OutputArrays 或 (Mat) 读取数据
- 使用 mat.at<uchar>(i,j) 的 opencv C++中的矩阵赋值错误
- C++:从GPU内存(cudaMemcpy2D)获取BGR图像(cv::Mat)
- 选择基于另一个垫子的非零像素的cv::Mat的一部分?
- 将 cv::mat 转换为 QImage
- 两个垫子的 OpenCV 数据是相同的,但使用 Mat::at 检索时的值已损坏
- 如何修复"too few arguments to function"?
- 将 cv::Mat 转换为 std::vector 的通用函数
- 如何通过引用传递OpenCV MAT
- 在 QML VideoOutput 中将 cv::mat 显示为 QVideoFrame
- Read OpenCV Mat 16bit to QImage 8bit Greyscale
- 将本地 OpenCV Mat 变量声明为静态以防止重新分配
- 将 OpenCv Mat 从 C++ 传递给 Python
- 如何发送 Mat H=findHomography 返回 Matlab
- OpenCV std::vector for cv::Mat arguments