无法访问从 OpenCV 函数返回的 Mat 值

Posted

技术标签:

【中文标题】无法访问从 OpenCV 函数返回的 Mat 值【英文标题】:cannot access values of Mat returned from OpenCV functions 【发布时间】:2012-05-05 04:50:22 【问题描述】:

我正在使用 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 ::channels) > ((DataType<_tp>::depth) & ((1

但是如果我使用直接访问的方式就可以了:

 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? 感谢您的帮助!

【问题讨论】:

【参考方案1】:

看到这个answer。在您的情况下,返回的 Mat 是 3 维的,因此 iplimage.at&lt;int&gt; 断言失败,您只需要按照上述答案解释的方式访问每个通道中的强度。

【讨论】:

我不想使用cv::Split函数,因为我需要获取灰度图。如果拆分它,那么我需要手动转换成灰度图像。我认为最好将 OpenCV 函数用于此类工作。而且,我也尝试了 imread("Photo.jpg",0),但同样的问题仍然发生。你能帮我解决这个问题吗??? 我用的是0pencv2.2,是这个问题的原因吗?【参考方案2】:

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

【讨论】:

如果我将图像加载为灰度图像,情况是一样的。我也无法通过 Mat.at 访问。【参考方案3】:

我找到了解决方案。这是因为我用过: inputImage.at&lt;int&gt;(i,j)inputImage.at&lt;float&gt;(1,2) 而不是(int)inputImage.at&lt;uchar&gt;(1,2)(float)inputImage.at&lt;uchar&gt;(1,2) 对不起,我的粗心!

【讨论】:

【参考方案4】:

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

如果你的图片不是8bit,你应该使用iplimage = imread("Photo.jpg",CV_LOAD_IMAGE_ANYDEPTH)

【讨论】:

以上是关于无法访问从 OpenCV 函数返回的 Mat 值的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV - 无法访问 Mat 中的所有像素

EasyAR 作为 OpenCV Mat 访问相机帧

我可以以任何方式从 OpenCV 对象取消引用中将数据分配给双重函数返回检索吗?

函数返回中的 OpenCV Mat 并使用 copyTo

Qt 信号槽 cv::Mat 无法读取内存访问冲突

无法使用 OpenCV.js 创建 Mat