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