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

opencv中连通区域分析

2014-04-19 19:13 357 查看
opencv版本:1.0

部分函数介绍:

1.cvFindContours -提取轮廓,函数原型如下:

/* Retrieves outer and optionally inner boundaries of white (non-zero) connected
components in the black (zero) background */
CVAPI(int)  cvFindContours( CvArr* image, CvMemStorage* storage, CvSeq** first_contour,
int header_size CV_DEFAULT(sizeof(CvContour)),
int mode CV_DEFAULT(CV_RETR_LIST),
int method CV_DEFAULT(CV_CHAIN_APPROX_SIMPLE),
CvPoint offset CV_DEFAULT(cvPoint(0,0)));


2.cvContourArea-计算轮廓面积,函数原型如下:

/* Calculates area of a contour or contour segment */
CVAPI(double)  cvContourArea( const CvArr* contour,
CvSlice slice CV_DEFAULT(CV_WHOLE_SEQ),
int oriented CV_DEFAULT(0));


3.cvBoundingRect-计算包含轮廓的最小矩形,函数原型如下:

/* Calculates contour boundning rectangle (update=1) or
just retrieves pre-calculated rectangle (update=0) */
CVAPI(CvRect)  cvBoundingRect( CvArr* points, int update CV_DEFAULT(0) );


4.cvDrawContours-函数原型如下:

/* Draws contour outlines or filled interiors on the image */
CVAPI(void)  cvDrawContours( CvArr *img, CvSeq* contour,
CvScalar external_color, CvScalar hole_color,
int max_level, int thickness CV_DEFAULT(1),
int line_type CV_DEFAULT(8),
CvPoint offset CV_DEFAULT(cvPoint(0,0)));


下面举个例子说明:

#include <stdio.h>
#include <cv.h>
#include <highgui.h>

int main( int argc, char** argv )
{
IplImage* src = cvLoadImage("../win.png", CV_LOAD_IMAGE_GRAYSCALE);
IplImage* dst = cvCreateImage(cvGetSize(src), 8, 3);
CvMemStorage* storage = cvCreateMemStorage(0);

cvNamedWindow("源图像", 1);
cvShowImage("源图像", src);

CvSeq* contour = 0;
// 二值化(0/255)
cvThreshold(src, src,120, 255, CV_THRESH_BINARY);
cvNamedWindow("二值图", 1);
cvShowImage("二值图", src);

// 提取轮廓
int contour_num = 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 m = 0;

//遍历轮廓()
for( ; contour != 0; contour = contour->h_next )
{

double tmparea = fabs(cvContourArea(contour));
//删除面积小于100的轮廓
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;
}
m++;

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

//max_level 绘制轮廓的最大等级。
//如果等级为0,绘制单独的轮廓。
//如果为1,绘制轮廓及在其后的相同的级别下轮廓
//如果值为2,所有的轮廓。如果等级为2,绘制所有同级轮廓及所有低一级轮廓,诸此种种
//如果值为负数,函数不绘制同级轮廓,但会升序绘制直到级别为abs(max_level)-1的子轮廓

/* Draws contour outlines or filled interiors on the image */
/*CVAPI(void)  cvDrawContours( CvArr *img, CvSeq* contour,
CvScalar external_color, CvScalar hole_color,
int max_level, int thickness CV_DEFAULT(1),
int line_type CV_DEFAULT(8),
CvPoint offset CV_DEFAULT(cvPoint(0,0)));*/
//1.img=dst 2.contour=contour 3.external_color=color 4.hole_color=color 5.max_level=-1
int max_level = 0;
cvDrawContours(dst, contour, color, color, max_level, 1, 8);	//绘制外部和内部的轮廓
}   //轮廓遍历结束

//重新赋值
contour = _contour;
int count = 0;

//遍历轮廓,绘制面积最大的轮廓
for(; contour != 0; contour = contour->h_next)
{
count++;
double tmparea = fabs(cvContourArea(contour));
//绘制面积最大的轮廓
if (tmparea == maxarea)
{
CvScalar color = CV_RGB( 255, 0, 0); //红色
cvDrawContours(dst, contour, color, color, -1, 1, 8);
}
}

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

cvNamedWindow("Components", 1);
cvShowImage("Components", dst);
cvWaitKey(0);

cvDestroyWindow("二值图");
cvReleaseImage(&src);
cvDestroyWindow("Components");
cvReleaseImage(&dst);

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