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;
}