【问题标题】:What color space are the lower/upper arguments for cv2.inRange?cv2.inRange 的下/上参数是什么颜色空间?
【发布时间】:2021-03-10 15:08:50
【问题描述】:

我正在尝试为颜色范围创建蒙版。我知道在将图像传递给 inRange 之前,我需要将图像转换为 HSV。 inRange 的下两个参数是我们为其创建遮罩的颜色的下限值和上限值。

lower 和upper 在什么颜色空间中?

根据此处的答案,我已经看到了 HSV 和 BGR。该文档没有指出要使用的特定色彩空间。例如,这个答案 (How to define a threshold value to detect only green colour objects in an image :Opencv) 说值应该在 HSV 中,但传入看起来像 BGR 的值(例如 255)。 PS - 关于选择特定范围的工具/技巧的任何提示?我一直在使用 Google 的颜色选择器

【问题讨论】:

  • 为每个频道选择一个上限和下限。您可以呈现具有您喜欢的任何色彩空间的垫子。默认情况下,图像作为 BGR 加载。
  • 您放入 cv2.inRange() 的图像的图像色彩空间决定了您用于上下颜色的值的色彩空间。

标签: python opencv opencv-python


【解决方案1】:

cv2.inRange() 函数只检查if array elements lie between the elements of two other arrays.

因此,如果您的 src 数组的形状为 BGR 或 RGB 或 HSV,则您的上下边界应位于相同的色彩空间中。通常对于颜色分割,HSV 颜色空间更常用,但您也可以尝试其他颜色空间。

【讨论】:

    【解决方案2】:

    使用以下代码查找特定对象的 HSV 颜色值。并在 cv2.inRange 中设置这个 HSV 值的上下限。它是一个使用您的设备摄像头和轨迹栏的 opencv 程序,您可以找到 HSV 上限和下限:

    import cv2
    import numpy as np
    
    
    def nothing(x):
        pass
    
    
    cap = cv2.VideoCapture(0)
    cv2.namedWindow("Trackbars")
    
    cv2.createTrackbar("L - H", "Trackbars", 0, 255, nothing)
    cv2.createTrackbar("L - S", "Trackbars", 0, 255, nothing)
    cv2.createTrackbar("L - V", "Trackbars", 0, 255, nothing)
    cv2.createTrackbar("U - H", "Trackbars", 255, 255, nothing)
    cv2.createTrackbar("U - S", "Trackbars", 255, 255, nothing)
    cv2.createTrackbar("U - V", "Trackbars", 255, 255, nothing)
    
    while True:
        _, frame = cap.read()
        hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    
        l_h = cv2.getTrackbarPos("L - H", "Trackbars")
        l_s = cv2.getTrackbarPos("L - S", "Trackbars")
        l_v = cv2.getTrackbarPos("L - V", "Trackbars")
        u_h = cv2.getTrackbarPos("U - H", "Trackbars")
        u_s = cv2.getTrackbarPos("U - S", "Trackbars")
        u_v = cv2.getTrackbarPos("U - V", "Trackbars")
    
        lower_blue = np.array([l_h, l_s, l_v])
        upper_blue = np.array([u_h, u_s, u_v])
        mask = cv2.inRange(hsv, lower_blue, upper_blue)
        mask2 = cv2.cvtColor(mask, cv2.COLOR_GRAY2BGR)
        result = cv2.bitwise_and(frame, frame, mask=mask)
    
        cv2.imshow("frame", frame)
        cv2.imshow("mask", mask)
        cv2.imshow("result", result)
    
        key = cv2.waitKey(1)
        if key == 27:
            break
    
    cap.release()
    cv2.destroyAllWindows() 
    

    输出: 对于我的对象红色 HSV 上限值-[193,188,186],下限值-[135,127,95]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-19
      • 1970-01-01
      • 2018-04-17
      • 2018-06-15
      • 2021-04-07
      • 2019-06-01
      相关资源
      最近更新 更多