2014-04-30 18 views
6

Chcę narysować obwiednię wokół każdego zamkniętego konturu obszaru większego niż jakiś próg, a nie tylko największy kontur. Jak mogę to zrobić? Do tej pory to właśnie próbowałem:Rysowanie obwiedni wokół zadanego rozmiaru Kontur obszaru

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

Próbowałem naprawić formatowanie kodu, ale możesz edytować ponownie, jeśli znaczenie kodu uległo zmianie, ponieważ spacja ma znaczenie w Pythonie. – Aurelius

+1

Czy mógłbyś także opisać problem, którego doświadczasz? Jakie jest obecne zachowanie w porównaniu do tego, czego oczekujesz? Właśnie wypróbowałem twój kod (post-edit) i rysuje kontury wokół więcej niż jednego konturu. – Aurelius

+0

Cześć Aurelius, dziękuję za edycję, to faktycznie działa teraz, wcięcie było problemem., Jeśli chciałbyś głosów na głos, przepisuj jako odpowiedź i źle go głosuj. Dzięki –

Odpowiedz

6

Pamiętaj, że sprawy poziom wcięcia w Pythonie. Warto również zauważyć, że twój kod niekoniecznie musi narysować pole wokół największego konturu, rysuje pole wokół ostatniego elementu z contours. Na szczęście poprawka jest prosta. Trzeba tylko wcięcić swoje wywołania do cv2.rectangle() i cv2.putText(), aby mogły one ocenić w każdej iteracji pętli. Możesz także zlikwidować połączenie pod numer cv2.boundingRect(), rozwijając rect w x,y,w,h. Twój kod będzie wówczas:

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

Dzięki człowieku, trochę się nauczyłeś! –

Powiązane problemy