OpenCV mat::at抛出异常

5

这段代码在Debug模式下会抛出一个异常。而在Release模式下,会得到预期的输出值0。

#include <opencv2\opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(){
    Mat image;
    image = Mat::zeros(5,5,CV_8UC1);
    try{
       cout<< image.at<unsigned int>(1,1)<<"\n";
    }
    catch(Exception ex){
       cout<< ex.msg;
    }
    cin.get();
    return 0;
}

抛出异常的文本为:

OpenCV错误:断言失败(dims <= 2 && data && (unsigned)i0 < (unsigned)size.p [0] && (unsigned)(i1 * DataType<_Tp> :: channels) < (unsigned)(size.p [1] * channels()) && ((((sizeof(size_t)<<28)|0x8442211) >> ((DataType<_Tp>::depth) & ((1 << 3 ) - 1))*4) & 15) == elemSize1()),位置未知,文件 c:\users\tim\document s\code\opencv\build\include\opencv2\core\mat.hpp,第537行

OpenCV版本为2.4.6,并且可执行文件动态链接到调试库。


2
我不是OpenCv专家,但也许你正在将矩阵元素定义为“unsigned char”,但是你正在请求一个“unsigned int”。mat.hpp第537行是什么? - ThomasMcLeod
谢谢回复。将模板参数更改为unsigned char会使程序什么都不输出(也没有异常)。 - Tim
Mat.hpp 的第533到539行是 template<typename _Tp> inline _Tp& Mat::at(int i0, int i1) { CV_DbgAssert( dims <= 2 && data && (unsigned)i0 < (unsigned)size.p[0] && (unsigned)(i1*DataType<_Tp>::channels) < (unsigned)(size.p[1]*channels()) && CV_ELEM_SIZE1(DataType<_Tp>::depth) == elemSize1()); return ((_Tp*)(data + step.p[0]*i0))[i1]; } - Tim
你能在那个断言上打一个断点,看看那个表达式的哪个子句是“false”吗? - ThomasMcLeod
不太确定如何做到这一点。Visual Studio会按顺序处理每个子句吗? - Tim
1个回答

6
  1. 异常发生的原因是您将图像定义为无符号字符数组,但在at<>函数中使用了无符号整数。 at<> 必须使用与矩阵相同的类型,即无符号字符。否则,它会抛出您看到的异常。

  2. 当您向cout函数提供无符号字符时,它会认为您正在尝试打印一个字符(char),而不是一个数字。如果您想查看其数值,请将其转换为int:

    cout << (int)image.at < unsigned char > (1,1) << "\n";


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