我想从图像中识别出独特的颜色。我用CvScalar loc = cvGet2D(img, i, j);
,
并检查位置是红色还是绿色我使用CvScalar red = CvScalar.RED;
。
但是,布尔值评估永远不会返回true,因为我的图像包含红色阴影。有没有办法修改CvScalar
以便忽略阴影,或者可能摆弄loc
变量?
答案 0 :(得分:0)
OpenCV以BGR格式存储图像,因此要获取绿色通道的值,您可以使用loc.val(1)
(第二个通道),然后获取可以使用的红色通道loc.val(2)
。这些将返回[0,255]范围内的数字。然后,您可以比较红色和绿色通道像素值,以查看像素是红色还是绿色。
然而,比循环每个像素更好(和更快)的方法是:
cvSplit
将图像拆分为单独的红色和绿色通道。cvCmp
比较红色和绿色通道,生成红色通道大于绿色通道的二进制图像。答案 1 :(得分:0)
因为红色通道中最轻微的位会破坏你的(二进制)问题:'它是否为绿色'? 你可以在这里使用某种“距离”获得更好的结果。
取每个'找到'和'所需'颜色的l2范数,如:
sqrt(r * r + b * b + g * g);
并对差异进行阈值处理(以确定它是否足够接近')可能会更好用