检测图像中的椭圆 并求其长短轴...

本文介绍使用OpenCV库在图像中检测椭圆的方法,并提供了一段C++代码示例。该程序可以检测图像中的椭圆并绘制椭圆框,同时输出椭圆的长短轴尺寸。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

运行环境 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("像素 "));  

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值