opencv中连通区域分析
2014-04-19 19:13
357 查看
opencv版本:1.0
部分函数介绍:
1.cvFindContours -提取轮廓,函数原型如下:
2.cvContourArea-计算轮廓面积,函数原型如下:
3.cvBoundingRect-计算包含轮廓的最小矩形,函数原型如下:
4.cvDrawContours-函数原型如下:
下面举个例子说明:
部分函数介绍:
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; }
相关文章推荐
- OpenCV_连通区域分析(Connected Component Analysis/Labeling)
- opencv结构分析与形状识别-轮廓检测和填充(连通区域-边缘与整个图像的目标)
- OpenCV_连通区域分析
- OpenCV 基于轮廓提取的二值图像分析与连通区域标记算法
- OpenCV_连通区域分析
- OpenCV:二值图像连通区域分析与标记算法实现
- OpenCV_连通区域分析(Connected Component Analysis-Labeling)
- OpenCV_连通区域分析(Connected Component Analysis/Labeling)
- OpenCV_连通区域分析(Connected Component Analysis-Labeling)
- OpenCV_连通区域分析与标记(Connected Component Analysis-Labeling)
- OpenCV_连通区域分析(Connected Component Analysis-Labeling)
- OpenCV_连通区域分析与标记(Connected Component Analysis-Labeling
- OpenCV_连通区域分析(Connected Component Analysis-Labeling)
- OpenCV_连通区域分析(Connected Component Analysis/Labeling)
- OpenCV_连通区域分析(Connected Component Analysis-Labeling)
- OpenCV:二值图像连通区域分析与标记算法实现
- OpenCV_连通区域分析(Connected Component Analysis-Labeling)
- OpenCV_连通区域分析(Connected Component Analysis/Labeling)
- OpenCV_连通区域分析与标记
- OpenCV_连通区域分析(Connected Component Analysis-Labeling)