2012-05-05 166 views
0

我正在使用cv :: imread来加载图像并使用该图像执行一些处理,但我不知道为什么我无法读取返回的Mat的值来自imread函数。 我用Mat.at方法:无法访问从OpenCV函数返回的Mat的值

Mat iplimage = imread("Photo.jpg",1); //input 
    for(int i=0;i<iplimage.rows;i++){ 
     for(int j=0;j<iplimage.cols;j++){ 
      cout<<(int)iplimage.at<int>(i,j)<<" "; 
     } 
     cout<<endl; 
    } 

但它出现了一个错误:

OpenCV Error: Assertion failed (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()) is unknown function, file: "c:\opencv2.2\include\opencv2\core\mat.hpp", line 517

但是,如果使用直接访问方式,它是确定的:

Mat iplimage = imread("Photo.jpg",1); //input 
    for(int i=0;i<iplimage.rows;i++){ 
     for(int j=0;j<iplimage.cols;j++){ 
     cout<<(int)iplimage.data[i*iplimage.cols + j]<<" ";     
     } 
    cout<<endl; 
    } 

谁能告诉我如何使用Mat.at方法访问上面的Mat? 感谢您的帮助!

回答

0

看到这个answer。在你的情况下,返回的Mat是3维的,因此iplimage.at<int>未能断言,你只需要像上述答案所解释的那样访问每个通道的强度。

+0

我不想用CV ::拆分功能,因为我需要获得灰度图像。如果拆分它,那么我需要手动转换成灰色图像。我认为如果我使用OpenCV函数进行这类工作,效果会更好。而且,我也试图与imread(“Photo.jpg”,0),但同样的问题依然发生。你能帮我解决这个问题??? –

+0

我正在使用0pencv2.2,问题的原因是什么? –

0

你正在试图与图像的3个信道来加载,如果你改变该垫的IplImage = imread(“Photo.jpg”,0)会被罚款; //输入

+0

如果我将图像作为灰度图像加载,情况相同。我也无法通过Mat.at访问。 –

0

我找到了解决方案。这是因为我用: inputImage.at<int>(i,j)inputImage.at<float>(1,2) 代替,(int)inputImage.at<uchar>(1,2)(float)inputImage.at<uchar>(1,2) 对不起,我不小心!