Update to 2.0.0 tree from current Fremantle build
[opencv] / samples / octave / ffilldemo.m
1 #! /usr/bin/env octave
2 cv;
3 highgui;
4
5 global g;
6 g.color_img0 = [];
7 g.mask = [];
8 g.color_img = [];
9 g.gray_img0 = [];
10 g.gray_img = [];
11 g.ffill_case = 1;
12 g.lo_diff = 20
13 g.up_diff = 20;
14 g.connectivity = 4;
15 g.is_color = 1;
16 g.is_mask = 0;
17 g.new_mask_val = 255;
18
19 function ret = randint(v1, v2)
20   ret = int32(rand() * (v2 - v1) + v1);
21 end
22
23 function update_lo( pos )
24   g.lo_diff = pos;
25 endfunction
26 function update_up( pos )
27   g.up_diff = pos;
28 endfunction
29
30 function on_mouse( event, x, y, flags, param )
31   global g;
32   global cv;
33   global highgui;
34
35   if( !swig_this(g.color_img) )
36     return;
37   endif
38
39   if (event == highgui.CV_EVENT_LBUTTONDOWN)
40     comp = cv.CvConnectedComp();
41     my_mask = [];
42     seed = cvPoint(x,y);
43     if (g.ffill_case==0)
44       lo = 0;
45       up = 0;
46       flags = g.connectivity + bitshift(g.new_mask_val,8);
47     else
48       lo = g.lo_diff;
49       up = g.up_diff;
50       flags = g.connectivity + bitshift(g.new_mask_val,8) + \
51           cv.CV_FLOODFILL_FIXED_RANGE;
52     endif
53     color = CV_RGB( randint(0,255), randint(0,255), randint(0,255) );    
54
55     if( g.is_mask )
56       my_mask = g.mask;
57       cvThreshold( g.mask, g.mask, 1, 128, cv.CV_THRESH_BINARY );
58     endif
59     
60     if( g.is_color )
61       cv.cvFloodFill( g.color_img, seed, color, cv.CV_RGB( lo, lo, lo ),
62                   CV_RGB( up, up, up ), comp, flags, my_mask );
63       cvShowImage( "image", g.color_img );
64       
65     else
66       
67       brightness = cvRealScalar((r*2 + g*7 + b + 5)/10);
68       cvFloodFill( g.gray_img, seed, brightness, cvRealScalar(lo),
69                   cvRealScalar(up), comp, flags, my_mask );
70       cvShowImage( "image", g.gray_img );
71     endif
72     
73
74     printf("%i pixels were repainted\n", comp.area);
75
76     if( g.is_mask )
77       cvShowImage( "mask", g.mask );
78     endif
79   endif
80 endfunction
81
82
83
84
85 filename = "../c/fruits.jpg";
86 if (size(argv, 1)>0)
87   filename=argv(){1};
88 endif
89
90 g.color_img0 = cvLoadImage(filename,1);
91 if (!swig_this(g.color_img0))
92   printf("Could not open %s\n",filename);
93   exit(-1);
94 endif
95
96 printf("Hot keys:\n");
97 printf("\tESC - quit the program\n");
98 printf("\tc - switch color/grayscale mode\n");
99 printf("\tm - switch mask mode\n");
100 printf("\tr - restore the original image\n");
101 printf("\ts - use null-range floodfill\n");
102 printf("\tf - use gradient floodfill with fixed(absolute) range\n");
103 printf("\tg - use gradient floodfill with floating(relative) range\n");
104 printf("\t4 - use 4-g.connectivity mode\n");
105 printf("\t8 - use 8-g.connectivity mode\n");
106
107 g.color_img = cvCloneImage( g.color_img0 );
108 g.gray_img0 = cvCreateImage( cvSize(g.color_img.width, g.color_img.height), 8, 1 );
109 cvCvtColor( g.color_img, g.gray_img0, CV_BGR2GRAY );
110 g.gray_img = cvCloneImage( g.gray_img0 );
111 g.mask = cvCreateImage( cvSize(g.color_img.width + 2, g.color_img.height + 2), 8, 1 );
112
113 cvNamedWindow( "image", 1 );
114 cvCreateTrackbar( "g.lo_diff", "image", g.lo_diff, 255, @update_lo);
115 cvCreateTrackbar( "g.up_diff", "image", g.up_diff, 255, @update_up);
116
117 cvSetMouseCallback( "image", @on_mouse );
118
119 while (true)
120   if( g.is_color )
121     cvShowImage( "image", g.color_img );
122   else
123     cvShowImage( "image", g.gray_img );
124   endif
125
126   c = cvWaitKey(0);
127   if (c==27)
128     printf("Exiting ...\n");
129     exit(0)
130   elseif (c=='c')
131     if( g.is_color )
132       
133       print("Grayscale mode is set");
134       cvCvtColor( g.color_img, g.gray_img, CV_BGR2GRAY );
135       g.is_color = 0;
136       
137     else
138       
139       print("Color mode is set");
140       cvCopy( g.color_img0, g.color_img, [] );
141       cvZero( g.mask );
142       g.is_color = 1;
143     endif
144     
145   elseif (c=='m')
146     if( g.is_mask )
147       cvDestroyWindow( "mask" );
148       g.is_mask = 0;
149       
150     else
151       cvNamedWindow( "mask", 0 );
152       cvZero( g.mask );
153       cvShowImage( "mask", g.mask );
154       g.is_mask = 1;
155     endif
156     
157   elseif (c=='r')
158     printf("Original image is restored");
159     cvCopy( g.color_img0, g.color_img, [] );
160     cvCopy( g.gray_img0, g.gray_img, [] );
161     cvZero( g.mask );
162   elseif (c=='s')
163     printf("Simple floodfill mode is set");
164     g.ffill_case = 0;
165   elseif (c=='f')
166     printf("Fixed Range floodfill mode is set");
167     g.ffill_case = 1;
168   elseif (c=='g')
169     printf("Gradient (floating range) floodfill mode is set");
170     g.ffill_case = 2;
171   elseif (c=='4')
172     printf("4-g.connectivity mode is set");
173     g.connectivity = 4;
174   elseif (c=='8')
175     printf("8-g.connectivity mode is set");
176     g.connectivity = 8;
177   endif
178
179 endwhile