2016-08-10 109 views
1

我正試圖從正在從攝像頭拍攝的視頻中檢測紅色。下面給出的下面的代碼的例子是從OpenCV Documentation. 採取下面的代碼中給出:如何檢測OpenCV Python中的紅色?

import cv2 
import numpy as np 

cap = cv2.VideoCapture(0) 

while(1): 

    # Take each frame 
    _, frame = cap.read() 

    # Convert BGR to HSV 
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) 

    # define range of blue color in HSV 
    lower_blue = np.array([110,50,50]) 
    upper_blue = np.array([130,255,255]) 

    # Threshold the HSV image to get only blue colors 
    mask = cv2.inRange(hsv, lower_blue, upper_blue) 

    # Bitwise-AND mask and original image 
    res = cv2.bitwise_and(frame,frame, mask= mask) 

    cv2.imshow('frame',frame) 
    cv2.imshow('mask',mask) 
    cv2.imshow('res',res) 
    k = cv2.waitKey(5) & 0xFF 
    if k == 27: 
     break 

cv2.destroyAllWindows() 

lower_blue = np.array([110,50,50])具有較低的範圍藍HSV值與所述線upper_blue = np.array([130,255,255])具有較高的範圍藍HSV值。我在網上查找了紅色的上限值和下限值,但是我找不到它。如果有人能夠說出OpenCV的Red的HSV值(OpenCV H值範圍從0到179),這將非常有幫助。 非常感謝您的幫助(提前)。

我也嘗試運行以下找到紅色的範圍,但我無法挑選適當的值也許。我試過的是這個(對於紅色):

>>> green = np.uint8([[[0,255,0 ]]]) 
>>> hsv_green = cv2.cvtColor(green,cv2.COLOR_BGR2HSV) 
>>> print hsv_green 
[[[ 60 255 255]]] 

這也取自OpenCV文檔。 請告訴我或幫我找到OpenCV的RED COLOR範圍。

+1

參見[這個問題](http://stackoverflow.com/questions/21737613/image-of-hsv- color-wheel-for-opencv) - 您可以在那裏使用色輪並將值(在0-360範圍內)分開以找出色調值(如接受的答案中所述)。你也可以看看[這個例子](https://solarianprogrammer.com/2015/05/08/detect-red-circles-image-using-opencv/)。簡單地回答你的問題,紅色是圍繞0和180值(因爲顏色「環繞」) –

+0

可能重複[OpenCV更好的檢測紅色?](http://stackoverflow.com/questions/32522989/opencv-更好的紅色檢測) – Miki

+0

我不太瞭解如何獲得S和V值。你能解釋一下嗎?非常感謝(提前)! @Miki – Omee

回答

2

運行紅色相同的代碼似乎工作:

>>> red = numpy.uint8([[[0,0,255]]]) 
>>> hsv_red = cv2.cvtColor(red,cv2.COLOR_BGR2HSV) 
>>> print(hsv_red) 
[[[ 0 255 255]]] 

然後你就可以嘗試出現微紅的顏色不同。要注意的是紅色範圍內包括略大於0和兩個數的數稍小於179(例如red = numpy.uint8([[[0,31,255]]])導致[[[ 4 255 255]]]red = numpy.uint8([[[31,0,255]]])導致[[[176 255 255]]]

+0

在[doc](http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_colorspaces/py_colorspaces.html#how-to-find-hsv-values-to-track )從上面鏈接的站點獲得,您可以將值插入短的「方程」中,以獲得該顏色的上限和下限。 「你分別把[H-10,100,100]和'[H + 10,255,255]作爲下限和上限。這會讓你的下界爲[0,100,100]',上界爲[10,255,255]'紅色,但你可以將這個'20'設置爲更好的範圍。 –

+0

非常感謝!它完美的工作! @StevenCorreia – Omee

0

這裏是一個程序,以確定需要通過選擇6個陣列參數的顏色。 (關於opencv的3.2工作)。 你選擇你的圖像或「色彩範圍巴雷」輸入圖像和你移動光標,看看哪些數組值是您需要隔離的顏色的! Color range program screen pic

這裏是代碼:(可以很容易地適應視頻輸入) image.jpg - >(您的圖片) color_bar.jpg - >(任何圖像你只想顯示一個窗口,嘗試任何事情)

import cv2 
import numpy as np 
from matplotlib import pyplot as plt 

def nothing(x): 
    pass 

def main(): 

    window_name='color range parameter' 
    cv2.namedWindow(window_name) 
    # Create a black image, a window 
    im = cv2.imread('image.jpg') 
    cb = cv2.imread('color_bar.jpg') 
    hsv = cv2.cvtColor(im,cv2.COLOR_BGR2HSV) 

    print ('lower_color = np.array([a1,a2,a3])') 
    print ('upper_color = np.array([b1,b2,b3])') 


    # create trackbars for color change 
    cv2.createTrackbar('a1',window_name,0,255,nothing) 
    cv2.createTrackbar('a2',window_name,0,255,nothing) 
    cv2.createTrackbar('a3',window_name,0,255,nothing) 

    cv2.createTrackbar('b1',window_name,150,255,nothing) 
    cv2.createTrackbar('b2',window_name,150,255,nothing) 
    cv2.createTrackbar('b3',window_name,150,255,nothing) 

    while(1): 
     a1 = cv2.getTrackbarPos('a1',window_name) 
     a2 = cv2.getTrackbarPos('a2',window_name) 
     a3 = cv2.getTrackbarPos('a3',window_name) 

     b1 = cv2.getTrackbarPos('b1',window_name) 
     b2 = cv2.getTrackbarPos('b2',window_name) 
     b3 = cv2.getTrackbarPos('b3',window_name) 

     # hsv hue sat value 
     lower_color = np.array([a1,a2,a3]) 
     upper_color = np.array([b1,b2,b3]) 
     mask = cv2.inRange(hsv, lower_color, upper_color) 
     res = cv2.bitwise_and(im, im, mask = mask) 

     cv2.imshow('mask',mask) 
     cv2.imshow('res',res) 
     cv2.imshow('im',im) 
     cv2.imshow(window_name,cb) 

     k = cv2.waitKey(1) & 0xFF 
     if k == 27:   # wait for ESC key to exit 
      break 
     elif k == ord('s'): # wait for 's' key to save and exit 
      cv2.imwrite('Img_screen_mask.jpg',mask) 
      cv2.imwrite('Img_screen_res.jpg',res) 
      break 


    cv2.destroyAllWindows() 


#Run Main 
if __name__ == "__main__" : 
    main()