如何使用 C++ 访问 OpenCV 2.3 中的单个像素?
对于我的 U8C3 图像,我试过这个:
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 行的指针。它不是不相关的数据,只是指向单个 uchar
的指针。值。所以如果是 U8C3
图像,数据中每连续3个元素返回p
应该代表一个像素。同样,要将每个像素作为单个元素使用
Vec3b *p = I.ptr<Vec3b>(i);
这同样只是在返回行指针之前对其进行适当的转换。
编辑:如果您想对图像进行多次像素访问,您还可以使用 cv::Mat_
便利型。这只不过是图像数据的类型化薄包装,因此对图像像素的所有访问都是适当类型化的:
Mat_<Vec3b> &U = reinterpret_cast<Mat_<Vec3b>&>(I);
然后您可以自由使用 U(i, j)
并且总是得到一个三元组的无符号字符和像素,再次没有任何复制,只需键入强制转换(因此与 I.at<Vec3b>(i, j)
具有相同的性能)。
关于c++ - 访问像素值 OpenCV 2.3 - C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8139098/