如何使用C++访问OpenCV 2.3中的各个像素?
对于我的U8C3图像,我试过这个:
Scalar col = I.at<Scalar>(i, j);
Run Code Online (Sandbox Code Playgroud)
和
p = I.ptr<uchar>(i);
Run Code Online (Sandbox Code Playgroud)
首先是抛出异常,第二个是返回一些不相关的数据.我能够找到的所有示例都是针对C版OpenCV的旧IIPimage(?).
我只需要在给定坐标处获得像素的颜色.
您调用的类型cv::Mat::at需要匹配单个像素的类型.由于cv::Scalar基本上是a cv::Vec<double,4>,这对U8C3图像不起作用F64C4(当然,它适用于图像).
在你的情况下,你需要一个cv::Vec3b,这是typedef为cv::Vec<uchar,3>:
Vec3b col = I.at<Vec3b>(i, j);
Run Code Online (Sandbox Code Playgroud)
然后,您可以将其转换为a,cv::Scalar如果您确实需要,但cv::Mat::at实例化的类型必须与图像的类型匹配,因为它只是转换图像数据而不进行任何转换.
您的第二个代码段返回指向图像第i行的指针.它不是无关的数据,而只是指向单个uchar值的指针.因此,在U8C3图像的情况下,返回的数据中的每个连续的3个元素p应该代表一个像素.再次,将每个像素作为单个元素使用
Vec3b *p = I.ptr<Vec3b>(i);
Run Code Online (Sandbox Code Playgroud)
在返回之前,它再次只执行行指针的适当强制转换.
编辑:如果要对图像进行多次像素访问,还可以使用cv::Mat_便捷类型.这只不过是图像数据周围的类型化薄包装器,因此所有对图像像素的访问都是适当的类型:
Mat_<Vec3b> &U = reinterpret_cast<Mat_<Vec3b>&>(I);
Run Code Online (Sandbox Code Playgroud)
然后你可以自由地使用U(i, j)并且总是得到一个3元组的无符号字符,因此像素,再次没有任何复制,只需输入类型转换(因此具有相同的性能I.at<Vec3b>(i, j)).
| 归档时间: |
|
| 查看次数: |
13729 次 |
| 最近记录: |