轮廓处理函数详细

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_next 和 v_next links 连接逼近所有可访问的链。如果为 0, 则仅逼近单链。

这是一个单独的逼近程序。 对同样的逼近标识,函数 cvApproxChains 与 cvFindContours 的工作方式一模一样。它返回发现的第一个轮廓的指针。其它的逼近模块,可以用返回结构中的 v_next 和 v_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 计算整个轮廓或部分轮廓的面积。 对后面的情况,面积表示轮廓部分和起始点连线构成的封闭部分的面积。如下图所示:

 

OPENCV <wbr />轮廓处理函数详细

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, 则中断比较过程,且返回当前的差值。


计算几何


MaxRect

对两个给定矩形,寻找矩形边界

CvRect cvMaxRect( const CvRect* rect1, const CvRect* rect2 );  

 

rect1
第一个矩形
rect2
第二个矩形

函数 cvMaxRect 寻找包含两个输入矩形的具有最小面积的矩形边界。

OPENCV <wbr />轮廓处理函数详细


CvBox2D

旋转的二维盒子

typedef struct CvBox2D 
{
     CvPoint2D32f center;
     CvSize2D32f   size;
     float angle;
} CvBox2D;

BoxPoints

寻找盒子的顶点

void cvBoxPoints( CvBox2D box, CvPoint2D32f pt[4] );  

 

box
盒子
pt
顶点数组

函数 cvBoxPoints 计算输入的二维盒子的定点。下面是函数代码:

void cvBoxPoints( CvBox2D box, CvPoint2D32f pt[4] )
{
     float a = (float)cos(box.angle)*0.5f;
     float b = (float)sin(box.angle)*0.5f;
     pt[0].x = box.center.x - a*box.size.height - b*box.size.width;
     pt[0].y = box.center.y + b*box.size.height - a*box.size.width;
     pt[1].x = box.center.x + a*box.size.height - b*box.size.width;
     pt[1].y = box.center.y - b*box.size.height - a*box.size.width;
     pt[2].x = 2*box.center.x - pt[0].x;
     pt[2].y = 2*box.center.y - pt[0].y;
     pt[3].x = 2*box.center.x - pt[1].x;
     pt[3].y = 2*box.center.y - pt[1].y;
}

FitEllipse

二维点集的椭圆拟合

CvBox2D cvFitEllipse2( const CvArr* points );  

 

points
点集的序列或数组

函数 cvFitEllipse 对给定的一组二维点集作椭圆的最佳拟合(最小二乘意义上的)。返回的结构与 cvEllipse 中的意义类似,除了 size 表示椭圆轴的整个长度,而不是一半长度。


FitLine

2D 或 3D 点集的直线拟合

void   cvFitLine( const CvArr* points, int dist_type, double param, double reps, double aeps, float* line );  

 

points
2D 或 3D 点集,32-比特整数或浮点数坐标
dist_type
拟合的距离类型 (见讨论).
param
对某些距离的数字参数,如果是 0, 则选择某些最优值
reps, aeps
半径 (坐标原点到直线的距离) 和角度的精度,一般设为0.01。
line
输出的直线参数。2D 拟合情况下,它是包含 4 个浮点数的数组 (vx, vy, x0, y0),其中 (vx, vy) 是线的单位向量而 (x0, y0) 是线上的某个点. 对 3D 拟合,它是包含 6 个浮点数的数组 (vx, vy, vz, x0, y0, z0), 其中 (vx, vy, vz) 是线的单位向量,而 (x0, y0, z0) 是线上某点。

函数 cvFitLine 通过求 sumiρ(ri) 的最小值方法,用 2D 或 3D 点集拟合直线,其中 ri 是第 i 个点到直线的距离, ρ(r) 是下面的距离函数之一:

dist_type=CV_DIST_L2 (L
2
): ρ(r)=r
2
/2 (最简单和最快的最小二乘法)  

dist_type=CV_DIST_L1 (L
1
): ρ(r)=r  

dist_type=CV_DIST_L12 (L
1
-L
2
): ρ(r)=2•[sqrt(1+r
2
/2) - 1]  

