您的位置:首页 > 运维架构

OpenCV图像中寻找最大区域Max_Area

2016-04-08 00:00 281 查看
摘要: a. 二值化
b. 得到轮廓的个数
c. 将面积小于100的轮廓删除
d. 将宽、高 比例小于1的轮廓删除

e. 把面积最大的轮廓用红色框框画出来

#include "stdafx.h"

#include "cv.h"

#include "highgui.h"

int main( int argc, char** argv )

{

IplImage* src;

src=cvLoadImage("D:/Demo.jpg",CV_LOAD_IMAGE_GRAYSCALE);

IplImage* dst = cvCreateImage( cvGetSize(src), 8, 3 );

CvMemStorage* storage = cvCreateMemStorage(0);

CvSeq* contour = 0;

cvThreshold( src, src,120, 255, CV_THRESH_BINARY );//二值化

cvNamedWindow( "Source", 1 );

cvShowImage( "Source", src );

//提取轮廓

cvFindContours( src, storage, &contour, sizeof(CvContour), CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );

cvZero( dst );//清空数组

CvSeq* _contour =contour;

double maxarea=0;

double minarea=100;

int n=-1,m=0;//n为面积最大轮廓索引,m为迭代索引

for( ; contour != 0; contour = contour->h_next )

{

double tmparea=fabs(cvContourArea(contour));

if(tmparea < minarea)

{

cvSeqRemove(contour,0); //删除面积小于设定值的轮廓

continue;

}

CvRect aRect = cvBoundingRect( contour, 0 );

if ((aRect.width/aRect.height)<1)

{

cvSeqRemove(contour,0); //删除宽高比例小于设定值的轮廓

continue;

}

if(tmparea > maxarea)

{

maxarea = tmparea;

n=m;

}

m++;

//  CvScalar color = CV_RGB( rand()&255, rand()&255, rand()&255 );//创建一个色彩值

CvScalar color = CV_RGB( 0, 255,255 );

//max_level 绘制轮廓的最大等级。如果等级为0,绘制单独的轮廓。如果为1,绘制轮廓及在其后的相同的级别下轮廓。

//如果值为2,所有的轮廓。如果等级为2,绘制所有同级轮廓及所有低一级轮廓,诸此种种。

//如果值为负数,函数不绘制同级轮廓,但会升序绘制直到级别为abs(max_level)-1的子轮廓。

cvDrawContours( dst, contour, color, color, -1, 1, 8 );//绘制外部和内部的轮廓

}

contour =_contour; /*int k=0;*/

int count=0;

for( ; contour != 0; contour = contour->h_next )

{

count++;

double tmparea=fabs(cvContourArea(contour));

if (tmparea==maxarea /*k==n*/)

{

CvScalar color = CV_RGB( 255, 0, 0);

cvDrawContours( dst, contour, color, color, -1, 1, 8 );

}

/*k++;*/

}

printf("The total number of contours is:%d",count);

cvNamedWindow( "Components", 1 );

cvShowImage( "Components", dst );

cvWaitKey(0);

cvDestroyWindow( "Source" );

cvReleaseImage(&src);

cvDestroyWindow( "Components" );

cvReleaseImage(&dst);

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: