访问像素值OpenCV 2.3 - C ++

时间:2011-11-15 15:50:50

标签: c++ opencv

如何使用C ++访问OpenCV 2.3中的各个像素? 对于我的U8C3图像,我尝试了这个:

Scalar col = I.at<Scalar>(i, j);

p = I.ptr<uchar>(i);

首先是抛出异常,第二个是返回一些不相关的数据。我能找到的所有例子都是针对C版OpenCV的旧IIPimage(?)。

我所需要的只是在给定坐标处获得像素的颜色。

1 个答案:

答案 0 :(得分:9)

您调用cv::Mat::at的类型需要匹配单个像素的类型。由于cv::Scalar基本上是cv::Vec<double,4>,因此对于U8C3图片不起作用(当然,它适用于F64C4图片。

在您的情况下,您需要cv::Vec3btypedefcv::Vec<uchar,3>

Vec3b col = I.at<Vec3b>(i, j);

如果确实需要,可以将其转换为cv::Scalar,但cv::Mat::at实例化的类型必须与图片类型匹配,因为它只是投射图像数据而不进行任何转换

您的第二个代码段返回指向图像第i行的指针。它不是无关的数据,只是指向单个uchar值的指针。因此,对于U8C3图像,返回到p的数据中的每个连续3个元素应代表一个像素。同样,要将每个像素作为单个元素使用

Vec3b *p = I.ptr<Vec3b>(i);

在返回之前再次执行行指针的适当强制转换。

编辑:如果您想对图片进行多次像素访问,您还可以使用cv::Mat_便利类型。这只不过是图像数据周围的类型化薄包装器,因此所有对图像像素的访问都是适当的类型:

Mat_<Vec3b> &U = reinterpret_cast<Mat_<Vec3b>&>(I);

然后你可以自由地使用U(i, j)并且总是得到一个3元组的无符号字符,因此像素再次没有任何复制,只需输入类型转换(因此与I.at<Vec3b>(i, j)具有相同的性能)。