dist_type=CV_DIST_FAIR (Fair): ρ(r)=C
2
•[r/C - log(1 + r/C)],  
C=1.3998
dist_type=CV_DIST_WELSCH (Welsch): ρ(r)=C
2
/2•[1 - exp(-(r/C)
2
)],   C=2.9846  

dist_type=CV_DIST_HUBER (Huber): ρ(r)= r
2
/2,    
if r < C        C•(r-C/2),   
otherwise;    C=1.345

ConvexHull2

发现点集的凸外形

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) 存储,而不是 hull_storage 为数组情况下的顶点形式 (indices) 以及 hull_storag 为内存存储模式下的点集形式(points)。

函数 cvConvexHull2 使用 Sklansky 算法计算 2D 点集的凸外形。如果 hull_storage 是内存存储仓, 函数根据 return_points  的值,创建一个包含外形的点集或指向这些点的指针的序列。

例子. 由点集序列或数组创建凸外形    

(见上一篇文章:凸包的绘制)            


CheckContourConvexity

测试轮廓的凸性

int cvCheckContourConvexity( const CvArr* contour );  

 

contour
被测试轮廓 (点序列或数组).

函数 cvCheckContourConvexity 输入的轮廓是否为凸的。必须是简单轮廓,比如没有自交叉。


CvConvexityDefect

用来描述一个简单轮廓凸性缺陷的结构体

typedef struct CvConvexityDefect 
{
     CvPoint* start;
     CvPoint* end;
     CvPoint* depth_point;
     float depth;
} CvConvexityDefect;

Picture. Convexity defects of hand contour.

OPENCV <wbr />轮廓处理函数详细


ConvexityDefects

发现轮廓凸形缺陷

CvSeq* cvConvexityDefects( const CvArr* contour, const CvArr* convexhull, CvMemStorage* storage=NULL );  

 

contour
输入轮廓
convexhull
用 cvConvexHull2 得到的凸外形,它应该包含轮廓的定点或下标,而不是外形点的本身,即cvConvexHull2 中的参数 return_points 应该设置为 0.
storage
凸性缺陷的输出序列容器。如果为 NULL, 使用轮廓或外形的存储仓。

函数 cvConvexityDefects 发现输入轮廓的所有凸性缺陷,并且返回 CvConvexityDefect 结构序列。


MinAreaRect2

对给定的 2D 点集,寻找最小面积的包围矩形

CvBox2D   cvMinAreaRect2( const CvArr* points, CvMemStorage* storage=NULL );  

 

points
点序列或点集数组
storage
可选的临时存储仓

函数 cvMinAreaRect2 通过建立凸外形并且旋转外形以寻找给定 2D 点集的最小面积的包围矩形.

Picture. Minimal-area bounding rectangle for contour

OPENCV <wbr />轮廓处理函数详细


MinEnclosingCircle

对给定的 2D 点集,寻找最小面积的包围圆形

int cvMinEnclosingCircle( const CvArr* points, CvPoint2D32f* center, float* radius );  

 

points
点序列或点集数组
center
输出参数:圆心
radius
输出参数:半径

函数 cvMinEnclosingCircle 对给定的 2D 点集迭代寻找最小面积的包围圆形。如果产生的圆包含所有点,返回非零。否则返回零(算法失败)。


CalcPGH

计算轮廓的 pair-wise 几何直方图

void cvCalcPGH( const CvSeq* contour, CvHistogram* hist );  

 

contour
输入轮廓,当前仅仅支持具有整数坐标的点集
hist
计算出的直方图,必须是两维的。

函数 cvCalcPGH 计算轮廓的 2D pair-wise(Hunnish: 不知如何翻译,只好保留) 几何直方图 (pair-wise geometrical histogram :PGH), 算法描述见 [Iivarinen97]. 算法考虑的每一对轮廓边缘。计算每一对边缘之间的夹角以及最大最小距离。具体做法是,轮流考虑每一个边缘做为基准,函数循环遍历所有边缘。在考虑基准边缘和其它边缘的时候, 选择非基准线上的点到基准线上的最大和最小距离。边缘之间的角度定义了直方图的行,而在其中增加对应计算出来的最大和最小距离的所有直方块, (即直方图是 [Iivarninen97] 定义中的转置). 该直方图用来做轮廓匹配。

