13 g.prev_pt = cvPoint(-1,-1);
15 function on_mouse( event, x, y, flags, param )
20 if( !swig_this( g.img) )
23 if( event == highgui.CV_EVENT_LBUTTONUP || ! bitand(flags,highgui.CV_EVENT_FLAG_LBUTTON) )
24 g.prev_pt = cvPoint(-1,-1);
25 elseif( event == highgui.CV_EVENT_LBUTTONDOWN )
26 g.prev_pt = cvPoint(x,y);
27 elseif( event == highgui.CV_EVENT_MOUSEMOVE && bitand(flags,highgui.CV_EVENT_FLAG_LBUTTON) )
32 cvLine( g.marker_mask, g.prev_pt, pt, cvScalarAll(255), 5, 8, 0 );
33 cvLine( g.img, g.prev_pt, pt, cvScalarAll(255), 5, 8, 0 );
35 cvShowImage( "image", g.img );
39 filename = "../c/fruits.jpg";
45 g.img0 = cvLoadImage(filename,1);
46 if (!swig_this(g.img0))
47 print "Error opening image '%s'" % filename
51 printf("Hot keys:\n");
52 printf("\tESC - quit the program\n");
53 printf("\tr - restore the original image\n");
54 printf("\tw - run watershed algorithm\n");
55 printf("\t (before that, roughly outline several g.markers on the image)\n");
57 cvNamedWindow( "image", 1 );
58 cvNamedWindow( "watershed transform", 1 );
60 g.img = cvCloneImage( g.img0 );
61 g.img_gray = cvCloneImage( g.img0 );
62 g.wshed = cvCloneImage( g.img0 );
63 g.marker_mask = cvCreateImage( cvGetSize(g.img), 8, 1 );
64 g.markers = cvCreateImage( cvGetSize(g.img), IPL_DEPTH_32S, 1 );
66 cvCvtColor( g.img, g.marker_mask, CV_BGR2GRAY );
67 cvCvtColor( g.marker_mask, g.img_gray, CV_GRAY2BGR );
69 cvZero( g.marker_mask );
72 cvShowImage( "image", g.img );
73 cvShowImage( "watershed transform", g.wshed );
75 cvSetMouseCallback( "image", @on_mouse, [] );
82 cvZero( g.marker_mask );
83 cvCopy( g.img0, g.img );
84 cvShowImage( "image", g.img );
87 storage = cvCreateMemStorage(0);
89 ##cvSaveImage( "g.wshed_mask.png", g.marker_mask );
90 ##g.marker_mask = cvLoadImage( "g.wshed_mask.png", 0 );
91 [nb_cont, contours] = cvFindContours( g.marker_mask, storage, \
93 CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );
96 while (swig_this(contours))
97 cvDrawContours( g.markers, contours, cvScalarAll(comp_count+1), \
98 cvScalarAll(comp_count+1), -1, -1, 8, cvPoint(0,0) );
99 contours=contours.h_next;
103 color_tab = cvCreateMat( comp_count, 1, CV_8UC3 );
104 for i=0:comp_count-1,
105 color_tab(i) = cvScalar( mod(cvRandInt(rng),180) + 50, \
106 mod(cvRandInt(rng),180) + 50, \
107 mod(cvRandInt(rng),180) + 50 );
109 t = int32(cvGetTickCount());
110 cvWatershed( g.img0, g.markers );
111 t = int32(cvGetTickCount()) - t;
112 ##print "exec time = %f" % t/(cvGetTickFrequency()*1000.)
114 cvSet( g.wshed, cvScalarAll(255) );
116 ## paint the watershed image
117 for j=0:g.markers.height-1,
118 for i=0:g.markers.width-1,
120 idx = g.markers({j,i});
125 g.wshed({j,i}) = color_tab({idx,0});
129 cvAddWeighted( g.wshed, 0.5, g.img_gray, 0.5, 0, g.wshed );
130 cvShowImage( "watershed transform", g.wshed );