在 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的主要内容,如果未能解决你的问题,请参考以下文章

java版 opencv 图像对比相似度怎么实现

Opencv和python获取文档正确的轮廓并在图像上绘制

JVM崩溃。如何获取错误日志或核心转储

“颜色量化”是 OpenCV 中颜色量化的正确名称吗?

JAVA 代码生成与 JWT 一起使用的 HS512 密钥

使用 OpenCV 和 Java 从 gif 帧中获取 Mats