2017-06-20 224 views
3

我在Python 3中使用OpenCV來檢測白色字段上的白色/黑色球,並給出它的確切(x,y,半徑)和顏色。我使用函數cv2.Canny()和cv2.findContours()找到它,但問題是cv2.Canny()不總是檢測到圓的完整形狀(大部分時間只有3/4的圈)。 所以,當我使用cv2.findContours()它不檢測它作爲一個輪廓。跟蹤白色背景中的白色球(Python/OpenCV)

請參閱:

image 1image 2

這是最重要的代碼:

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 
blurred = cv2.GaussianBlur(gray, (5, 5), 0) 
edged = cv2.Canny(blurred, 10, 40) # 10 and 40 to be more perceptive 
contours_canny= cv2.findContours(edged.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)[-2] 

之後,我使用: approx = cv2.approxPolyDP(contour,0.01*cv2.arcLength(contour,True),True)

所以,如果你能幫助我找到一個很好的解決方案! 也許有一個函數完成圓的形狀,所以我可以檢測到它?

+0

你有沒有試過Hough圈? –

回答

2

我會建議你在使用canny檢測之前應用一些中間色濾鏡。這將確保canny邊緣檢測發生在球圖像和場之間明確的邊界上。

下面是一個使用trackbars讓你可以自定義顏色閾值的Python代碼:

cv2.namedWindow('temp') 
cv2.createTrackbar('bl', 'temp', 0, 255, nothing) 
cv2.createTrackbar('gl', 'temp', 0, 255, nothing) 
cv2.createTrackbar('rl', 'temp', 0, 255, nothing) 
cv2.createTrackbar('bh', 'temp', 255, 255, nothing) 
cv2.createTrackbar('gh', 'temp', 255, 255, nothing) 
cv2.createTrackbar('rh', 'temp', 255, 255, nothing) 

bl_temp=cv2.getTrackbarPos('bl', 'temp') 
gl_temp=cv2.getTrackbarPos('gl', 'temp') 
rl_temp=cv2.getTrackbarPos('rl', 'temp') 

bh_temp=cv2.getTrackbarPos('bh', 'temp') 
gh_temp=cv2.getTrackbarPos('gh', 'temp') 
rh_temp=cv2.getTrackbarPos('rh', 'temp') 
thresh=cv2.inRange(frame,(bl_temp,gl_temp,rl_temp),(bh_temp,gh_temp,rh_temp)) 
+0

非常感謝!現在更容易。 –

1

您可以使用cv.HoughCircles估計最佳匹配完整的圓。跟蹤球的好處在於,無論攝像機角度如何,球總是會在圖像中顯示爲圓形。