Update to 2.0.0 tree from current Fremantle build
[opencv] / samples / octave / fitellipse.m
diff --git a/samples/octave/fitellipse.m b/samples/octave/fitellipse.m
new file mode 100644 (file)
index 0000000..06ec00f
--- /dev/null
@@ -0,0 +1,123 @@
+#! /usr/bin/env octave
+## This program is demonstration for ellipse fitting. Program finds 
+## contours and approximate it by ellipses.
+
+## Trackbar specify threshold parametr.
+
+## White lines is contours. Red lines is fitting ellipses.
+
+## Original C implementation by:  Denis Burenkov.
+## Python implementation by: Roman Stanchak
+## Octave implementation by: Xavier Delacour
+
+cv;
+highgui;
+
+global g;
+g.image02 = [];
+g.image03 = [];
+g.image04 = [];
+
+function process_image( slider_pos )
+  global g;
+  global cv;
+  global highgui;
+
+  ##  Define trackbar callback functon. This function find contours,
+  ##    draw it and approximate it by ellipses.
+  stor = cv.cvCreateMemStorage(0);
+  
+  ## Threshold the source image. This needful for cv.cvFindContours().
+  cv.cvThreshold( g.image03, g.image02, slider_pos, 255, cv.CV_THRESH_BINARY );
+  
+  ## Find all contours.
+  [nb_contours, cont] = cv.cvFindContours (g.image02,stor,cv.sizeof_CvContour,cv.CV_RETR_LIST,cv.CV_CHAIN_APPROX_NONE,cv.cvPoint (0,0));
+  
+  ## Clear images. IPL use.
+  cv.cvZero(g.image02);
+  cv.cvZero(g.image04);
+  
+  ## This cycle draw all contours and approximate it by ellipses.
+  for c = cv.CvSeq_hrange(cont),
+    c = c{1};
+    count = c.total; # This is number point in contour
+
+    ## Number point must be more than or equal to 6 (for cv.cvFitEllipse_32f).        
+    if( count < 6 )
+      continue;
+    endif
+    
+    ## Alloc memory for contour point set.    
+    PointArray = cv.cvCreateMat(1, count, cv.CV_32SC2);
+    PointArray2D32f= cv.cvCreateMat( 1, count, cv.CV_32FC2);
+    
+    ## Get contour point set.
+    cv.cvCvtSeqToArray(c, PointArray, cv.cvSlice(0, cv.CV_WHOLE_SEQ_END_INDEX));
+    
+    ## Convert CvPoint set to CvBox2D32f set.
+    cv.cvConvert( PointArray, PointArray2D32f );
+    
+    box = cv.CvBox2D();
+
+    ## Fits ellipse to current contour.
+    box = cv.cvFitEllipse2(PointArray2D32f);
+    
+    ## Draw current contour.
+    cv.cvDrawContours(g.image04, c, cv.CV_RGB(255,255,255), cv.CV_RGB(255,255,255),0,1,8,cv.cvPoint(0,0));
+    
+    ## Convert ellipse data from float to integer representation.
+    center = cv.CvPoint();
+    size = cv.CvSize();
+    center.x = cv.cvRound(box.center.x);
+    center.y = cv.cvRound(box.center.y);
+    size.width = cv.cvRound(box.size.width*0.5);
+    size.height = cv.cvRound(box.size.height*0.5);
+    box.angle = -box.angle;
+    
+    ## Draw ellipse.
+    cv.cvEllipse(g.image04, center, size,box.angle, 0, 360,cv.CV_RGB(0,0,255), 1, cv.CV_AA, 0);
+  endfor    
+
+  ## Show image. HighGUI use.
+  highgui.cvShowImage( "Result", g.image04 );
+endfunction
+
+argc = size(argv, 1);
+filename = "../c/stuff.jpg";
+if(argc == 2)
+  filename = argv(){1};
+endif
+
+slider_pos = 70;
+
+## load image and force it to be grayscale
+g.image03 = highgui.cvLoadImage(filename, 0);
+if (!swig_this( g.image03))
+  printf("Could not load image %s\n", filename);
+  exit(-1);
+endif
+
+## Create the destination images
+g.image02 = cv.cvCloneImage( g.image03 );
+g.image04 = cv.cvCloneImage( g.image03 );
+
+## Create windows.
+highgui.cvNamedWindow("Source", 1);
+highgui.cvNamedWindow("Result", 1);
+
+## Show the image.
+highgui.cvShowImage("Source", g.image03);
+
+## Create toolbars. HighGUI use.
+highgui.cvCreateTrackbar( "Threshold", "Result", slider_pos, 255, @process_image );
+
+
+process_image( 1 );
+
+## Wait for a key stroke; the same function arranges events processing                
+printf("Press any key to exit\n");
+highgui.cvWaitKey(0);
+
+highgui.cvDestroyWindow("Source");
+highgui.cvDestroyWindow("Result");
+