学习OpenCV——Max_Area寻找最大区域

本文介绍了一种使用C++和OpenCV实现的图像轮廓检测与分析的方法。该方法包括二值化处理、提取轮廓、过滤小面积和不符合长宽比的轮廓,并突出显示面积最大的轮廓。此外,还展示了如何计算并输出轮廓总数。

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

  1. a. 二值化  
  2. b. 得到轮廓的个数  
  3. c. 将面积小于100的轮廓删除  
  4. d. 将宽、高 比例小于1的轮廓删除  
  5. e. 把面积最大的轮廓用红色框框画出来  
  1.    
  1. #include "stdafx.h"  
  2. #include "cv.h"  
  3. #include "highgui.h"  
  4. int main( int argc, char** argv )  
  5. {  
  6.     IplImage* src;  
  7.     src=cvLoadImage("D:/Demo.jpg",CV_LOAD_IMAGE_GRAYSCALE);  
  8.     IplImage* dst = cvCreateImage( cvGetSize(src), 8, 3 );  
  9.     CvMemStorage* storage = cvCreateMemStorage(0);  
  10.     CvSeq* contour = 0;  
  11.     cvThreshold( src, src,120, 255, CV_THRESH_BINARY );//二值化  
  12.     cvNamedWindow( "Source", 1 );  
  13.     cvShowImage( "Source", src );  
  14.     //提取轮廓  
  15.     cvFindContours( src, storage, &contour, sizeof(CvContour), CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );  
  16.     cvZero( dst );//清空数组  
  17.     CvSeq* _contour =contour;   
  18.     double maxarea=0;  
  19.     double minarea=100;  
  20.     int n=-1,m=0;//n为面积最大轮廓索引,m为迭代索引  
  21.     for( ; contour != 0; contour = contour->h_next )  
  22.     {  
  23.   
  24.         double tmparea=fabs(cvContourArea(contour));  
  25.         if(tmparea < minarea)   
  26.         {  
  27.             cvSeqRemove(contour,0); //删除面积小于设定值的轮廓  
  28.             continue;  
  29.         }  
  30.         CvRect aRect = cvBoundingRect( contour, 0 );   
  31.         if ((aRect.width/aRect.height)<1)  
  32.         {  
  33.             cvSeqRemove(contour,0); //删除宽高比例小于设定值的轮廓  
  34.             continue;  
  35.         }  
  36.         if(tmparea > maxarea)  
  37.         {  
  38.             maxarea = tmparea;  
  39.             n=m;  
  40.         }  
  41.         m++;  
  42.         //  CvScalar color = CV_RGB( rand()&255, rand()&255, rand()&255 );//创建一个色彩值  
  43.         CvScalar color = CV_RGB( 0, 255,255 );  
  44.   
  45.         //max_level 绘制轮廓的最大等级。如果等级为0,绘制单独的轮廓。如果为1,绘制轮廓及在其后的相同的级别下轮廓。  
  46.         //如果值为2,所有的轮廓。如果等级为2,绘制所有同级轮廓及所有低一级轮廓,诸此种种。  
  47.         //如果值为负数,函数不绘制同级轮廓,但会升序绘制直到级别为abs(max_level)-1的子轮廓。   
  48.         cvDrawContours( dst, contour, color, color, -1, 1, 8 );//绘制外部和内部的轮廓  
  49.     }  
  50.     contour =_contour; /*int k=0;*/  
  51.     int count=0;  
  52.     for( ; contour != 0; contour = contour->h_next )  
  53.     {  
  54.         count++;  
  55.         double tmparea=fabs(cvContourArea(contour));  
  56.         if (tmparea==maxarea /*k==n*/)  
  57.         {  
  58.             CvScalar color = CV_RGB( 255, 0, 0);  
  59.             cvDrawContours( dst, contour, color, color, -1, 1, 8 );  
  60.         }  
  61.         /*k++;*/  
  62.     }  
  63.     printf("The total number of contours is:%d",count);  
  64.     cvNamedWindow( "Components", 1 );  
  65.     cvShowImage( "Components", dst );  
  66.     cvWaitKey(0);  
  67.     cvDestroyWindow( "Source" );  
  68.     cvReleaseImage(&src);  
  69.     cvDestroyWindow( "Components" );  
  70.     cvReleaseImage(&dst);  
  71.     return 0;  
  72. }  
  
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值