OpenCV中常用到的轮廓处理函数汇总

本文介绍了一系列用于处理图像轮廓的技术,包括用多边形曲线逼近Freeman链、计算轮廓的最外面矩形边界、计算轮廓面积和周长等。此外还讨论了如何创建轮廓的继承表示形式、从树恢复轮廓以及用树的形式比较两个轮廓。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自:http://fsa.ia.ac.cn/opencv-doc-cn/opencv-doc-cn-0.9.7/ref/opencvref_cv.cn.htm

 

 

ApproxChains

用多边形曲线逼近 Freeman 链

CvSeq* cvApproxChains( CvSeq* src_seq, CvMemStorage* storage,
                       int method=CV_CHAIN_APPROX_SIMPLE,
                       double parameter=0, int minimal_perimeter=0, int recursive=0 );

 

src_seq

涉及其它链的链指针

storage

存储多边形线段位置的缓存

method

逼近方法 (见函数 cvFindContours 的描述).

parameter

方法参数(现在不用).

minimal_perimeter

仅逼近周长大于 minimal_perimeter  轮廓。其它的链从结果中除去。

recursive

如果非 0, 函数从 src_seq 中利用 h_nextv_next links 连接逼近所有可访问的链。如果为 0, 则仅逼近单链。

这是一个单独的逼近程序。 对同样的逼近标识,函数 cvApproxChains 与 cvFindContours 的工作方式一模一样。它返回发现的第一个轮廓的指针。其它的逼近模块,可以用返回结构中的 v_nextv_next 域来访问


StartReadChainPoints

初始化链读取

void cvStartReadChainPoints( CvChain* chain, CvChainPtReader* reader );

 

chain 

     链的指针

reader 

     链的读取状态

函数 cvStartReadChainPoints初始化一个特殊的读取器 (参考 Dynamic Data Structures 以获得关于集合与序列的更多内容).


ReadChainPoint

得到下一个链的点

CvPoint cvReadChainPoint( CvChainPtReader* reader );

 

reader

链的读取状态

函数 cvReadChainPoint 返回当前链的点,并且更新读取位置。


ApproxPoly

用指定精度逼近多边形曲线

CvSeq* cvApproxPoly( const void* src_seq, int header_size, CvMemStorage* storage,
                     int method, double parameter, int parameter2=0 );

 

src_seq

点集数组序列

header_size

逼近曲线的头尺寸

storage

逼近轮廓的容器。如果为 NULL, 则使用输入的序列

method

逼近方法。目前仅支持 CV_POLY_APPROX_DP , 对应 Douglas-Peucker 算法.

parameter

方法相关参数。对 CV_POLY_APPROX_DP 它是指定的逼近精度

parameter2

如果 src_seq 是序列,它表示要么逼近单个序列,要么在 src_seq 的同一个或低级层次上逼近所有序列 (参考 cvFindContours 中对轮廓继承结构的描述). 如果 src_seq 是点集的数组 (CvMat*) , 参数指定曲线是闭合 (parameter2!=0) 还是非闭合 (parameter2=0).

函数 cvApproxPoly 逼近一个或多个曲线,并返回逼近结果。对多个曲线的逼近,生成的树将与输入的具有同样的结构。(1:1 的对应关系).


BoundingRect

计算点集的最外面(up-right)矩形边界

CvRect cvBoundingRect( CvArr* points, int update=0 );

 

points

二维点集,点的序列或向量 (CvMat

update

更新标识。下面是轮廓类型和标识的一些可能组合:

  • update=0, contour ~ CvContour*: 不计算矩形边界,但直接由轮廓头的 rect 域得到。
  • update=1, contour ~ CvContour*: 计算矩形边界,而且将结果写入到轮廓头的 rect 域中 header.
  • update=0, contour ~ CvSeq* or CvMat*: 计算并返回边界矩形
  • update=1, contour ~ CvSeq* or CvMat*: 产生运行错误 (runtime error is raised)

函数 cvBoundingRect 返回二维点集的最外面 (up-right)矩形边界。


ContourArea

计算整个轮廓或部分轮廓的面积

double cvContourArea( const CvArr* contour, CvSlice slice=CV_WHOLE_SEQ );

 

contour

轮廓 (定点的序列或数组).

slice

感兴趣轮廓部分的起始点,缺省是计算整个轮廓的面积。

函数 cvContourArea 计算整个轮廓或部分轮廓的面积。 对后面的情况,面积表示轮廓部分和起始点连线构成的封闭部分的面积。如下图所示:

 

NOTE: 轮廓的方向影响面积的符号。因此函数也许会返回负的结果。应用函数 fabs() 得到面积的绝对值。


ArcLength

计算轮廓周长或曲线长度

double cvArcLength( const void* curve, CvSlice slice=CV_WHOLE_SEQ, int is_closed=-1 );

 

curve

曲线点集序列或数组

slice

曲线的起始点,缺省是计算整个曲线的长度

is_closed

表示曲线是否闭合,有三种情况:

  • is_closed=0 - 假设曲线不闭合
  • is_closed>0 - 假设曲线闭合
  • is_closed<0 - 若曲线是序列,检查 ((CvSeq*)curve)->flags 中的标识 CV_SEQ_FLAG_CLOSED 来确定曲线是否闭合。否则 (曲线由点集的数组 (CvMat*) 表示) 假设曲线不闭合。

函数 cvArcLength 通过依次计算序列点之间的线段长度,并求和来得到曲线的长度。


CreateContourTree

创建轮廓的继承表示形式

CvContourTree* cvCreateContourTree( const CvSeq* contour, CvMemStorage* storage, double threshold );

 

contour

输入的轮廓

storage

输出树的容器

threshold

逼近精度

函数 cvCreateContourTree 为输入轮廓 contour  创建一个二叉树,并返回树根的指针。如果参数 threshold 小于或等于 0 ,则函数创建一个完整的二叉树。如果 threshold  大于 0 , 函数用 threshold 指定的精度创建二叉树:如果基线的截断区域顶点小于threshold,该数就停止生长并作为函数的最终结果返回。


ContourFromContourTree

由树恢复轮廓

CvSeq* cvContourFromContourTree( const CvContourTree* tree, CvMemStorage* storage,
                                 CvTermCriteria criteria );

 

tree

轮廓树

storage

重构的轮廓容器

criteria

停止重构的准则

函数 cvContourFromContourTree 从二叉树恢复轮廓。参数 criteria 决定了重构的精度和使用树的数目及层次。所以它可建立逼近的轮廓。 函数返回重构的轮廓。


MatchContourTrees

用树的形式比较两个轮廓

double cvMatchContourTrees( const CvContourTree* tree1, const CvContourTree* tree2,
                            int method, double threshold );

 

tree1

第一个轮廓树

tree2

第二个轮廓树

method

相似度。仅支持 CV_CONTOUR_TREES_MATCH_I1

threshold

相似度阈值

函数 cvMatchContourTrees 计算两个轮廓树的匹配值。从树根开始通过逐层比较来计算相似度。如果某层的相似度小于  threshold, 则中断比较过程,且返回当前的差值。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值