2011-11-15 70 views
6

如何使用C++访问OpenCV 2.3中的单个像素?
对于我U8C3像我尝试这样做:访问像素值OpenCV 2.3 - C++

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

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

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

我需要的只是在给定的坐标下获取像素的颜色。

回答

9

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

在你的情况,你需要一个cv::Vec3b,这是一个typedefcv::Vec<uchar,3>

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

然后,您可以转换成cv::Scalar这一点,如果你真的需要,但cv::Mat::at实例的类型必须匹配类型的图像,因为它只是投射图像数据而没有任何转换。

你的第二个代码片段返回一个指向图像第i行的指针。这不是无关的数据,而只是一个指向单个值的指针。因此,如果是U8C3图像,则返回到p的数据中的每个连续3个元素应代表一个像素。同样,要将每个像素作为一个单独的元素使用,在返回它之前,它只不过是对行指针进行适当的转换而已,只不过是做了其他任何事情。

编辑:如果要在图像上进行多次像素访问,还可以使用cv::Mat_便捷类型。这无非是图像数据围绕一个类型的瘦包装更多,让所有访问图像像素适当类型:

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

然后,您可以自由使用U(i, j),一定可以得到的无符号字符的3元组,因此像素,再次没有任何复制,只需键入强制转换(因此性能与I.at<Vec3b>(i, j)相同)。

+0

感谢您的快速响应。我真的很困惑与多个渠道,他们如何存储。 – jnovacho