2014-04-30 129 views
6

我想提請各地超過某個閾值,而不僅僅是最大的輪廓大的區域的每個封閉輪廓邊框。我怎麼能這樣做呢? 到目前爲止,這是我曾嘗試:繪製邊界框圍繞給定大小區輪​​廓

contours, _ = cv2.findContours(thresh, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) 
for c in contours: 
    rect = cv2.boundingRect(c) 
    if rect[2] < 100 or rect[3] < 100: continue 
    print cv2.contourArea(c) 
x,y,w,h = cv2.boundingRect(c) 
cv2.rectangle(im,(x,y),(x+w,y+h),(0,255,0),2) 
cv2.putText(im,'Moth Detected',(x+w+10,y+h),0,0.3,(0,255,0)) 
cv2.imshow("Show",im) 
cv2.waitKey() 
cv2.destroyAllWindows()  
+1

我試着把你的代碼格式,但隨時如果代碼的含義已經改變了重新編輯,因爲在Python的空白問題。 – Aurelius

+1

你能否描述你遇到的問題?與你期望的相比,目前的行爲是什麼?我只是想你的代碼(編輯後),並且它吸引周圍有多個輪廓的輪廓。 – Aurelius

+0

嗨,Aurelius,感謝編輯,它現在實際上工作,縮進是問題,如果你想投票,重寫爲答案和不適當的投票。謝謝 –

回答

6

記住,在Python的縮進層次的問題。值得注意的是,你的代碼並不一定圍繞最大的輪廓繪製一個框,它圍繞contours的最後一個元素繪製一個框。幸運的是,修復很簡單。您只需將您的呼叫縮進到cv2.rectangle()cv2.putText(),以便他們評估每個循環迭代。您還可以通過將rect擴展爲x,y,w,h來消除對cv2.boundingRect()的呼叫。然後,您的代碼將是:

contours, _ = cv2.findContours(thresh, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) 
for c in contours: 
    rect = cv2.boundingRect(c) 
    if rect[2] < 100 or rect[3] < 100: continue 
    print cv2.contourArea(c) 
    x,y,w,h = rect 
    cv2.rectangle(im,(x,y),(x+w,y+h),(0,255,0),2) 
    cv2.putText(im,'Moth Detected',(x+w+10,y+h),0,0.3,(0,255,0)) 
cv2.imshow("Show",im) 
cv2.waitKey() 
cv2.destroyAllWindows() 
+0

感謝的人,學到了很多! –