【发布时间】: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);之类的操作,更“用户友好”
标签: c++ opencv image-processing matrix