1.轮廓提取 FindContours算法
在二值图像中寻找轮廓 int cvFindContours( CvArr* image, 数组
CvMemStorage* storage, 函数
CvSeq** first_contour, 网站
int header_size=sizeof(CvContour), ui
int mode=CV_RETR_LIST, spa
int method=CV_CHAIN_APPROX_SIMPLE, CvPoint offset=cvPoint(0,0) ); 命令行
函数 cvFindContours 从二值图像中提取轮廓,而且返回提取轮廓的数目。指针 first_contour 的内容由函数填写。它包含第一个最外层轮廓的指针,若是指针为 NULL,则没有检测到轮廓(好比图像是全黑的)。其它轮廓能够从 first_contour 利用 h_next 和 v_next 连接访问到。 在 cvDrawContours 的样例显示如何使用轮廓来进行连通域的检测。轮廓也能够用来作形状分析和对象识别 - 见CVPR2001 教程中的 squares 样例。该教程能够在 SourceForge 网站上找到。 翻译
2.轮廓绘制 DrawContours指针
在图像中绘制外部和内部的轮廓。
void cvDrawContours ( CvArr *img, CvSeq* contour, CvScalar external_color, CvScalar hole_color, int max_level, int thickness=1, int line_type=8, CvPoint offset=cvPoint(0,0) );
当thickness>=0,函数cvDrawContours在图像中绘制轮廓,或者当thickness<0时,填充轮廓所限制的区域。对象
3. 轮廓面积 ContourArea
double cvContourArea( const CvArr* contour, CvSliceslice=CV_WHOLE_SEQ );
函数cvContourArea计算整个或部分轮廓的面积。在计算部分轮廓的状况时,由轮廓弧线和链接两端点的弦 围成的区域总面积被计算,以下图所示:
NOTE:
轮廓的位置将影响区域面积的符号,所以函数范围的有多是负值。可使用C运行时函数fabs()来 获得面积的绝对值。
e.g. double area = fabs(cvContourArea(contour));
4. 外接矩形 BoundingRect
计算点集的最外面(up-right)矩形边界 CvRect cvBoundingRect( CvArr* points, int update=0 );
函数 cvBoundingRect 返回二维点集的最外面 (up-right)矩形边界。
/**********************************************************************************/
#include "cv.h"
#include "highgui.h"
int main( int argc, char** argv )
{
IplImage* src;
// 第一条命令行参数肯定了图像的文件名。
if( (src = cvLoadImage("D:\\OpenCV_Test\\res\\women.jpg", 0)) != 0)
{
IplImage* dst = cvCreateImage( cvGetSize(src), 8, 3 );
CvMemStorage* storage = cvCreateMemStorage(0);
CvSeq* contour = 0;
cvThreshold( src, src, 1, 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 );
for( ; contour != 0; contour = contour->h_next )
{
CvScalar color = CV_RGB( rand()&255, rand()&255, rand()&255 );
/* 用1替代 CV_FILLED 所指示的轮廓外形 */
cvDrawContours( dst, contour, color, color, -1, CV_FILLED, 8 );
}
cvNamedWindow( "Components", 1 );
cvShowImage( "Components", dst );
cvWaitKey(0);
}
}
/**********************************************************************************/