OpenCV轮廓特性(二)

来源:互联网 发布:中国移动有5g网络吗 编辑:程序博客网 时间:2024/05/25 08:13

在上一篇的博文中,我们主要给出了cvFindContours()和cvDrawContours()函数的基本用法,结合示例程序,分析了获得图像轮廓和画出显示轮廓的大致的程序思路。在获取轮廓之后,我们要重点分析轮廓的一些性质。轮廓有很多特性,下面我们来逐一看这方面的特性。

(1)轮廓的多边形逼近

轮廓的多边形逼近指的是,使用多边形近似地来表示一个轮廓,这样做的目的在于减少轮廓的顶点数目。OpenCV中给出了一个逼近算法,这个算法的实现函数是cvApproxPoly()。

CvSeq* cvApproxPoly(    const void* src_seq,    int header_size,    CvMemStorage* storage,    int method,//method的取值上篇博文中介绍了    double parameter, //表示逼近的精度    int recursive=0 //指定是否针对全部的轮廓,取0表示只处理src_seq指向轮廓);

简要介绍这个逼近算法的思路,如下图所示:
这里写图片描述

算法先从轮廓(图b)上选择2个最远的点,然后将2个连成一个线段(图c),然后再查找轮廓上到线段距离最远的点,添加到逼近后的新轮廓(图d),算法反复迭代,不断的将最远的点添加到结果中,直到所有的点到多边形的最短距离小于parameter参数指定的精度。

(2)轮廓的关键点

轮廓的关键点指的是那些包含曲线信息比较多的点,在OpenCV中主要给出了IPAN算法,这个算法在OpenCV中给出了函数cvFindDominantPoints()来实现

CvSeq* cvFindDominantPoints(    CvSeq* contour,    CvMemStorage* storage,    int method=CV_DOMINANT_IPAN,    double parameters1=0,    double parameters2=0,    double parameters3=0,    double parameters4=0//参数分别为最短距离,最长距离,相邻距离,最大角度);

这里写图片描述

IPAN算法通过扫描轮廓上并在曲线内部使用可能顶点构造三角形来实现。对于三角形的大小和张角有特殊要求,在比某一特定的全局阈值和它的相邻点的张角小的情况下,具有大张角的点被保留。

(3)轮廓的周长和面积

若要得到轮廓的长度,可以使用以下的函数cvArcLength();
与轮廓的长度相关联的就是轮廓的面积了,可以用函数cvContourArea()。

(4)轮廓的边界

周长和面积只是轮廓的简单特性,更复杂一点的特性应该是矩形边界框、圆形边界框或椭圆边界框。有两种方法可以得到矩形边界框,但是圆形和椭圆形边界框只有一种方法。

矩形:在图像处理系统中提供了一种叫Rectangle的矩形,不过它只能表达边垂直或水平的特例;但也有一种矩形是box的,可以表示任何倾斜的情况。
如果要获取轮廓的Rectangle,可以使用cvBoundingRect()函数。
如果要获取轮廓的Box,可以使用cvMinAreaRect2()函数。

圆形:如果要获取轮廓的圆形边界框,可以使用cvMinEnclosingCircle函数。

椭圆:如果要获取轮廓的椭圆边界框,可以使用cvFitEllipse2函数。

上面就是介绍了如何去分析一个轮廓的特性,分别从周长、面积、边界框等角度去分析轮廓的特征,而这些特征的提取是为了接下来更好的对这些轮廓特征的操作,因此在接下来,我们再去讨论下对轮廓的典型操作,就是轮廓的匹配。

0 0