opencv椭圆检测

来源:互联网 发布:淘宝网推荐浏览器 编辑:程序博客网 时间:2024/06/05 11:02

原文地址:http://blog.csdn.net/henhen2002/article/details/4304674

运行环境 BCB 6.0~  需要OPENCV 库支持

效果图

  1. CvMemStorage* storage = cvCreateMemStorage(0);  
  2. CvSeq* contours;  
  3. CvBox2D s;  
  4. char string1[22];  
  5. char string2[22];  
  6. IplImage* img = cvLoadImage( "Ellipse.jpg" );  
  7. IplImage* gray = cvCreateImage(cvGetSize(img), 8, 1 );  
  8. IplImage* gray1 = cvCreateImage(cvGetSize(img), 8, 1 );   
  9. cvCvtColor(img, gray, CV_BGR2GRAY );  
  10. cvThreshold( gray, gray1 ,30, 255, CV_THRESH_BINARY );  
  11.   
  12. //图像二值化(这里按需要进行修改,椭圆应为高灰度值)  
  13. cvNamedWindow( "Ellipse", 1 );  
  14. cvShowImage("Ellipse",gray1);  
  15. cvSaveImage("Ellipse11.jpg",gray1);  
  16.   
  17. cvFindContours( gray1, storage, &contours, sizeof(CvContour),  
  18.                 CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));  
  19.   s=cvFitEllipse2(contours);  
  20.   s.angle=90-s.angle;//这个地方是OPENCV的一个BUG 角度要修正一下  
  21. //cvEllipse( img, cvPointFrom32f( s.center ),cvSize(s.size.width,s.size.height), s.angle,0, 360, CV_RGB(0,0,255), 1, 8, 0 );  
  22. cvEllipseBox(img,s, CV_RGB(0,0,255),3, 8 , 0 );//画椭圆框  
  23.   
  24. cvNamedWindow( "Ellipse22", 1 );  
  25. cvShowImage("Ellipse22",img);//原图上显示椭圆框  
  26.   
  27. cvSaveImage("Ellipse22.jpg",img);  
  28. itoa(s.size.width, string1, 10 );  
  29. itoa(s.size.height, string2, 10 );  
  30. strcat(string1,", ");  
  31. strcat(string1,string2);  
  32. ShowMessage( AnsiString(" 椭圆的长短轴分别为:")  + string1 + AnsiString(" 像素 "));  
  33.   
  34.    
  35.   
  36.    
  37.   
  38. 此程序只能检测一个椭圆,如果要检测多个椭圆,要做如下修改~  
  39.   
  40.    
  41.   
  42.    
  43.   
  44.    
  45.   
  46. CvMemStorage* storage = cvCreateMemStorage(0);  
  47. CvSeq* contours;  
  48. CvBox2D s;  
  49. char string1[22];  
  50. char string2[22];  
  51. char string3[22];  
  52. char string4[222];  
  53. IplImage* img = cvLoadImage( "Ellipse.jpg" );  
  54. IplImage* gray = cvCreateImage(cvGetSize(img), 8, 1 );  
  55. IplImage* gray1 = cvCreateImage(cvGetSize(img), 8, 1 );   
  56. cvCvtColor(img, gray, CV_BGR2GRAY );  
  57. cvThreshold( gray, gray1 ,100, 255, CV_THRESH_BINARY );  
  58. cvNamedWindow( "Ellipse", 1 );  
  59. cvShowImage("Ellipse",gray1);  
  60. cvSaveImage("Ellipse11.jpg",gray1);  
  61.   
  62. int i=cvFindContours( gray1, storage, &contours, sizeof(CvContour),  
  63.                 CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));  
  64. itoa(i, string3, 10 );  
  65.   for(CvSeq* c=contours; c!=NULL; c=c->h_next)  
  66.   {  
  67.   s=cvFitEllipse2(c);  
  68.   s.angle=90-s.angle;  
  69.   cvEllipseBox(img,s, CV_RGB(255,0,0),2, 8 , 0 );//画椭圆框  
  70.   itoa(s.size.width, string1, 10 );  
  71.   itoa(s.size.height, string2, 10 );  
  72.   strcat(string1,"  ");  
  73.   strcat(string1,string2);  
  74.   strcat(string4,string1);  
  75.   strcat(string4," | ");  
  76.   }  
  77.   
  78. cvNamedWindow( "Ellipse22", 1 );  
  79. cvShowImage("Ellipse22",img);//原图上显示椭圆框  
  80.   
  81. cvSaveImage("Ellipse22.jpg",img);  
  82.   
  83. ShowMessage( AnsiString(" 共找到椭圆 ")  + string3 + AnsiString(" 个/n ")+  
  84. AnsiString("椭圆的长短轴分别为:")  + string4 + AnsiString("像素 ")); 

0 0