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)值 - 为什么我们要查看矩阵的不同成员?矩阵的一行是否代表单个像素?我以为矩阵的一行代表了图像的相应行。换句话说,为什么这有效?
答案 0 :(得分:1)
ptr<T>
是一个模板函数,当它被解释为T
的数组时返回指向行开头的指针。
因此,ptr<uchar>(row)
是指向行号uchar
的第一个row
的指针。
p
不是指向行或第一个像素的指针,而是指向行上第一个像素的第一个组件的指针。
由于图像是BGR图像,因此第一个像素的蓝色分量为p[0]
,绿色为p[1]
,红色为p[2]
。
第二个像素的蓝色为p[3+0]
,绿色为p[3+1]
,红色为p[3+2]
。
等等。
如果这是不可理解的,你可以在附近的C ++书中阅读有关数组和指针的更多信息。