首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >访问像素值OpenCV 2.3 - C++

访问像素值OpenCV 2.3 - C++
EN

Stack Overflow用户
提问于 2011-11-15 23:50:50
回答 1查看 14K关注 0票数 7

如何使用C++访问OpenCV 2.3中的单个像素?

对于我的U8C3镜像,我尝试这样做:

代码语言:javascript
复制
Scalar col = I.at<Scalar>(i, j);

代码语言:javascript
复制
p = I.ptr<uchar>(i);

第一个是抛出异常,第二个是返回一些不相关的数据。此外,我所能找到的所有示例都是针对旧的IIPimage(?)用于C版本的OpenCV。

我所需要的就是得到给定坐标下像素的颜色。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-11-15 23:57:33

调用cv::Mat::at时使用的类型需要与单个像素的类型相匹配。因为cv::Scalar基本上是一个cv::Vec<double,4>,所以它不适用于U8C3镜像(当然,它适用于F64C4镜像)。

在本例中,您需要一个cv::Vec3b,它是用于cv::Vec<uchar,3>typedef

代码语言:javascript
复制
Vec3b col = I.at<Vec3b>(i, j);

如果确实需要,可以将其转换为cv::Scalar,但cv::Mat::at实例化的类型必须与图像的类型匹配,因为它只强制转换图像数据,而不进行任何转换。

您的第二个代码片段返回指向图像第i行的指针。它不是无关的数据,而只是指向单个uchar值的指针。因此,在U8C3图像的情况下,返回给p的数据中每连续3个元素应该表示一个像素。同样,要将每个像素作为单个元素获取,请使用

代码语言:javascript
复制
Vec3b *p = I.ptr<Vec3b>(i);

它再一次只是在返回行指针之前对它进行适当的强制转换。

编辑:如果你想在图像上进行很多像素访问,你也可以使用方便的cv::Mat_类型。这只不过是一个围绕图像数据的类型化的薄包装器,以便对图像像素的所有访问都被适当地类型化:

代码语言:javascript
复制
Mat_<Vec3b> &U = reinterpret_cast<Mat_<Vec3b>&>(I);

然后,您可以自由地使用U(i, j),并始终获得无符号字符的3元组,因此无需任何复制,只需类型转换(因此具有与I.at<Vec3b>(i, j)相同的性能)。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8139098

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档