用多边形曲线逼近 Freeman 链
CvSeq* cvApproxChains( CvSeq* src_seq, CvMemStorage* storage, int method=CV_CHAIN_APPROX_SIMPLE, double parameter=0, int minimal_perimeter=0, int recursive=0 );
minimal_perimeter
轮廓。其它的链从结果中除去。
src_seq
中利用
h_next
和
v_next links
连接逼近所有可访问的链。如果为 0, 则仅逼近单链。
这是一个单独的逼近程序。 对同样的逼近标识,函数 cvApproxChains 与 cvFindContours 的工作方式一模一样。它返回发现的第一个轮廓的指针。其它的逼近模块,可以用返回结构中的 v_next
和 v_next
域来访问
初始化链读取
void cvStartReadChainPoints( CvChain* chain, CvChainPtReader* reader );
链的指针
reader
链的读取状态
函数 cvStartReadChainPoints初始化一个特殊的读取器 (参考 Dynamic Data Structures 以获得关于集合与序列的更多内容).
得到下一个链的点
CvPoint cvReadChainPoint( CvChainPtReader* reader );
函数 cvReadChainPoint 返回当前链的点,并且更新读取位置。
用指定精度逼近多边形曲线
CvSeq* cvApproxPoly( const void* src_seq, int header_size, CvMemStorage* storage, int method, double parameter, int parameter2=0 );
CV_POLY_APPROX_DP
, 对应 Douglas-Peucker 算法.
CV_POLY_APPROX_DP
它是指定的逼近精度
src_seq
是序列,它表示要么逼近单个序列,要么在
src_seq
的同一个或低级层次上逼近所有序列 (参考 cvFindContours 中对轮廓继承结构的描述). 如果
src_seq
是点集的数组 (CvMat*) , 参数指定曲线是闭合 (
parameter2
!=0) 还是非闭合 (
parameter2
=0).
函数 cvApproxPoly 逼近一个或多个曲线,并返回逼近结果。对多个曲线的逼近,生成的树将与输入的具有同样的结构。(1:1 的对应关系).
计算点集的最外面(up-right)矩形边界
CvRect cvBoundingRect( CvArr* points, int update=0 );
CvMat
)
rect
域得到。 rect
域中 header. 函数 cvBoundingRect 返回二维点集的最外面 (up-right)矩形边界。
计算整个轮廓或部分轮廓的面积
double cvContourArea( const CvArr* contour, CvSlice slice=CV_WHOLE_SEQ );
函数 cvContourArea 计算整个轮廓或部分轮廓的面积。 对后面的情况,面积表示轮廓部分和起始点连线构成的封闭部分的面积。如下图所示:
NOTE: 轮廓的方向影响面积的符号。因此函数也许会返回负的结果。应用函数 fabs()
得到面积的绝对值。
计算轮廓周长或曲线长度
double cvArcLength( const void* curve, CvSlice slice=CV_WHOLE_SEQ, int is_closed=-1 );
函数 cvArcLength 通过依次计算序列点之间的线段长度,并求和来得到曲线的长度。
创建轮廓的继承表示形式
CvContourTree* cvCreateContourTree( const CvSeq* contour, CvMemStorage* storage, double threshold );
函数 cvCreateContourTree 为输入轮廓 contour
创建一个二叉树,并返回树根的指针。如果参数 threshold
小于或等于 0 ,则函数创建一个完整的二叉树。如果 threshold
大于 0 , 函数用 threshold
指定的精度创建二叉树:如果基线的截断区域顶点小于threshold,该数就停止生长并作为函数的最终结果返回。
由树恢复轮廓
CvSeq* cvContourFromContourTree( const CvContourTree* tree, CvMemStorage* storage, CvTermCriteria criteria );
函数 cvContourFromContourTree 从二叉树恢复轮廓。参数 criteria
决定了重构的精度和使用树的数目及层次。所以它可建立逼近的轮廓。 函数返回重构的轮廓。
用树的形式比较两个轮廓
double cvMatchContourTrees( const CvContourTree* tree1, const CvContourTree* tree2, int method, double threshold );
CV_CONTOUR_TREES_MATCH_I1
。
函数 cvMatchContourTrees 计算两个轮廓树的匹配值。从树根开始通过逐层比较来计算相似度。如果某层的相似度小于 threshold
, 则中断比较过程,且返回当前的差值。