如何使用C++访问OpenCV 2.3中的单个像素?
对于我U8C3像我尝试这样做:访问像素值OpenCV 2.3 - C++
Scalar col = I.at<Scalar>(i, j);
和
p = I.ptr<uchar>(i);
首先是抛出一个异常,第二个是将一些不相关的数据。我所能找到的所有例子都是针对C版OpenCV的旧IIPimage(?)。
我需要的只是在给定的坐标下获取像素的颜色。
如何使用C++访问OpenCV 2.3中的单个像素?
对于我U8C3像我尝试这样做:访问像素值OpenCV 2.3 - C++
Scalar col = I.at<Scalar>(i, j);
和
p = I.ptr<uchar>(i);
首先是抛出一个异常,第二个是将一些不相关的数据。我所能找到的所有例子都是针对C版OpenCV的旧IIPimage(?)。
我需要的只是在给定的坐标下获取像素的颜色。
您调用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行的指针。这不是无关的数据,而只是一个指向单个值的指针。因此,如果是U8C3
图像,则返回到p
的数据中的每个连续3个元素应代表一个像素。同样,要将每个像素作为一个单独的元素使用,在返回它之前,它只不过是对行指针进行适当的转换而已,只不过是做了其他任何事情。
编辑:如果要在图像上进行多次像素访问,还可以使用cv::Mat_
便捷类型。这无非是图像数据围绕一个类型的瘦包装更多,让所有访问图像像素适当类型:
Mat_<Vec3b> &U = reinterpret_cast<Mat_<Vec3b>&>(I);
然后,您可以自由使用U(i, j)
,一定可以得到的无符号字符的3元组,因此像素,再次没有任何复制,只需键入强制转换(因此性能与I.at<Vec3b>(i, j)
相同)。
感谢您的快速响应。我真的很困惑与多个渠道,他们如何存储。 – jnovacho