fitellipse.c
上传用户:banwdc
上传日期:2016-06-25
资源大小:2871k
文件大小:4k
源码类别:

OpenCV

开发平台:

Visual C++

  1. #include "cv.h"
  2. #include "highgui.h"
  3. int slider_pos = 70;
  4. IplImage *image02 = 0, *image03 = 0, *image04 = 0;
  5. void process_image(int h);
  6. int main( int argc, char** argv )
  7. {
  8.     const char* filename = argc == 2 ? argv[1] : (char*)"stuff.jpg";
  9.     
  10.     // 读入图像,强制为灰度图像
  11.     if( (image03 = cvLoadImage(filename, 0)) == 0 )
  12.         return -1;
  13.     // Create the destination images
  14.     image02 = cvCloneImage( image03 );
  15.     image04 = cvCloneImage( image03 );
  16.     // Create windows.
  17.     cvNamedWindow("Source", 1);
  18.     cvNamedWindow("Result", 1);
  19.     // Show the image.
  20.     cvShowImage("Source", image03);
  21.     // Create toolbars. HighGUI use.
  22.     cvCreateTrackbar( "Threshold", "Result", &slider_pos, 255, process_image );
  23.     process_image(0);
  24.     // Wait for a key stroke; the same function arranges events processing                
  25.     cvWaitKey(0);
  26.     cvReleaseImage(&image02);
  27.     cvReleaseImage(&image03);
  28.     cvDestroyWindow("Source");
  29.     cvDestroyWindow("Result");
  30.     return 0;
  31. }
  32. // Define trackbar callback functon. This function find contours,
  33. // draw it and approximate it by ellipses.
  34. void process_image(int h)
  35. {
  36.     CvMemStorage* stor;
  37.     CvSeq* cont;
  38.     CvBox2D32f* box;
  39.     CvPoint* PointArray;
  40.     CvPoint2D32f* PointArray2D32f;
  41.     
  42.     // 创建动态结构序列
  43.     stor = cvCreateMemStorage(0);
  44.     cont = cvCreateSeq(CV_SEQ_ELTYPE_POINT, sizeof(CvSeq), sizeof(CvPoint) , stor);
  45.     
  46.     // 二值话图像.
  47.     cvThreshold( image03, image02, slider_pos, 255, CV_THRESH_BINARY );
  48.     
  49.     // 寻找所有轮廓.
  50.     cvFindContours( image02, stor, &cont, sizeof(CvContour), 
  51.                     CV_RETR_LIST, CV_CHAIN_APPROX_NONE, cvPoint(0,0));
  52.     
  53.     // Clear images. IPL use.
  54.     cvZero(image02);
  55.     cvZero(image04);
  56.     
  57.     // 本循环绘制所有轮廓并用椭圆拟合.
  58.     for(;cont;cont = cont->h_next)
  59.     {   
  60.         int i; // Indicator of cycle.
  61.         int count = cont->total; // This is number point in contour
  62.         CvPoint center;
  63.         CvSize size;
  64.         
  65.         // Number point must be more than or equal to 6 (for cvFitEllipse_32f).        
  66.         if( count < 6 )
  67.             continue;
  68.         
  69.         // Alloc memory for contour point set.    
  70.         PointArray = (CvPoint*)malloc( count*sizeof(CvPoint) );
  71.         PointArray2D32f= (CvPoint2D32f*)malloc( count*sizeof(CvPoint2D32f) );
  72.         
  73.         // Alloc memory for ellipse data.
  74.         box = (CvBox2D32f*)malloc(sizeof(CvBox2D32f));
  75.         
  76.         // Get contour point set.
  77.         cvCvtSeqToArray(cont, PointArray, CV_WHOLE_SEQ);
  78.         
  79.         // Convert CvPoint set to CvBox2D32f set.
  80.         for(i=0; i<count; i++)
  81.         {
  82.             PointArray2D32f[i].x = (float)PointArray[i].x;
  83.             PointArray2D32f[i].y = (float)PointArray[i].y;
  84.         }
  85.         
  86.         //拟合当前轮廓.
  87.         cvFitEllipse(PointArray2D32f, count, box);
  88.         
  89.         // 绘制当前轮廓.
  90.         cvDrawContours(image04,cont,CV_RGB(255,255,255),
  91. CV_RGB(255,255,255),0,1,8,cvPoint(0,0));
  92.         
  93.         // Convert ellipse data from float to integer representation.
  94.         center.x = cvRound(box->center.x);
  95.         center.y = cvRound(box->center.y);
  96.         size.width = cvRound(box->size.width*0.5);
  97.         size.height = cvRound(box->size.height*0.5);
  98.         box->angle = -box->angle;
  99.         
  100.         // Draw ellipse.
  101.         cvEllipse(image04, center, size,
  102.                   box->angle, 0, 360,
  103.                   CV_RGB(0,0,255), 1, CV_AA, 0);
  104.         
  105.         // Free memory.          
  106.         free(PointArray);
  107.         free(PointArray2D32f);
  108.         free(box);
  109.     }
  110.     
  111.     // Show image. HighGUI use.
  112.     cvShowImage( "Result", image04 );
  113. }