无法访问从 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<int>
断言失败,您只需要按照上述答案解释的方式访问每个通道中的强度。
【讨论】:
我不想使用cv::Split函数,因为我需要获取灰度图。如果拆分它,那么我需要手动转换成灰度图像。我认为最好将 OpenCV 函数用于此类工作。而且,我也尝试了 imread("Photo.jpg",0),但同样的问题仍然发生。你能帮我解决这个问题吗??? 我用的是0pencv2.2,是这个问题的原因吗?【参考方案2】:您正在尝试加载 3 通道图像,如果您更改为此 Mat iplimage = imread("Photo.jpg",0); //输入
【讨论】:
如果我将图像加载为灰度图像,情况是一样的。我也无法通过 Mat.at 访问。【参考方案3】:我找到了解决方案。这是因为我用过:
inputImage.at<int>(i,j)
或 inputImage.at<float>(1,2)
而不是(int)inputImage.at<uchar>(1,2)
或(float)inputImage.at<uchar>(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 值的主要内容,如果未能解决你的问题,请参考以下文章