在javacv中使用cvScalar?

时间:2013-02-11 15:52:09

标签: eclipse javacv

我想从图像中识别出独特的颜色。我用CvScalar loc = cvGet2D(img, i, j);, 并检查位置是红色还是绿色我使用CvScalar red = CvScalar.RED;。 但是,布尔值评估永远不会返回true,因为我的图像包含红色阴影。有没有办法修改CvScalar以便忽略阴影,或者可能摆弄loc变量?

2 个答案:

答案 0 :(得分:0)

OpenCV以BGR格式存储图像,因此要获取绿色通道的值,您可以使用loc.val(1)(第二个通道),然后获取可以使用的红色通道loc.val(2)。这些将返回[0,255]范围内的数字。然后,您可以比较红色和绿色通道像素值,以查看像素是红色还是绿色。

然而,比循环每个像素更好(和更快)的方法是:

  1. 使用cvSplit将图像拆分为单独的红色和绿色通道。
  2. 使用cvCmp比较红色和绿色通道,生成红色通道大于绿色通道的二进制图像。

答案 1 :(得分:0)

因为红色通道中最轻微的位会破坏你的(二进制)问题:'它是否为绿色'? 你可以在这里使用某种“距离”获得更好的结果。

取每个'找到'和'所需'颜色的l2范数,如:

sqrt(r * r + b * b + g * g);

并对差异进行阈值处理(以确定它是否足够接近')可能会更好用