124 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Mathematica
		
	
	
	
	
	
			
		
		
	
	
			124 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Mathematica
		
	
	
	
	
	
| #! /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");
 | |
| 
 | 
