OpenCV Android绿色颜色检测

7

目前我正在制作一个应用程序,用户将检测绿色颜色。我使用这张照片进行测试:enter image description here

我的问题是我无法检测到任何绿色像素。之前我使用蓝色,一切正常。现在我尝试了不同的RGB组合,但仍然无法检测到任何东西。我想知道是绿色有问题还是我的检测范围有问题,所以我用(0, 255, 0)在画图中制作了一张图片,并且它可以工作。为什么它不能看到这个圆?我使用以下代码进行检测:

Core.inRange(hsv_image, new Scalar([I change this value]), new Scalar(60, 255, 255), ultimate_blue);

可能是我设置了错误的范围,但我使用Photoshop获取其中一个绿色像素的颜色,并将其RGB值转换为HSV。然而它不起作用。它甚至不能检测到我采样的像素。有什么问题吗?提前感谢。
使用Miki的答案:

enter image description here


请查看这里 - Miki
我认为我使用了HSV。我使用http://colorizer.org/来查找RGB的对应HSV,然后进行转换,以便在OpenCV中使用。 - Oleksandr Firsov
我更新了答案,你需要使用一个较低的V下限,因为你的原始图像非常暗(即低V)。请查看结果。 - Miki
https://dev59.com/7FYN5IYBdhLWcg3wZ3dm - Jeru Luke
1个回答

22

在HSV颜色空间中,绿色的H值为120,范围为[0,360]。 OpenCV将H值减半以适应范围[0,255],因此H值的范围变为[0,180],S和V仍然在[0,255]的范围内。 因此绿色的H值为60 = 120 / 2。 上限和下限应该是:

// sensitivity is a int, typically set to 15 - 20 
[60 - sensitivity, 100, 100]
[60 + sensitivity, 255, 255]

更新

由于您的图像颜色较暗,因此需要使用 V 的较低下限。使用以下数值:

sensitivity = 15;
[60 - sensitivity, 100, 50]  // lower bound
[60 + sensitivity, 255, 255] // upper bound

产生的遮罩将会是这样的:

在此输入图片描述

您可以参考这个答案了解详情。


我使用了您的值,并将灵敏度设置为60。我上传了我得到的图像。较浅的像素是我检测到的像素。 - Oleksandr Firsov
哇!太感谢了。你都不知道这个答案有多有用。当我努力去检测蓝色圆圈时,我使用了多达10个inRange函数来过滤足够的像素以便检测颜色。而你只用一个函数就搞定了。我感觉好傻啊。 - Oleksandr Firsov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接