mirror of https://github.com/opencv/opencv.git
Open Source Computer Vision Library
https://opencv.org/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
123 lines
3.4 KiB
123 lines
3.4 KiB
#! /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"); |
|
|
|
|