28fc950400c5eb7178bedb4f3b342f2c925bd4b0
[opencv] / samples / octave / watershed.m
1 #! /usr/bin/env octave
2
3 cv;
4 highgui;
5
6 global g;
7 g.marker_mask = [];
8 g.markers = [];
9 g.img0 = []
10 g.img = []
11 g.img_gray = [] 
12 g.wshed = []
13 g.prev_pt = cvPoint(-1,-1);
14
15 function on_mouse( event, x, y, flags, param )
16   global g;
17   global cv;
18   global highgui;
19
20   if( !swig_this( g.img) )
21     return;
22   endif
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) )
28     pt = cvPoint(x,y);
29     if( g.prev_pt.x < 0 )
30       g.prev_pt = pt;
31     endif
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 );
34     g.prev_pt = pt;
35     cvShowImage( "image", g.img );
36   endif
37 endfunction
38
39 filename = "../c/fruits.jpg";
40 if (size(argv, 1)>=1)
41   filename = argv(){1};
42 endif
43
44 rng = cvRNG(-1);
45 g.img0 = cvLoadImage(filename,1);
46 if (!swig_this(g.img0))
47   print "Error opening image '%s'" % filename
48   exit(-1)
49 endif
50
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");
56
57 cvNamedWindow( "image", 1 );
58 cvNamedWindow( "watershed transform", 1 );
59
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 );
65
66 cvCvtColor( g.img, g.marker_mask, CV_BGR2GRAY );
67 cvCvtColor( g.marker_mask, g.img_gray, CV_GRAY2BGR );
68
69 cvZero( g.marker_mask );
70 cvZero( g.wshed );
71
72 cvShowImage( "image", g.img );
73 cvShowImage( "watershed transform", g.wshed );
74
75 cvSetMouseCallback( "image", @on_mouse, [] );
76 while (true)
77   c = cvWaitKey(0);
78   if (c=='\x1b')
79     break;
80   endif
81   if (c == 'r')
82     cvZero( g.marker_mask );
83     cvCopy( g.img0, g.img );
84     cvShowImage( "image", g.img );
85   endif
86   if (c == 'w')
87     storage = cvCreateMemStorage(0);
88     comp_count = 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, \
92                                        sizeof_CvContour, \
93                                        CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );
94     cvZero( g.markers );
95     swig_this(contours)
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;
100       comp_count+=1;
101     endwhile
102     comp_count
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 );
108     endfor
109     t = int32(cvGetTickCount());
110     cvWatershed( g.img0, g.markers );
111     t = int32(cvGetTickCount()) - t;
112     ##print "exec time = %f" % t/(cvGetTickFrequency()*1000.)
113
114     cvSet( g.wshed, cvScalarAll(255) );
115
116     ## paint the watershed image
117     for j=0:g.markers.height-1,
118       for i=0:g.markers.width-1,
119         {j,i}
120         idx = g.markers({j,i});
121         if (idx==-1)
122           continue
123         endif
124         idx = idx-1;
125         g.wshed({j,i}) = color_tab({idx,0});
126       endfor
127     endfor
128
129     cvAddWeighted( g.wshed, 0.5, g.img_gray, 0.5, 0, g.wshed );
130     cvShowImage( "watershed transform", g.wshed );
131     cvWaitKey();
132   endif
133 endwhile