int main( int argc, char** argv ) { char* filename = argc >= 2 ? argv[1] : (char*)"fruits.jpg"; if( (img0 = cvLoadImage(filename,-1)) == 0 ) return 0; printf( "Hot keys: \n" "\tESC - quit the program\n" "\tr - restore the original image\n" "\ti or SPACE - run inpainting algorithm\n" "\t\t(before running it, paint something on the image)\n" ); cvNamedWindow( "image", 1 ); img = cvCloneImage( img0 ); inpainted = cvCloneImage( img0 ); inpaint_mask = cvCreateImage( cvGetSize(img), 8, 1 ); cvZero( inpaint_mask ); cvZero( inpainted ); cvShowImage( "image", img ); cvShowImage( "inpainted image", inpainted ); cvSetMouseCallback( "image", on_mouse, 0 ); for(;;) { int c = cvWaitKey(0); if( (char)c == 27 ) break; if( (char)c == 'r' ) { cvZero( inpaint_mask ); cvCopy( img0, img ); cvShowImage( "image", img ); } if( (char)c == 'i' || (char)c == ' ' ) { cvNamedWindow( "inpainted image", 1 ); cvInpaint( img, inpaint_mask, inpainted, 3, CV_INPAINT_TELEA ); cvShowImage( "inpainted image", inpainted ); } } return 1; }
static void do_inpainting(IplImage* frame, int radius, const CvRect& roi) { IplImage* g = cvCreateImage(cvSize(frame->width,frame->height), IPL_DEPTH_8U, 1); IplImage* m = cvCreateImage(cvSize(frame->width,frame->height), IPL_DEPTH_8U, 1); cvZero(m); cvCvtColor(frame, g, CV_RGB2GRAY); cvSetImageROI(g, roi); cvSetImageROI(m, roi); double min, max; cvMinMaxLoc(g, &min, &max); cvThreshold(g, m, 0.4*(max + min), 255, CV_THRESH_BINARY); cvResetImageROI(m); cvInpaint(frame, m, frame, radius, CV_INPAINT_TELEA); cvReleaseImage(&g); cvReleaseImage(&m); }