使用 cv::inRange (OpenCV) 选择正确的 HSV 上下边界进行颜色检测

新手上路,请多包涵

我有一个咖啡罐的图像,我想找到它的橙色盖子位置。就这个图片.

gcolor2 实用程序显示盖子中心的 HSV 为 (22, 59, 100)。问题是如何选择极限颜色呢?我尝试了 min = (18, 40, 90) 和 max = (27, 255, 255),但结果出乎意料结果

这是 Python 代码:

 import cv

in_image = 'kaffee.png'
out_image = 'kaffee_out.png'
out_image_thr = 'kaffee_thr.png'

ORANGE_MIN = cv.Scalar(18, 40, 90)
ORANGE_MAX = cv.Scalar(27, 255, 255)
COLOR_MIN = ORANGE_MIN
COLOR_MAX = ORANGE_MAX

def test1():
    frame = cv.LoadImage(in_image)
    frameHSV = cv.CreateImage(cv.GetSize(frame), 8, 3)
    cv.CvtColor(frame, frameHSV, cv.CV_RGB2HSV)
    frame_threshed = cv.CreateImage(cv.GetSize(frameHSV), 8, 1)
    cv.InRangeS(frameHSV, COLOR_MIN, COLOR_MAX, frame_threshed)
    cv.SaveImage(out_image_thr, frame_threshed)

if __name__ == '__main__':
    test1()

原文由 Student FourK 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

问题 1: 不同的应用程序对 HSV 使用不同的尺度。例如 gimp 使用 H = 0-360, S = 0-100 and V = 0-100 。但是 OpenCV 使用 H: 0-179, S: 0-255, V: 0-255 。在这里,我在 gimp 中获得了 22 的色相值。所以我拿了一半,11,并为此定义了范围。即 (5,50,50) - (15,255,255)

问题 2: 另外,OpenCV 使用 BGR 格式,而不是 RGB。因此,更改将 RGB 转换为 HSV 的代码,如下所示:

 cv.CvtColor(frame, frameHSV, cv.CV_BGR2HSV)

现在运行它。我得到如下输出:

在此处输入图像描述

希望这就是你想要的。有一些错误检测,但它们很小,所以你可以选择最大的轮廓,即你的盖子。

编辑:

正如 Karl Philip 在他的评论中所说,添加新代码会很好。但是只有一行的变化。因此,我想添加在新的 cv2 模块中实现的相同代码,以便用户可以比较新的 cv2 模块的简单性和灵活性。

 import cv2
import numpy as np

img = cv2.imread('sof.jpg')

ORANGE_MIN = np.array([5, 50, 50],np.uint8)
ORANGE_MAX = np.array([15, 255, 255],np.uint8)

hsv_img = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)

frame_threshed = cv2.inRange(hsv_img, ORANGE_MIN, ORANGE_MAX)
cv2.imwrite('output2.jpg', frame_threshed)

它给出了与上面相同的结果。但是代码要简单得多。

原文由 Abid Rahman K 发布,翻译遵循 CC BY-SA 4.0 许可协议

好的,在 HSV 空间中找到颜色是一个古老但常见的问题。我做了一个 hsv-colormap 来快速查找特殊颜色。这里是:

在此处输入图像描述

x轴代表 Hue 在[0,180],y轴1代表 Saturation 在[0,255],y轴2代表 S = 255 ,同时保持 V = 255

要查找颜色,通常只需查找 HS 的范围,然后将 v 设置为范围 (20, 255)。

为了找到橙色,我们查找地图,找到最佳范围: H :[10, 25], S: [100, 255], and V: [20, 255] 。所以掩码是 cv2.inRange(hsv,(10, 100, 20), (25, 255, 255) )

然后我们使用找到的范围来寻找橙色,这是结果:

在此处输入图像描述


方法简单但常用:

 #!/usr/bin/python3
# 2018.01.21 20:46:41 CST
import cv2

img = cv2.imread("test.jpg")
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv,(10, 100, 20), (25, 255, 255) )
cv2.imshow("orange", mask);cv2.waitKey();cv2.destroyAllWindows()

相似答案:

  1. 如何定义阈值以仅检测图像中的绿色对象:Opencv

  2. 使用 InRangeS 为 OpenCV 阈值选择正确的 HSV 值

原文由 Stackoverflow 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题