一、概括
理解物体形状或轮廓的另外一种有用的方法是计算一个物体的凸包(convex hull)然后计算其凸缺陷(convexity defects)。很多复杂物体的特性能很好的被这种缺陷表现出来。
二、相关函数
1、发现点集的凸外形
CvSeq* cvConvexHull2( const CvArr* input, void* hull_storage=NULL,
int orientation=CV_CLOCKWISE,
int return_points=0 );
points
2D 点集的序列或数组,32-比特整数或浮点数坐标
hull_storage
输出的数组(CvMat*) 或内存缓存 (CvMemStorage*),用以存储凸外形。 如果是数组,则它应该是一维的,而且与输入的数组/序列具有同样数目的元素。输出时,通过修改头结构将数组裁减到凸外形的尺寸。
orientation
凸外形的旋转方向: 逆时针或顺时针 (CV_CLOCKWISE or CV_COUNTER_CLOCKWISE)
return_points
如果非零,hull_storage 为数组情况下,点集将以外形 (hull) 存储,而不是顶点形式 (indices)。如果 hull_storag 为内存存储模式下则存储为点集形式(points)。
函数 cvConvexHull2 使用 Sklansky 算法计算 2D 点集的凸外形。如果 hull_storage 是内存存储仓, 函数根据 return_points 的值,创建一个包含外形的点集或指向这些点的指针的序列。
2、测试轮廓的凸性
int cvCheckContourConvexity( const CvArr* contour );
contour
被测试轮廓 (点序列或数组).
函数 cvCheckContourConvexity 输入的轮廓是否为凸的。必须是简单轮廓,比如没有自交叉。
3、发现轮廓凸形缺陷
CvSeq* cvConvexityDefects( const CvArr* contour, const CvArr* convexhull,
CvMemStorage* storage=NULL );
contour
输入轮廓
convexhull
用 cvConvexHull2 得到的凸外形,它应该包含轮廓的定点的指针或下标,而不是外形点的本身,即cvConvexHull2 中的参数 return_points 应该设置为 0.
storage
凸性缺陷的输出序列容器。如果为 NULL, 使用轮廓或外形的存储仓。
函数 cvConvexityDefects 发现输入轮廓的所有凸性缺陷,并且返回 CvConvexityDefect 结构序列。