2017-10-09 300 views
-1

我正在研究一個程序,我應該檢測相同類型的形狀,並用不同顏色爲每種類型着色。openCV:使用findContours檢測圓圈

我使用cv2.findCountours,然後cv2.approxPolyDP來檢測每個形狀。

該程序檢測到任何具有8個邊緣的形狀爲圓形,因此我決定添加一些檢查 - 我使用cv2.contourArea檢查當前輪廓的區域,並且還檢查當前的cv2.minEnclosingCircle(cnt)的區域輪廓。

如果他們是平等的,我們有一個圓圈。

import numpy as np 
import cv2 

img = cv2.imread('1.jpg') 
gray = cv2.imread('1.jpg',0) 

ret,thresh = cv2.threshold(gray,127,255,1) 

contours,h = cv2.findContours(thresh,cv2.RETR_CCOMP,cv2.CHAIN_APPROX_NONE) 

for cnt in contours: 
    approx = cv2.approxPolyDP(cnt, .03 * cv2.arcLength(cnt, True), True) 
    print len(approx) 
    if len(approx)==3: 
     print "triangle" 
     cv2.drawContours(img,[cnt],0,(122,212,78),-1) 
    elif len(approx)==4: 
     print "square" 
     cv2.drawContours(img,[cnt],0,(94,234,255),-1) 
    elif len(approx)==8: 
     area = cv2.contourArea(cnt) 
     (cx, cy), radius = cv2.minEnclosingCircle(cnt) 
     circleArea = radius * radius * np.pi 
     print circleArea 
     print area 
     if circleArea == area: 
      cv2.drawContours(img, [cnt], 0, (220, 152, 91), -1) 


cv2.imshow('img',img) 
cv2.waitKey(0) 
cv2.destroyAllWindows() 

我印刷每個區域,看到的結果是不同的 - 即使當形狀顯然是一個圓。

例如,對於相同的形狀,minEnclosingCircle面積爲628.254637106,contourArea面積爲569。 另一個示例:minEnclosingCircle區域爲2220.55512328,contourArea爲2032.0。

如何正確計算此區域?

我會感謝任何幫助!檢測

和形狀:

我使用的圖像

+0

看看到[BLOB探測器(https://www.learnopencv.com/blob -detection-using-opencv-python-c /)它可以按面積,圓度,凸度過濾並正確選擇一個圓。 – api55

回答

2
+0

謝謝。我是python的新手,迄今爲止,這個解決方案對我來說還不清楚。有沒有更簡單的方法來檢測圈子? – VictoriaS

0

,而不是比較的地區,你應該檢查的凸計數器

elif len(approx)==8: 
     k=cv2.isContourConvex(approx) 
     if k: 
     #now you select a circle 
0

您可以嘗試使用屬於每個blob的一些屬性。偏心率,堅固性,緊湊性等特點可以幫助您區分形狀。

您可以在講座敬愛的鏈接的一些信息(但在C++)給你一些提示

https://github.com/mribrahim/Blob-Detection