【问题标题】:OpenCV & Python -- Can't detect blue objectsOpenCV 和 Python - 无法检测到蓝色物体
【发布时间】:2013-07-26 09:53:31
【问题描述】:

我在看这个问题:

How to detect blue color object using opencv

但经过多次尝试和错误,我仍然无法弄清楚如何检测蓝色物体。

这是我的代码:

import cv2
import numpy as np

cam=cv2.VideoCapture(0)
n=0

while True:
    print n
    returnVal,frame=cam.read()

    img=cv2.GaussianBlur(frame, (5,5), 0)
    img=cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

    blue_lower=np.array([150,150,0],np.uint8)
    blue_upper=np.array([180,255,255],np.uint8)
    blue=cv2.inRange(img,blue_lower,blue_upper)

    cv2.imshow('img',blue)

    n=n+1
    key = cv2.waitKey(10) % 0x100
    if key == 27: break #ESC 

我可以通过设置以下几行来检测红色物体:

red_lower=np.array([0,150,0],np.uint8)
red_upper=np.array([10,255,255],np.uint8)

当我使用第一个代码将一张蓝色纸放在我的网络摄像头前时,它只是显示为黑色。

有人可以帮我将蓝色的 RGB 转换为 HSV 吗?

非常感谢,

【问题讨论】:

  • 也许你的蓝纸色相更小或饱和度更低。您是否尝试过增大 h=150 和 s = 150 以下的范围?
  • @w.m 与直觉相反,以下值似乎有效:blue_lower=np.array([100,150,0],np.uint8)blue_upper=np.array([120,255,255],np.uint8)。为什么蓝色不在150到180之间???
  • 我一直在玩弄你的代码,它似乎没有按照你认为的方式存储颜色值(或者我认为它会如何......)
  • 我会说它几乎肯定与反转的 RGB 字节有关......如果你交换 R&B,它相当于反转色调空间。

标签: python opencv image-processing


【解决方案1】:

蓝色在HSV 中以 360 度中大约 240 度的色调表示。OpenCV-HSV 中的色调范围是 0-180,以将值存储在 8 位中。因此,蓝色在 OpenCV-HSV 中表示为 240 / 2 = 120 附近的 H 值。

要正确检测蓝色,可以选择以下值:

blue_lower=np.array([100,150,0],np.uint8)
blue_upper=np.array([140,255,255],np.uint8)

【讨论】:

  • 非常感谢 - 拯救了这一天!
【解决方案2】:

您的颜色模型由以下行设置:

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

要使用色相、饱和度和数值,而不是 OpenCV 默认使用的默认蓝色、绿色、红色。看看颜色模型是如何工作的here

【讨论】:

    【解决方案3】:

    要获得“你的”蓝色调涉及大量的试验和错误。这就是为什么我做了这个小程序来获取这些值。把它想象成你想要显示的范围的颜色选择器。

    将此例程视为与此主题的所有其他响应的协作,以创建一个允许对您的颜色选择过程进行一些自定义的工具

    import cv2
    import numpy as np
    
    cap = cv2.VideoCapture(1, cv2.CAP_DSHOW)
    cap.set(3,1280)
    cap.set(4,1024)
         
    
    cv2.namedWindow("Hsv Capture")
    
    # create trackbars for color change
    # IMPORTANT: You have to define the correct HSV opencv range hence 179,255,255
    cv2.createTrackbar('H', 'Hsv Capture', 0, 179, nothing)
    cv2.createTrackbar('S', 'Hsv Capture', 0, 255, nothing)
    cv2.createTrackbar('V', 'Hsv Capture', 0, 255, nothing)
    
    cv2.createTrackbar('H1', 'Hsv Capture', 0, 179, nothing)
    cv2.createTrackbar('S1', 'Hsv Capture', 0, 255, nothing)
    cv2.createTrackbar('V1', 'Hsv Capture', 0, 255, nothing)
    
    while(True):
    
        ret, frame = cap.read()
        frame = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    
        # Trackbars realtime position
        h1 = cv2.getTrackbarPos('H', 'Hsv Capture')
        s1 = cv2.getTrackbarPos('S', 'Hsv Capture')
        v1 = cv2.getTrackbarPos('V', 'Hsv Capture')
    
        h2 = cv2.getTrackbarPos('H1', 'Hsv Capture')
        s2 = cv2.getTrackbarPos('S1', 'Hsv Capture')
        v2 = cv2.getTrackbarPos('V1', 'Hsv Capture')
    
        #How to store the min and max values from the trackbars
        blue_MIN = np.array([h1, s1, v1], np.uint8)
        blue_MAX = np.array([h2, s2, v2], np.uint8)
    
        #After finding your values, you can replace them like this
        #blue_MIN = np.array([102, 73, 145], np.uint8)
        #blue_MAX = np.array([123, 182, 242], np.uint8)
                
        #Using inRange to find the desired range
        hsvCapture = cv2.inRange(frame,  blue_MIN, blue_MAX)
    
        cv2.imshow('Hsv Capture', hsvCapture)
        
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    
    cap.release()
    cv2.destroyAllWindows()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-06
      • 1970-01-01
      • 1970-01-01
      • 2022-10-26
      • 1970-01-01
      相关资源
      最近更新 更多