X-Git-Url: http://git.maemo.org/git/?p=opencv;a=blobdiff_plain;f=samples%2Foctave%2Ffitellipse.m;fp=samples%2Foctave%2Ffitellipse.m;h=06ec00f6419860ed960b5f38f02c132700558a67;hp=0000000000000000000000000000000000000000;hb=e4c14cdbdf2fe805e79cd96ded236f57e7b89060;hpb=454138ff8a20f6edb9b65a910101403d8b520643 diff --git a/samples/octave/fitellipse.m b/samples/octave/fitellipse.m new file mode 100644 index 0000000..06ec00f --- /dev/null +++ b/samples/octave/fitellipse.m @@ -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"); +