4

我在看这个问题:

如何使用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吗?

提前谢谢了,

4

3 回答 3

7

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

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

blue_lower=np.array([100,150,0],np.uint8)
blue_upper=np.array([140,255,255],np.uint8)
于 2013-07-26T10:35:50.633 回答
2

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

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

使用 Hue、Saturation 和 Value,而不是 OpenCV 默认使用的默认蓝色、绿色、红色。在此处查看颜色模型的工作原理。

于 2013-07-26T10:42:13.280 回答
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()
于 2020-09-28T16:38:58.213 回答