转载于:https://www.cnblogs.com/retrieval/archive/2013/04/26/3044309.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/301442.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html5与课程思政,“课程思政”怎样做

&#xff3b;本站讯 ]为了提升学校教师的课程思政意识和课程思政建设水平,提高课程思政优秀案例征集水平,5月21日,教学促进与教师发展中心举办了课程思政专题线上分享会.中心主任张树永出席会议,120位教师通过雨课堂参加了直播活动.“课程思政”怎样做&#xff1f;教学案例设计…

Windows 11 快速体验:开始菜单居中,全系圆角设计!

系统类型&#xff1a;Windows 11 专业工作站版 系统版本&#xff1a;Dev系统版本号&#xff1a;OS Build 21996.1任务栏 Windows 11 任务栏上的“开始”菜单和应用程序图标由此前 Windows 操作系统中的“左对齐”样式变为“居中”。如果你不喜欢“居中”可以通过个性化设置更改…

数学建模,还得这样学!

最近天气逐渐晴朗回温&#xff08;伊芙布德干内库毛德川状态暂时告一阶段&#xff09;&#xff0c;数学建模的热度也在逐步回温&#xff08;据说大家开始了数学建模知识储备&#xff09;&#xff0c;常有小伙伴私聊小天咨询关于数学建模的事情。春节假期也已经过去&#xff0c;…

测试Live Writer 发表博客

2019独角兽企业重金招聘Python工程师标准>>> 测试成功&#xff01;&#xff01;&#xff01; 转载于:https://my.oschina.net/bonelwh/blog/125845

WPF 菜单栏滚动到顶部后固定的两种方法

最近项目中有这么个需求&#xff1a;菜单栏滚动到顶部后固定在顶部&#xff0c;专业的名词叫吸顶。。这在移动端还是比较常见的。看看效果&#xff1a;下面直接看看代码喽&#xff0c;代码不多&#xff1a;第一种方法思路&#xff1a;写一个和菜单一模一样的菜单&#xff0c;放…

eeprom 数据偶尔变成ff_关于水电站冗余配置下监控系统下发调节令偶尔不动作的案例分析...

点击上方“E小水电”&#xff0c;“星标或置顶公众号”关键时刻&#xff0c;第一时间送达摘要&#xff1a;吉勒布拉克水电站冗余配置下机组PLC组网运行&#xff0c;后台监控系统下发调节令&#xff0c;调节不动作或偶尔动作现象分析。引言吉勒布拉克机组自动化控制为冗余主备双…

美国明确警告德国,3G退网5G手机不需要换号,抽烟酗酒学生不能认定为家庭经济困难,大学食堂凭运动步数打折,这就是今天的大新闻。...

今天是3月13日农历二月初七今天星期三一切都风平浪静下面是今天的大新闻美国明确警告德国放弃华为&#xff08;环球新闻&#xff09;7日&#xff0c;德国经济部长彼得•阿尔特迈尔(PeterAltmaier)明确表态&#xff0c;德国不想将华为排除在本国5G建设外。随后&#xff0c;这位部…

【bayes】贝叶斯likelihood和model

1&#xff09;Likelihood 最大似然估计提供了一种给定观察数据来评估模型参数的方法&#xff0c;即&#xff1a;“模型已定&#xff0c;参数未知”。 简单而言&#xff0c;假设我们要统计全国人口的身高&#xff0c;首先假设这个身高服从服从正态分布&#xff0c;但是该分布的均…

abb限位开关已打开drv1_广告雕刻机限位开关触发

广告雕刻机限位开关触发&#xff1f;广告雕刻机是指专门用于广告行业的设备&#xff0c;是专门为广告而研发的设备。广告雕刻机当然也可以用于其他行业&#xff0c;例如工艺品行业、家具行业、模型行业等。今天我们重点说下“广告雕刻机限位开关触发”。市面上常见的PVC字广告雕…

有趣的灵魂,从高质量的阅读开始

