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

标签 c++ opencv

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

相关文章:

c++ - 运行代码时opencv_world 331.dll访问冲突

c++ - 如何在 MFC 对话框中保持控件的 Z 顺序?

c++ - Qt Creator编译错误 "::swprintf and::vswprintf has not been declared"

c++ - 使用 Qt 和 Boost 为应用程序编译 CppUTest 测试时的奇怪行为

java - System.loadLibrary() 错误 - 无法指定相对或绝对路径

opencv - 计算没有点对应的基本矩阵?

c++ - Equirectangular 到 Cubic 与点对点映射?

python - 如何使用 opencv/skimage 在 python 上找到图案的中心及其周围颜色的分布?

c++ - 一个用启动指针 START 计算列表中奇数元素的函数

c++ - 如何将内存地址存储为整数?