/examples/opencv/src/fitellipse.cpp
C++ | 134 lines | 68 code | 30 blank | 36 comment | 5 complexity | f55dbc9e630863026a947d2567a75d19 MD5 | raw file
- /********************************************************************************
- *
- *
- * 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.
- *
- *
- * Autor: Denis Burenkov.
- *
- *
- *
- ********************************************************************************/
- #ifdef _CH_
- #pragma package <opencv>
- #endif
- #define CV_NO_BACKWARD_COMPATIBILITY
- #ifndef _EiC
- #include "cv.h"
- #include "highgui.h"
- #endif
- int slider_pos = 70;
- // Load the source image. HighGUI use.
- IplImage *image02 = 0, *image03 = 0, *image04 = 0;
- void process_image(int h);
- int main( int argc, char** argv )
- {
- const char* filename = argc == 2 ? argv[1] : (char*)"stuff.jpg";
- // load image and force it to be grayscale
- if( (image03 = cvLoadImage(filename, 0)) == 0 )
- return -1;
- // Create the destination images
- image02 = cvCloneImage( image03 );
- image04 = cvCloneImage( image03 );
- // Create windows.
- cvNamedWindow("Source", 1);
- cvNamedWindow("Result", 1);
- // Show the image.
- cvShowImage("Source", image03);
- // Create toolbars. HighGUI use.
- cvCreateTrackbar( "Threshold", "Result", &slider_pos, 255, process_image );
- process_image(0);
- // Wait for a key stroke; the same function arranges events processing
- cvWaitKey(0);
- cvReleaseImage(&image02);
- cvReleaseImage(&image03);
- cvDestroyWindow("Source");
- cvDestroyWindow("Result");
- return 0;
- }
- // Define trackbar callback functon. This function find contours,
- // draw it and approximate it by ellipses.
- void process_image(int h)
- {
- CvMemStorage* storage;
- CvSeq* contour;
- // Create dynamic structure and sequence.
- storage = cvCreateMemStorage(0);
- contour = cvCreateSeq(CV_SEQ_ELTYPE_POINT, sizeof(CvSeq), sizeof(CvPoint) , storage);
- // Threshold the source image. This needful for cvFindContours().
- cvThreshold( image03, image02, slider_pos, 255, CV_THRESH_BINARY );
- // Find all contours.
- cvFindContours( image02, storage, &contour, sizeof(CvContour),
- CV_RETR_LIST, CV_CHAIN_APPROX_NONE, cvPoint(0,0));
- // Clear images. IPL use.
- cvZero(image02);
- cvZero(image04);
- // This cycle draw all contours and approximate it by ellipses.
- for(;contour;contour = contour->h_next)
- {
- int count = contour->total; // This is number point in contour
- CvPoint center;
- CvSize size;
- CvBox2D box;
- // Number point must be more than or equal to 6 (for cvFitEllipse_32f).
- if( count < 6 )
- continue;
- CvMat* points_f = cvCreateMat( 1, count, CV_32FC2 );
- CvMat points_i = cvMat( 1, count, CV_32SC2, points_f->data.ptr );
- cvCvtSeqToArray( contour, points_f->data.ptr, CV_WHOLE_SEQ );
- cvConvert( &points_i, points_f );
- // Fits ellipse to current contour.
- box = cvFitEllipse2( points_f );
- // Draw current contour.
- cvDrawContours(image04,contour,CV_RGB(255,255,255),CV_RGB(255,255,255),0,1,8,cvPoint(0,0));
- // Convert ellipse data from float to integer representation.
- center = cvPointFrom32f(box.center);
- size.width = cvRound(box.size.width*0.5);
- size.height = cvRound(box.size.height*0.5);
- // Draw ellipse.
- cvEllipse(image04, center, size,
- -box.angle, 0, 360,
- CV_RGB(0,0,255), 1, CV_AA, 0);
- cvReleaseMat(&points_f);
- }
- // Show image. HighGUI use.
- cvShowImage( "Result", image04 );
- }
- #ifdef _EiC
- main(1,"fitellipse.c");
- #endif