OpenCV 访问像素的颜色值

Posted

技术标签:

【中文标题】OpenCV 访问像素的颜色值【英文标题】:OpenCV accessing the colour value of a pixel 【发布时间】:2017-08-10 07:11:30 【问题描述】:
p = img.ptr<uchar>(row);  

for (var i = 0; i < nColumns - 3; i+=3) 
 if(p[i] == b && p[i+1] == g && p[i+2] == r)
  count++;
 

上面的代码显然会遍历每一行并查看每个像素的值。然后在确认像素是某种颜色后,它会增加一个计数变量的值。

我的困惑在于:

    如果.ptr代表指向矩阵行首的指针,那如何封装在p变量中? 如果我们访问像素的b, g, r (r, g, b) 值 - 为什么我们要查看矩阵的不同成员?矩阵的一行是否代表一个像素?我认为矩阵的一行代表图像的相应行。

换句话说,为什么会这样?

【问题讨论】:

您的循环有一个错误:您将 i 增加 1 (i++) - 您应该将其增加 3。您当前的实现未正确检查颜色值。 @Freakyy 抱歉。不过,我还是不明白。你能回答我的问题吗? 有 3 个通道:rgb 这就是原因 @Asesh 正确的是,您获得了指向内部数据的原始指针。了解如何制作这些内部数据(灰度、rgb、bgr、rgba、bgra 等)是您的工作。还有其他获取像素的方法,例如您可以执行Vec3b intensity = img.at&lt;Vec3b&gt;(y, x); 之类的操作,更“用户友好” 【参考方案1】:

    ptr&lt;T&gt; 是一个模板函数,当它被解释为Ts 的数组时,它返回指向行首的指针。 因此,ptr&lt;uchar&gt;(row) 是指向行号row 的第一个uchar 的指针。

    p 不是指向行或第一个像素的指针,而是指向行上第一个像素的第一个组件的指针。 由于图像是 BGR 图像,因此第一个像素的蓝色分量为p[0],绿色为p[1],红色为p[2]。 第二个像素的蓝色是p[3+0],绿色是p[3+1],红色是p[3+2]。 以此类推。

如果这难以理解,您可以在附近的 C++ 书籍中阅读有关数组和指针的更多信息。

【讨论】:

这太棒了——正是我所需要的。非常感谢。

以上是关于OpenCV 访问像素的颜色值的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV:如何为每个像素填充具有每种 RGB 颜色值的 rgb 图像?

OpenCV学习笔记3基础:图像基本操作

OpenCV学习笔记3基础:图像基本操作

OpenCV学习笔记3基础:图像基本操作

OpenCV学习笔记3基础:图像基本操作

opencv如何读取多边形区域内的像素值?