2017-01-10 452 views
0

我有一些代碼檢測圓形形狀,但我無法理解它是如何工作的。OpenCV - 檢測圓形形狀

從這個代碼:

  1. 我怎樣才能找到圓的半徑和中心點?
  2. `cv2.approxPolyDP'用於檢測圓圈的行爲是什麼?

現在找到的輪廓在分段面具

contours, hierarchy = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) 

排序輪廓WRT輪廓矩形X

contours.sort(key = lambda x:cv2.boundingRect(x)[0]) 

for contour in contours: 
     approx = cv2.approxPolyDP(contour, 0.01*cv2.arcLength(contour,True), True) 
     if len(approx) > 8: 
      # Find the bounding rect of contour. 
      contour_bounding_rect = cv2.boundingRect(contour) 
      mid_point = contour_bounding_rect[0] + contour_bounding_rect[2]/2, contour_bounding_rect[1] + contour_bounding_rect[3]/2 
      print mid_point[1]/single_element_height, ", ", 

回答

1

查看文檔所以我想通了回答你的第一個問題:確定圖像在圈子的圓心和半徑。

最初我找到圖像中的所有輪廓。然後使用for loop,我發現中心半徑使用cv2.minEnclosingCircle爲圖像中的每個輪廓。我將它們印在控制檯屏幕上。

contours,hierarchy = cv2.findContours(thresh,2,1) 
print len(contours) 
cnt = contours 

for i in range (len(cnt)): 
    (x,y),radius = cv2.minEnclosingCircle(cnt[i]) 
    center = (int(x),int(y)) 
    radius = int(radius) 
    cv2.circle(img,center,radius,(0,255,0),2) 
    print 'Circle' + str(i) + ': Center =' + str(center) + 'Radius =' + str(radius) 

要回答你的第二個問題cv2.approxPolyDP();此函數根據名爲'epsilon'的參數在圖像中圍繞對象繪製近似輪廓。 'epsilon'的值越高,輪廓就大致近似。對於較低的值epsilon,輪廓幾乎會擦掉圖像中物體的每個邊緣。請訪問THIS PAGE以獲得更好的理解。

希望這有助於! :)

3

不要以爲approxPolyDP是正確的方式去這裏。

如果你有一個形象在你只有圈子,你想找到圓心和半徑,儘量minEnclosingCircle()

如果你有,你有各種形狀和你想找到圓的圖像,嘗試Hough變換(可能需要很長時間)或fitEllipse(),檢查它返回的邊界框是否爲方形。

兩個這些功能