Update to 2.0.0 tree from current Fremantle build
[opencv] / samples / octave / inpaint.m
diff --git a/samples/octave/inpaint.m b/samples/octave/inpaint.m
new file mode 100644 (file)
index 0000000..f11e269
--- /dev/null
@@ -0,0 +1,84 @@
+#! /usr/bin/env octave
+cv;
+highgui;
+
+global g;
+inpaint_mask = [];
+g.img0 = [];
+g.img = [];
+g.inpainted = [];
+g.prev_pt = cvPoint(-1,-1);
+
+function on_mouse( event, x, y, flags, param )
+  global g;
+  global cv;
+  global highgui;
+  if (!swig_this(g.img))
+    return;
+  endif
+
+  if (event == highgui.CV_EVENT_LBUTTONUP || ! (bitand(flags,highgui.CV_EVENT_FLAG_LBUTTON)))
+    g.prev_pt = cvPoint(-1,-1);
+  elseif (event == highgui.CV_EVENT_LBUTTONDOWN)
+    g.prev_pt = cvPoint(x,y);
+  elseif (event == highgui.CV_EVENT_MOUSEMOVE && bitand(flags,highgui.CV_EVENT_FLAG_LBUTTON))
+    pt = cvPoint(x,y);
+    if (g.prev_pt.x < 0)
+      g.prev_pt = pt;
+    endif
+    cvLine( g.inpaint_mask, g.prev_pt, pt, cvScalarAll(255), 5, 8, 0 );
+    cvLine( g.img, g.prev_pt, pt, cvScalarAll(255), 5, 8, 0 );
+    g.prev_pt = pt;
+    cvShowImage( "image", g.img );
+  endif
+endfunction
+
+filename = "../c/fruits.jpg";
+if (size(argv, 1)>=1)
+  filename = argv(){1};
+endif
+
+g.img0 = cvLoadImage(filename,-1);
+if (!swig_this(g.img0))
+  printf("Can't open image '%s'\n", filename);
+  exit(1);
+endif
+
+printf("Hot keys:\n");
+printf("\tESC - quit the program\n");
+printf("\tr - restore the original image\n");
+printf("\ti or ENTER - run inpainting algorithm\n");
+printf("\t\t(before running it, paint something on the image)\n");
+
+cvNamedWindow( "image", 1 );
+
+g.img = cvCloneImage( g.img0 );
+g.inpainted = cvCloneImage( g.img0 );
+g.inpaint_mask = cvCreateImage( cvGetSize(g.img), 8, 1 );
+
+cvZero( g.inpaint_mask );
+cvZero( g.inpainted );
+cvShowImage( "image", g.img );
+cvShowImage( "watershed transform", g.inpainted );
+cvSetMouseCallback( "image", @on_mouse, [] );
+
+while (true)
+  c = cvWaitKey(0);
+
+  if( c == 27 || c=='q')
+    break;
+  endif
+
+  if( c == 'r' )
+    cvZero( g.inpaint_mask );
+    cvCopy( g.img0, g.img );
+    cvShowImage( "image", g.img );
+  endif
+
+  if( c == 'i' || c == '\012' )
+    cvNamedWindow( "g.inpainted image", 1 );
+    cvInpaint( g.img, g.inpaint_mask, g.inpainted, 3, CV_INPAINT_TELEA );
+    cvShowImage( "g.inpainted image", g.inpainted );
+  endif
+endwhile
+