0

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

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 错误:断言失败 ( 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:\opencv2.2\include\opencv2\core\mat.hpp”,第 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?谢谢你的帮助!

4

4 回答 4

0

您正在尝试加载 3 通道图像,如果您更改为此 Mat iplimage = imread("Photo.jpg",0); //输入

于 2012-05-05T19:52:38.830 回答
0

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

于 2012-05-07T04:21:30.937 回答
0

看到这个答案。在您的情况下,返回的 Mat 是 3 维iplimage.at<int>的,因此断言失败,您只需要像提到的答案解释的方式那样访问每个通道中的强度。

于 2012-05-05T17:16:54.403 回答
0

Mat iplimage = imread("Photo.jpg",1) 读取 3 通道彩色图像。您可以使用 Mat iplimage = imread("Photo.jpg",0) 以灰度形式读取图像,以便您的 iplimage.at(i,j) 可以工作。请注意,如果您的图像是 8 位而不是 .at,则应使用 .at。

如果您的图像不是 8 位,则应使用 iplimage = imread("Photo.jpg",CV_LOAD_IMAGE_ANYDEPTH)

于 2020-01-23T10:15:02.370 回答