contours.py 4.19 KB
Newer Older
wester committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
#! /usr/bin/env python

print "OpenCV Python version of contours"

# import the necessary things for OpenCV
import cv2.cv as cv

# some default constants
_SIZE = 500
_DEFAULT_LEVEL = 3

# definition of some colors
_red =  (0, 0, 255, 0);
_green =  (0, 255, 0, 0);
_white = cv.RealScalar (255)
_black = cv.RealScalar (0)

# the callback on the trackbar, to set the level of contours we want
# to display
def on_trackbar (position):

    # create the image for putting in it the founded contours
    contours_image = cv.CreateImage ( (_SIZE, _SIZE), 8, 3)

    # compute the real level of display, given the current position
    levels = position - 3

    # initialisation
    _contours = contours

    if levels <= 0:
        # zero or negative value
        # => get to the nearest face to make it look more funny
        _contours = contours.h_next().h_next().h_next()

    # first, clear the image where we will draw contours
    cv.SetZero (contours_image)

    # draw contours in red and green
    cv.DrawContours (contours_image, _contours,
                       _red, _green,
                       levels, 3, cv.CV_AA,
                        (0, 0))

    # finally, show the image
    cv.ShowImage ("contours", contours_image)
wester committed
47 48

if __name__ == '__main__':
wester committed
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136

    # create the image where we want to display results
    image = cv.CreateImage ( (_SIZE, _SIZE), 8, 1)

    # start with an empty image
    cv.SetZero (image)

    # draw the original picture
    for i in range (6):
        dx = (i % 2) * 250 - 30
        dy = (i / 2) * 150

        cv.Ellipse (image,
                       (dx + 150, dy + 100),
                       (100, 70),
                      0, 0, 360, _white, -1, 8, 0)
        cv.Ellipse (image,
                       (dx + 115, dy + 70),
                       (30, 20),
                      0, 0, 360, _black, -1, 8, 0)
        cv.Ellipse (image,
                       (dx + 185, dy + 70),
                       (30, 20),
                      0, 0, 360, _black, -1, 8, 0)
        cv.Ellipse (image,
                       (dx + 115, dy + 70),
                       (15, 15),
                      0, 0, 360, _white, -1, 8, 0)
        cv.Ellipse (image,
                       (dx + 185, dy + 70),
                       (15, 15),
                      0, 0, 360, _white, -1, 8, 0)
        cv.Ellipse (image,
                       (dx + 115, dy + 70),
                       (5, 5),
                      0, 0, 360, _black, -1, 8, 0)
        cv.Ellipse (image,
                       (dx + 185, dy + 70),
                       (5, 5),
                      0, 0, 360, _black, -1, 8, 0)
        cv.Ellipse (image,
                       (dx + 150, dy + 100),
                       (10, 5),
                      0, 0, 360, _black, -1, 8, 0)
        cv.Ellipse (image,
                       (dx + 150, dy + 150),
                       (40, 10),
                      0, 0, 360, _black, -1, 8, 0)
        cv.Ellipse (image,
                       (dx + 27, dy + 100),
                       (20, 35),
                      0, 0, 360, _white, -1, 8, 0)
        cv.Ellipse (image,
                       (dx + 273, dy + 100),
                       (20, 35),
                      0, 0, 360, _white, -1, 8, 0)

    # create window and display the original picture in it
    cv.NamedWindow ("image", 1)
    cv.ShowImage ("image", image)

    # create the storage area
    storage = cv.CreateMemStorage (0)

    # find the contours
    contours = cv.FindContours(image,
                               storage,
                               cv.CV_RETR_TREE,
                               cv.CV_CHAIN_APPROX_SIMPLE,
                               (0,0))

    # comment this out if you do not want approximation
    contours = cv.ApproxPoly (contours,
                                storage,
                                cv.CV_POLY_APPROX_DP, 3, 1)

    # create the window for the contours
    cv.NamedWindow ("contours", 1)

    # create the trackbar, to enable the change of the displayed level
    cv.CreateTrackbar ("levels+3", "contours", 3, 7, on_trackbar)

    # call one time the callback, so we will have the 1st display done
    on_trackbar (_DEFAULT_LEVEL)

    # wait a key pressed to end
    cv.WaitKey (0)
    cv.DestroyAllWindows()