在OpenCV(Java)中获取正确的HSV颜色范围

3
我有以下经过特定OpenCV函数预处理的图像: 不同颜色的乐高积木 现在我正在尝试获取每种颜色的积木数量(在这种情况下,每种颜色都是1)。这些是我拥有的所有颜色。
我的计划是循环遍历所有颜色,使用OpenCV函数"inRange"并获取区域大小。我的问题是如何识别不同的颜色。我尝试了红色,并且很难找到一个好的范围。在询问谷歌之后,我明白了我必须使用HSV颜色才能获得带有色调值的好范围。
所以我写了这段代码(用Java为某种原因):
Mat img; //img is given from previos code
Mat hsv = img.clone();
Imgproc.cvtColor(img, hsv, Imgproc.COLOR_BGR2HSV);

接下来我期望得到一张图片,从中可以获取不同的颜色,但实际上我得到了这样一张图片:

奇怪的HSV图像

在这张图片中,颜色几乎毁掉了......红色和浅绿色看起来一模一样,其他颜色也完全不同。

现在我的问题是: 我做错什么了吗?有可能区分乐高积木的颜色吗?我该怎么做才能实现呢?我正在使用Java的OpenCV 3.1.0版本。

非常感谢, Dennis


1
请看这里 - Miki
@Miki 谢谢,但这对我没用。例如:我试图得到蓝色。答案说“蓝色是120+-15的灵敏度”。但在HSV图像中,没有蓝色(在RGB图片中有2个蓝色砖块)。我的问题是,HSV转换破坏了所有颜色,我无法得到正确的颜色...例如,蓝色可以在紫色板和右侧(黑色)区域找到。 - Dentastic
1个回答

3
我发现了我的错误,但我并不为此感到自豪。那只是一个简单的错字。通过修正这个错误和 @Miki 的帮助,我能找到我需要的颜色。
我的错误是:
Mat img; //img is given from previos code
Mat hsv = img.clone();
Imgproc.cvtColor(img, hsv, Imgproc.COLOR_BGR2HSV);    
Core.inRange(img, lowerBlue, upperBlue, hsv); //img

替代

Mat img; //img is given from previos code
Mat hsv = img.clone();
Imgproc.cvtColor(img, hsv, Imgproc.COLOR_BGR2HSV);    
Core.inRange(hsv, lowerBlue, upperBlue, hsv); //hsv

事实上...我将图像转换为HSV,并将RGB图像用于inRange()函数。
谢谢

1
请问您能给出 lowerBlue 和 upperBlue 的 Scaler 值吗? - Shailendra2014

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