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<Vec3b>(y, x);
之类的操作,更“用户友好”
【参考方案1】:
ptr<T>
是一个模板函数,当它被解释为T
s 的数组时,它返回指向行首的指针。
因此,ptr<uchar>(row)
是指向行号row
的第一个uchar
的指针。
p
不是指向行或第一个像素的指针,而是指向行上第一个像素的第一个组件的指针。
由于图像是 BGR 图像,因此第一个像素的蓝色分量为p[0]
,绿色为p[1]
,红色为p[2]
。
第二个像素的蓝色是p[3+0]
,绿色是p[3+1]
,红色是p[3+2]
。
以此类推。
如果这难以理解,您可以在附近的 C++ 书籍中阅读有关数组和指针的更多信息。
【讨论】:
这太棒了——正是我所需要的。非常感谢。以上是关于OpenCV 访问像素的颜色值的主要内容,如果未能解决你的问题,请参考以下文章