【问题标题】:OpenCV accessing the colour value of a pixelOpenCV 访问像素的颜色值
【发布时间】: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++;
 }
}

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

我的困惑在于:

  1. 如果.ptr代表指向矩阵行首的指针,那如何封装在p变量中?
  2. 如果我们访问像素的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); 之类的操作,更“用户友好”

标签: c++ opencv image-processing matrix


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

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

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

【讨论】:

  • 这太棒了——正是我所需要的。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2011-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多