Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Drawing Bounding box around given size Area contour

I want to draw a bounding box around each closed contour of an area larger than some threshold, not just the biggest contour. How can I go about doing this? So far this is what I have tried:

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()      
like image 430
Mohamed Elfatih Avatar asked Apr 30 '14 22:04

Mohamed Elfatih


1 Answers

Remember, your indentation level matters in Python. It's also worth noting that your code doesn't necessarily draw a box around the largest contour, it draws a box around the last element of contours. Fortunately, the fix is simple. You just need to indent your calls to cv2.rectangle() and cv2.putText() so they evaluate on every loop iteration. You can also eliminate a call to cv2.boundingRect() by expanding rect into x,y,w,h. Your code would then be:

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()
like image 143
Aurelius Avatar answered Oct 23 '22 15:10

Aurelius