gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:22:28 24 4
gpt4 key购买 nike

如何使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com