OpenCV& Python - 无法检测蓝色对象

时间:2013-07-26 09:53:31

标签: python opencv image-processing

我在看这个问题:

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吗?

非常感谢,

3 个答案:

答案 0 :(得分:4)

蓝色在HSV中以360度左右的色调表示.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)

答案 1 :(得分:2)

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

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

使用Hue,Saturation和Value,而不是OpenCV默认使用的默认蓝色,绿色,红色。了解颜色模型的工作原理here

答案 2 :(得分:0)

获取“您的”蓝色调涉及很多反复试验。这就是为什么我做了这个小小的例行程序来获取这些值。将其视为要显示的范围的颜色选择器。

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

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()