Home | History | Annotate | Download | only in python2
      1 #!/usr/bin/env python
      2 
      3 '''
      4 This program illustrates the use of findContours and drawContours.
      5 The original image is put up along with the image of drawn contours.
      6 
      7 Usage:
      8     contours.py
      9 A trackbar is put up which controls the contour level from -3 to 3
     10 '''
     11 
     12 import numpy as np
     13 import cv2
     14 
     15 def make_image():
     16     img = np.zeros((500, 500), np.uint8)
     17     black, white = 0, 255
     18     for i in xrange(6):
     19         dx = (i%2)*250 - 30
     20         dy = (i/2)*150
     21 
     22         if i == 0:
     23             for j in xrange(11):
     24                 angle = (j+5)*np.pi/21
     25                 c, s = np.cos(angle), np.sin(angle)
     26                 x1, y1 = np.int32([dx+100+j*10-80*c, dy+100-90*s])
     27                 x2, y2 = np.int32([dx+100+j*10-30*c, dy+100-30*s])
     28                 cv2.line(img, (x1, y1), (x2, y2), white)
     29 
     30         cv2.ellipse( img, (dx+150, dy+100), (100,70), 0, 0, 360, white, -1 )
     31         cv2.ellipse( img, (dx+115, dy+70), (30,20), 0, 0, 360, black, -1 )
     32         cv2.ellipse( img, (dx+185, dy+70), (30,20), 0, 0, 360, black, -1 )
     33         cv2.ellipse( img, (dx+115, dy+70), (15,15), 0, 0, 360, white, -1 )
     34         cv2.ellipse( img, (dx+185, dy+70), (15,15), 0, 0, 360, white, -1 )
     35         cv2.ellipse( img, (dx+115, dy+70), (5,5), 0, 0, 360, black, -1 )
     36         cv2.ellipse( img, (dx+185, dy+70), (5,5), 0, 0, 360, black, -1 )
     37         cv2.ellipse( img, (dx+150, dy+100), (10,5), 0, 0, 360, black, -1 )
     38         cv2.ellipse( img, (dx+150, dy+150), (40,10), 0, 0, 360, black, -1 )
     39         cv2.ellipse( img, (dx+27, dy+100), (20,35), 0, 0, 360, white, -1 )
     40         cv2.ellipse( img, (dx+273, dy+100), (20,35), 0, 0, 360, white, -1 )
     41     return img
     42 
     43 if __name__ == '__main__':
     44     print __doc__
     45 
     46     img = make_image()
     47     h, w = img.shape[:2]
     48 
     49     _, contours0, hierarchy = cv2.findContours( img.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
     50     contours = [cv2.approxPolyDP(cnt, 3, True) for cnt in contours0]
     51 
     52     def update(levels):
     53         vis = np.zeros((h, w, 3), np.uint8)
     54         levels = levels - 3
     55         cv2.drawContours( vis, contours, (-1, 3)[levels <= 0], (128,255,255),
     56             3, cv2.LINE_AA, hierarchy, abs(levels) )
     57         cv2.imshow('contours', vis)
     58     update(3)
     59     cv2.createTrackbar( "levels+3", "contours", 3, 7, update )
     60     cv2.imshow('image', img)
     61     0xFF & cv2.waitKey()
     62     cv2.destroyAllWindows()
     63