如何使用C++访问OpenCV 2.3中的单个像素?
对于我的U8C3镜像,我尝试这样做:
Scalar col = I.at<Scalar>(i, j);和
p = I.ptr<uchar>(i);第一个是抛出异常,第二个是返回一些不相关的数据。此外,我所能找到的所有示例都是针对旧的IIPimage(?)用于C版本的OpenCV。
我所需要的就是得到给定坐标下像素的颜色。
发布于 2011-11-15 23:57:33
调用cv::Mat::at时使用的类型需要与单个像素的类型相匹配。因为cv::Scalar基本上是一个cv::Vec<double,4>,所以它不适用于U8C3镜像(当然,它适用于F64C4镜像)。
在本例中,您需要一个cv::Vec3b,它是用于cv::Vec<uchar,3>的typedef
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)相同的性能)。
https://stackoverflow.com/questions/8139098
复制相似问题