我正在研究一個程序,我應該檢測相同類型的形狀,並用不同顏色爲每種類型着色。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。
如何正確計算此區域?
我會感謝任何幫助!檢測
和形狀:
我使用的圖像
看看到[BLOB探測器(https://www.learnopencv.com/blob -detection-using-opencv-python-c /)它可以按面積,圓度,凸度過濾並正確選擇一個圓。 – api55