339771e085ef1de3d6b27171979ff4d9660c9456
[profile/ivi/opencv.git] / samples / python / ffilldemo.py
1 #!/usr/bin/python
2 import sys
3 import random
4 import urllib2
5 import cv2.cv as cv
6
7 im=None;
8 mask=None;
9 color_img=None;
10 gray_img0 = None;
11 gray_img = None;
12 ffill_case = 1;
13 lo_diff = 20
14 up_diff = 20;
15 connectivity = 4;
16 is_color = 1;
17 is_mask = 0;
18 new_mask_val = 255;
19
20 def update_lo( pos ):
21     lo_diff = pos
22 def update_up( pos ):
23     up_diff = pos
24
25 def on_mouse( event, x, y, flags, param ):
26
27     if( not color_img ):
28         return;
29
30     if event == cv.CV_EVENT_LBUTTONDOWN:
31             my_mask = None
32             seed = (x,y);
33             if ffill_case==0:
34                 lo = up = 0
35                 flags = connectivity + (new_mask_val << 8)
36             else:
37                 lo = lo_diff;
38                 up = up_diff;
39                 flags = connectivity + (new_mask_val << 8) + cv.CV_FLOODFILL_FIXED_RANGE
40             b = random.randint(0,255)
41             g = random.randint(0,255)
42             r = random.randint(0,255)
43
44             if( is_mask ):
45                 my_mask = mask
46                 cv.Threshold( mask, mask, 1, 128, cv.CV_THRESH_BINARY );
47                
48             if( is_color ):
49             
50                 color = cv.CV_RGB( r, g, b );
51                 comp = cv.FloodFill( color_img, seed, color, cv.CV_RGB( lo, lo, lo ),
52                              cv.CV_RGB( up, up, up ), flags, my_mask );
53                 cv.ShowImage( "image", color_img );
54             
55             else:
56             
57                 brightness = cv.RealScalar((r*2 + g*7 + b + 5)/10);
58                 comp = cv.FloodFill( gray_img, seed, brightness, cv.RealScalar(lo),
59                              cv.RealScalar(up), flags, my_mask );
60                 cv.ShowImage( "image", gray_img );
61             
62
63             print "%g pixels were repainted" % comp[0]
64
65             if( is_mask ):
66                 cv.ShowImage( "mask", mask );
67         
68     
69
70
71 if __name__ == "__main__":
72     
73     if len(sys.argv) > 1:
74         im = cv.LoadImage( sys.argv[1], cv.CV_LOAD_IMAGE_COLOR)
75     else:
76         url = 'http://code.opencv.org/svn/opencv/trunk/opencv/samples/c/fruits.jpg'
77         filedata = urllib2.urlopen(url).read()
78         imagefiledata = cv.CreateMatHeader(1, len(filedata), cv.CV_8UC1)
79         cv.SetData(imagefiledata, filedata, len(filedata))
80         im = cv.DecodeImage(imagefiledata, cv.CV_LOAD_IMAGE_COLOR)
81
82     print "Hot keys:"
83     print "\tESC - quit the program"
84     print "\tc - switch color/grayscale mode"
85     print "\tm - switch mask mode"
86     print "\tr - restore the original image"
87     print "\ts - use null-range floodfill"
88     print "\tf - use gradient floodfill with fixed(absolute) range"
89     print "\tg - use gradient floodfill with floating(relative) range"
90     print "\t4 - use 4-connectivity mode"
91     print "\t8 - use 8-connectivity mode"
92         
93     color_img = cv.CloneImage( im );
94     gray_img0 = cv.CreateImage( (color_img.width, color_img.height), 8, 1 );
95     cv.CvtColor( color_img, gray_img0, cv.CV_BGR2GRAY );
96     gray_img = cv.CloneImage( gray_img0 );
97     mask = cv.CreateImage( (color_img.width + 2, color_img.height + 2), 8, 1 );
98
99     cv.NamedWindow( "image", 1 );
100     cv.CreateTrackbar( "lo_diff", "image", lo_diff, 255, update_lo);
101     cv.CreateTrackbar( "up_diff", "image", up_diff, 255, update_up);
102
103     cv.SetMouseCallback( "image", on_mouse );
104
105     while True: 
106         if( is_color ):
107             cv.ShowImage( "image", color_img );
108         else:
109             cv.ShowImage( "image", gray_img );
110
111         c = cv.WaitKey(0) % 0x100
112         if c == 27:
113             print("Exiting ...");
114             sys.exit(0)
115         elif c == ord('c'):
116             if( is_color ):
117             
118                 print("Grayscale mode is set");
119                 cv.CvtColor( color_img, gray_img, cv.CV_BGR2GRAY );
120                 is_color = 0;
121             
122             else:
123             
124                 print("Color mode is set");
125                 cv.Copy( im, color_img, None );
126                 cv.Zero( mask );
127                 is_color = 1;
128             
129         elif c == ord('m'):
130             if( is_mask ):
131                 cv.DestroyWindow( "mask" );
132                 is_mask = 0;
133             
134             else:
135                 cv.NamedWindow( "mask", 0 );
136                 cv.Zero( mask );
137                 cv.ShowImage( "mask", mask );
138                 is_mask = 1;
139             
140         elif c == ord('r'):
141             print("Original image is restored");
142             cv.Copy( im, color_img, None );
143             cv.Copy( gray_img0, gray_img, None );
144             cv.Zero( mask );
145         elif c == ord('s'):
146             print("Simple floodfill mode is set");
147             ffill_case = 0;
148         elif c == ord('f'):
149             print("Fixed Range floodfill mode is set");
150             ffill_case = 1;
151         elif c == ord('g'):
152             print("Gradient (floating range) floodfill mode is set");
153             ffill_case = 2;
154         elif c == ord('4'):
155             print("4-connectivity mode is set");
156             connectivity = 4;
157         elif c == ord('8'):
158             print("8-connectivity mode is set");
159             connectivity = 8;
160     cv.DestroyAllWindows()