访问cv::Mat数据时出现OpenCV错误

3
对于我使用的任何允许类型的Mat类型,当我尝试进行一些赋值或写入流等操作时,都会出现以下错误。这在MSVC++2010 Express编译器上发生,而在gnu g++编译器上则不会发生。
错误示例:
Mat M = Mat::zeros( image.size(),  DataType<int>::type  );

std::cout << M.at<int>( 0,0 ) << std::endl; // error

// OR

int x = M.at<int>( 0,0 ); // error

两个错误同时发生: 在弹出窗口中。
Unhandled exception at <some hex adress> in test.exe:Microsoft C++ exception: cv:xception at memory location <some hex adress>

并在控制台窗口上显示

OpenCV Error: Assertion failed ... \mat.hpp, line 537

有什么建议吗?
2个回答

7
使矩阵数据类型变为CV_16U.at访问器函数非常严谨,要求数据类型非常精确。一些编译器会忽略这些问题,而另一些则会及早捕捉到错误。
与其使用matrix.at<int>(row, col)引用元素,CV_16U将引用unsigned short数据类型。因此,可以使用matrix.at<unsigned short>(row, col)访问元素。

1
正确,但是你接着调用了 int 而不是 short。根据你的编译器,它们可能会无缝解决,也可能不会。在矩阵引用中不要假设隐式转换。 - Chris
@Zoran,有什么问题吗?如果数据类型是等价的,就不应该出现问题。你也遇到了这个错误吗?(显式转换是否解决了原始问题?) - Chris
显式转换解决了类似于M.at<float>(0,0) = 0.0;这样使用CV_32F的问题,但我仍然无法在相同类型的矩阵之间分配值,这是原始问题的一部分 :( 现在正在检查2.4.2文档。 - Zoran
1
这不应该是个问题...你的分配错误是什么?你的问题可能是其中一个矩阵没有被初始化。 - Chris
2
通过“非常”显式的类型转换解决了!我的经验是:不要认为OpenCV会为你处理最微小的事情,查看诸如convertTo、convertScaleAbs之类的函数...小心类型转换,例如16U是无符号短整型,而不是其他类型。最后,请小心使用GNU C++编译器,它可能不会抛出类型转换错误。感谢Chris。 - Zoran
显示剩余7条评论

0

我不相信openCV有一个int数据类型的图像。
整数类型通常是CV_16s,即16位短整型,所以请使用


据我所知,它在v.2.4.x中可以实现,但强制转换应该要得到适当处理。 - Zoran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接