王小波说&#xff1a;我活在世上&#xff0c;无非想要明白些道理&#xff0c;遇见些有趣的事&#xff0c;倘能如我所愿&#xff0c;我的一生就算成功。如果不能行万里路&#xff0c;那就从阅读一篇文章开始。不积跬步&#xff0c;无以至千里。不积小流&#xff0c;无以成江海。…

面向.NET开发人员的Dapr——俯瞰Dapr

目录&#xff1a;面向.NET开发人员的Dapr——前言面向.NET开发人员的Dapr——分布式世界Dapr at 20,000 feet俯瞰DaprIn chapter 1, we discussed the appeal of distributed microservice applications. But, we also pointed out that they dramatically increase architectu…

k8s创建pod加入容器_K8S架构原理及其工作流程

K8S容器编排系统容器编排系统需要满足的条件&#xff1a;服务注册&#xff0c;服务发现负载均衡配置、存储管理健康检查自动扩缩容零宕机K8S整体架构图K8S整体架构Kubernetes采用主从分布式架构&#xff0c;包括Master(主节点)、Worker(从节点或工作节点)&#xff0c;以及客户端…

每日一笑 | 程序员的招租公告

全世界只有3.14 % 的人关注了数据与算法之美&#xff08;图片来源于网络&#xff0c;侵权删&#xff09;

无需羡慕,今后.NET开发想拿30k也可以毫不费劲!

7月将至&#xff0c;半年已逝&#xff0c;码农枯燥而简单的生活中&#xff0c;时间过得飞快&#xff01;错过金三银四的小伙伴&#xff0c;转头发现金九银十不远了。业内公认的&#xff0c;涨薪最快的方式还是跳槽&#xff01;年初跳槽季&#xff0c;腾讯、阿里、百度、京东、小…

移动计算机怎么开机密码,win7忘记开机密码解决办法

设置电脑开机密码后我们每次开启电脑都需要输入开机密码才可以进入系统桌面进行使用&#xff0c;如果没有密码的话系统是无法开启的&#xff0c;这就保证了我们电脑使用的隐私性&#xff0c;但是并不是说所有的电脑都适合设置密码&#xff0c;部分场景下的电脑设置密码的话有可…

双缓冲技术

2019独角兽企业重金招聘Python工程师标准>>> package com.gavin; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.Canvas; import android.graphics.Paint; import andro…

java 8 排序_一遍记住 8 种排序算法与 Java 代码实现

☞ 程序员进阶必备资源免费送「21种技术方向&#xff01;」 ☜作者&#xff1a;KaelQ&#xff0c;www.jianshu.com/p/5e171281a3871.直接插入排序经常碰到这样一类排序问题&#xff1a;把新的数据插入到已经排好的数据列中。将第一个数和第二个数排序&#xff0c;然后构成一个有…

中小学将逐步推广编程教育;勒索病毒攻击部分政府部门和医院;国内外药企密集调价;微软要给Win7用户推死亡通知,这就是今天的大新闻...

今天是3月14日农历二月初八今天星期四看天气预报接下来几天又是雨季大家记得出门带伞下面是今天的大新闻中小学要逐步推广编程教育&#xff08;北京日报&#xff09;13日教育部公布的《2019年教育信息化和网络安全工作要点》透露&#xff0c;今年将启动中小学生信息素养测评&am…

开源高性能RISC-V处理器“香山”问世

今日&#xff0c;“香山”开源高性能RISC-V处理器问世。据行业人士介绍&#xff0c;这是计算所牵头&#xff0c;多家企业联合开发的开源处理器核&#xff0c;源代码和所有设计文档都开源。从PPT的内容上看&#xff0c;“香山”基于Chisel语言开发&#xff0c;支持多核&#xff…

《PowerShell 3.0 Advanced Admin handbook》已于今日上市

工作之余与埃及MVP Sherif Talaat合著的全英文书籍《PowerShell 3.0 Advanced Admin handbook》于今日由Packt Publishing正式出版上市&#xff0c;本书基于PowerShell3.0版本&#xff0c;历时8个月&#xff0c;从2012年8月16日Packt Publishing发邮件找我们约稿&#xff0c;经…