Update the trunk to the OpenCV's CVS (2008-07-14)
[opencv] / samples / c / inpaint.cpp
1 #ifdef _CH_
2 #pragma package <opencv>
3 #endif
4
5 #include "cv.h"
6 #include "highgui.h"
7 #include <stdio.h>
8 #include <stdlib.h>
9
10 IplImage* inpaint_mask = 0;
11 IplImage* img0 = 0, *img = 0, *inpainted = 0;
12 CvPoint prev_pt = {-1,-1};
13
14 void on_mouse( int event, int x, int y, int flags, void* )
15 {
16     if( !img )
17         return;
18
19     if( event == CV_EVENT_LBUTTONUP || !(flags & CV_EVENT_FLAG_LBUTTON) )
20         prev_pt = cvPoint(-1,-1);
21     else if( event == CV_EVENT_LBUTTONDOWN )
22         prev_pt = cvPoint(x,y);
23     else if( event == CV_EVENT_MOUSEMOVE && (flags & CV_EVENT_FLAG_LBUTTON) )
24     {
25         CvPoint pt = cvPoint(x,y);
26         if( prev_pt.x < 0 )
27             prev_pt = pt;
28         cvLine( inpaint_mask, prev_pt, pt, cvScalarAll(255), 5, 8, 0 );
29         cvLine( img, prev_pt, pt, cvScalarAll(255), 5, 8, 0 );
30         prev_pt = pt;
31         cvShowImage( "image", img );
32     }
33 }
34
35
36 int main( int argc, char** argv )
37 {
38     char* filename = argc >= 2 ? argv[1] : (char*)"fruits.jpg";
39
40     if( (img0 = cvLoadImage(filename,-1)) == 0 )
41         return 0;
42
43     printf( "Hot keys: \n"
44             "\tESC - quit the program\n"
45             "\tr - restore the original image\n"
46             "\ti or ENTER - run inpainting algorithm\n"
47             "\t\t(before running it, paint something on the image)\n" );
48     
49     cvNamedWindow( "image", 1 );
50
51     img = cvCloneImage( img0 );
52     inpainted = cvCloneImage( img0 );
53     inpaint_mask = cvCreateImage( cvGetSize(img), 8, 1 );
54
55     cvZero( inpaint_mask );
56     cvZero( inpainted );
57     cvShowImage( "image", img );
58     cvShowImage( "watershed transform", inpainted );
59     cvSetMouseCallback( "image", on_mouse, 0 );
60
61     for(;;)
62     {
63         int c = cvWaitKey(0);
64
65         if( (char)c == 27 )
66             break;
67
68         if( (char)c == 'r' )
69         {
70             cvZero( inpaint_mask );
71             cvCopy( img0, img );
72             cvShowImage( "image", img );
73         }
74
75         if( (char)c == 'i' || (char)c == '\n' )
76         {
77             cvNamedWindow( "inpainted image", 1 );
78             cvInpaint( img, inpaint_mask, inpainted, 3, CV_INPAINT_TELEA );
79             cvShowImage( "inpainted image", inpainted );
80         }
81     }
82
83     return 1;
84 }