--- /dev/null
+#!/usr/bin/python
+"""
+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
+"""
+
+import sys
+from opencv import cv
+from opencv import highgui
+
+image02 = None
+image03 = None
+image04 = None
+
+def process_image( slider_pos ):
+ """
+ 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( image03, image02, slider_pos, 255, cv.CV_THRESH_BINARY );
+
+ # Find all contours.
+ nb_contours, cont = cv.cvFindContours (image02,
+ stor,
+ cv.sizeof_CvContour,
+ cv.CV_RETR_LIST,
+ cv.CV_CHAIN_APPROX_NONE,
+ cv.cvPoint (0,0))
+
+ # Clear images. IPL use.
+ cv.cvZero(image02);
+ cv.cvZero(image04);
+
+ # This cycle draw all contours and approximate it by ellipses.
+ for c in cont.hrange():
+ 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;
+
+ # 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(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(image04, center, size,
+ box.angle, 0, 360,
+ cv.CV_RGB(0,0,255), 1, cv.CV_AA, 0);
+
+ # Show image. HighGUI use.
+ highgui.cvShowImage( "Result", image04 );
+
+
+if __name__ == '__main__':
+ argc = len(sys.argv)
+ filename = "../c/stuff.jpg"
+ if(argc == 2):
+ filename = sys.argv[1]
+
+ slider_pos = 70
+
+ # load image and force it to be grayscale
+ image03 = highgui.cvLoadImage(filename, 0)
+ if not image03:
+ print "Could not load image " + filename
+ sys.exit(-1)
+
+ # Create the destination images
+ image02 = cv.cvCloneImage( image03 );
+ image04 = cv.cvCloneImage( image03 );
+
+ # Create windows.
+ highgui.cvNamedWindow("Source", 1);
+ highgui.cvNamedWindow("Result", 1);
+
+ # Show the image.
+ highgui.cvShowImage("Source", 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
+ print "Press any key to exit"
+ highgui.cvWaitKey(0);
+
+ highgui.cvDestroyWindow("Source");
+ highgui.cvDestroyWindow("Result");
+