在 OpenCV (Java) 中获取正确的 HSV 颜色 inRange
Posted
技术标签:
【中文标题】在 OpenCV (Java) 中获取正确的 HSV 颜色 inRange【英文标题】:Get right HSV color inRange in OpenCV (Java) 【发布时间】:2016-06-01 13:28:23 【问题描述】:我有以下图像,使用某些 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);
在这之后,我希望有一个图像,我可以用它来获得不同的颜色。事实上我得到了这个:
在这张图片中,颜色几乎被破坏了......红色和浅绿色看起来一样,其他颜色也完全不同。
现在我的问题是: 我有什么问题吗?是否可以区分乐高积木的颜色?我能做些什么来实现这一目标?我正在为 Java 使用 OpenCV 3.1.0。
非常感谢, 丹尼斯
【问题讨论】:
看看here @Miki 谢谢,但这对我不起作用。例如:我试着变蓝。答案是“蓝色是 120 +- 15 灵敏度”。但是在 HSV 图像中,没有蓝色(在 RGB 图片中有 2 个蓝砖)。我的问题是,HSV 转换会破坏所有颜色,我无法获得正确的颜色……例如,在紫罗兰色板和右侧(黑色)区域中可以找到蓝色。 【参考方案1】:我发现了自己的错误,我并不为此感到自豪。这是一个简单的错字。通过解决这个问题并在@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 并为 inRange() 拍摄 RGB 图片。
谢谢
【讨论】:
你能给出 lowerBlue 和 upperBlue 的 Scaler 值吗?以上是关于在 OpenCV (Java) 中获取正确的 HSV 颜色 inRange的主要内容,如果未能解决你的问题,请参考以下文章