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