1#!/usr/bin/env python
2
3'''
4This program illustrates the use of findContours and drawContours.
5The original image is put up along with the image of drawn contours.
6
7Usage:
8    contours.py
9A trackbar is put up which controls the contour level from -3 to 3
10'''
11
12import numpy as np
13import cv2
14
15def 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
43if __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