"atomic bomb" commit. Reorganized OpenCV directory structure
This commit is contained in:
125
samples/swig_python/fitellipse.py
Executable file
125
samples/swig_python/fitellipse.py
Executable file
@@ -0,0 +1,125 @@
|
||||
#!/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");
|
||||
|
Reference in New Issue
Block a user