如何使用C ++访问OpenCV 2.3中的各个像素? 对于我的U8C3图像,我尝试了这个:
Scalar col = I.at<Scalar>(i, j);
和
p = I.ptr<uchar>(i);
首先是抛出异常,第二个是返回一些不相关的数据。我能找到的所有例子都是针对C版OpenCV的旧IIPimage(?)。
我所需要的只是在给定坐标处获得像素的颜色。
答案 0 :(得分:9)
您调用cv::Mat::at
的类型需要匹配单个像素的类型。由于cv::Scalar
基本上是cv::Vec<double,4>
,因此对于U8C3
图片不起作用(当然,它适用于F64C4
图片。
在您的情况下,您需要cv::Vec3b
,typedef
为cv::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)
具有相同的性能)。