2017-03-16 345 views
0

我正在研究一個物體檢測和跟蹤系統,輸入是一個rgb網絡攝像頭流。我的代碼沒有問題來檢測黃色,綠色和藍色的幾何物體,如球,但是當談到紅球時,我正在挑戰一個問題。OpenCV + python紅球檢測和跟蹤

# converting the input stream into HSV color space 
hsv_conv_img = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) 

# because hue wraps up and to extract as many "red objects" as possible, I define lower and upper boundaries for brighter and for darker red shades 
bright_red_lower_bounds = (0, 100, 100) 
bright_red_upper_bounds = (10, 255, 255) 
bright_red_mask = cv2.inRange(hsv_conv_img, bright_red_lower_bounds, bright_red_upper_bounds) 

dark_red_lower_bounds = (160, 100, 100) 
dark_red_upper_bounds = (179, 255, 255) 
dark_red_mask = cv2.inRange(hsv_conv_img, dark_red_lower_bounds, dark_red_upper_bounds) 

# after masking the red shades out, I add the two images 
weighted_mask = cv2.addWeighted(bright_red_mask, 1.0, dark_red_mask, 1.0, 0.0) 

# then the result is blurred 
blurred_mask = cv2.GaussianBlur(weighted_mask,(9,9),3,3) 

# some morphological operations (closing) to remove small blobs 
erode_element = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3)) 
dilate_element = cv2.getStructuringElement(cv2.MORPH_RECT, (8, 8)) 
eroded_mask = cv2.erode(blurred_mask,erode_element) 
dilated_mask = cv2.dilate(eroded_mask,dilate_element) 

# on the color-masked, blurred and morphed image I apply the cv2.HoughCircles-method to detect circle-shaped objects 
detected_circles = cv2.HoughCircles(dilated_mask, cv2.HOUGH_GRADIENT, 1, 150, param1=100, param2=20, minRadius=20, maxRadius=200) 
if detected_circles is not None: 
    for circle in detected_circles[0, :]: 
     circled_orig = cv2.circle(frame, (circle[0], circle[1]), circle[2], (0,255,0),thickness=3) 
    cv2.imshow("original", circled_orig) 
else: 
    cv2.imshow("original", frame) 

問題:通過限定範圍廣泛的「紅色」,從HSV提取,我的手和我的臉(在鏡頭前站立時,保持球)的部分被提取了。 後來HoughCircles方法檢測到我手和臉上剩餘區域的小圓圈。

我玩了一些cv2.HoughCircles的參數(不太容易調整),例如,一個小的param2值會比一個更大的值檢測更多(錯誤)的圓圈。

有沒有人有一個想法如何克服這個問題,並消除錯誤檢測到的圈子?要求:系統對球的大小一無所知,它應該檢測很多。所以我無法定義最小或最大圓半徑以消除誤報。

非常感謝提前。 問候, 克里斯

PS:這段代碼是對this one

+1

提供圖像將有所幫助。 – m3h0w

回答

0

密切爲本因爲你的臉和手帶紅色區域是 - 我希望 - 遠遠超過球少齊,嘗試HSV之前模糊閾值。這應該軟化紅色區域,你不想檢測它們,並在球上,顏色應該保持大致相同。

編輯: 如果在評論中提供的例子是任何接近真實情況,它證明了模糊能夠解決您的問題。基本上你想要做的是創建多個軌道條並針對不同類型的模糊同時進行調整;形態學操作;和HSV閾值本身(因爲模糊可能會改變閾值的最佳值)。通過實時查看檢測到的區域來進行實驗,這將有助於您找出哪些有幫助,哪些不會。

正如我的教授曾經說過的:「如果我們的眼睛能看到,電腦就能看到它」。這裏就是這種情況 - 球的顏色與貝克漢姆的臉色非常不同。

+0

由於我不想發佈自己的照片,我創建了一個示例,它很好地顯示了什麼問題https://cruzercloud.feste-ip.net/index.php/s/aq0lQvOfywj82Ao 正如你所看到的這個球並不是很好看,而且這個球是一個「陰影」的部分。 臉部的中間部分被錯誤地識別爲一個圓圈。 在HSV閾值設置之前關於模糊圖片的提示可以提高一點,但仍然存在虛假識別的圓圈。 –

+0

請使用imgur或其他可信任的提供商。 – m3h0w

+0

http://imgur.com/a/k6x23 –