OpenCV 轮廓基本特征

一、概述

我们通过cvFindContours( )函数获取得图像轮廓有何作用呢?一般来说,我们对轮廓常用的操作有识别和处理,另外相关的还有多种对轮廓的处理,如简化或拟合轮廓,匹配轮廓到模板,等等。

我们在轮廓处理中经常需要对轮廓变化一些特征进行概括,比如长度或者一些反映轮廓整体大小的度量。另外轮廓矩也是概括轮廓的特征的重要方法。

二、常见特征函数

1、多边形逼近

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 的对应关系).
当我们绘制一个多边形或者进行形状分析的时候,通常需要使用多边形逼近一个轮廓,使得顶点数目变少。

2、计算轮廓周长或曲线长度

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 通过依次计算序列点之间的线段长度,并求和来得到曲线的长度。

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

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

contour

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

slice

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

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

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

4、计算点集的最外面(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)矩形边界。

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

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

points

点序列或点集数组

storage

可选的临时存储仓

函数 cvMinAreaRect2 通过建立凸外形并且旋转外形以寻找给定 2D 点集的最小面积的包围矩形。这个长方形很有可能是倾斜的。

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

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

points

点序列或点集数组

center

输出参数:圆心

radius

输出参数:半径

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

7、二维点集的椭圆拟合

CvBox2D cvFitEllipse2( const CvArr* points );

points

点集的序列或数组

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

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

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

rect1

第一个矩形

rect2

第二个矩形

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

9、寻找盒子的顶点

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

box 盒子

pt  顶点数组

函数 cvBoxPoints 计算输入的二维盒子的顶点。

10、测试点是否在多边形中

double cvPointPolygonTest( const CvArr* contour, CvPoint2D32f pt, int measure_dist );

contour

输入轮廓.

pt

针对轮廓需要测试的点。

measure_dist

如果非0,函数将估算点到轮廓最近边的距离。

函数cvPointPolygonTest 决定测试点是否在轮廓内,轮廓外,还是轮廓的边上(或者共边的交点上),它的返回值是正负零,相对应的,当measure_dist=0时,返回值是1, -1,0, 同样当 measure_dist≠0 ,它是返回一个从点到最近的边的带符号距离。

时间: 2024-10-11 00:26:21

OpenCV 轮廓基本特征的相关文章

[转载]转载,opencv轮廓查找,匹配以及特征提取,实例

已有 9450 次阅读 2012-3-15 20:50 |系统分类:科研笔记|关键词:opencv 轮廓 轮廓的查找.表达.绘制.特性及匹配(How to Use Contour? Find, Component, Construct, Features & Match) 作者:王先荣 前言    轮廓是构成任何一个形状的边界或外形线.前面讲了如何根据色彩及色彩的分布(直方图对比和模板匹配)来进行匹配,现在我们来看看如何利用物体的轮廓.包括以下内容:轮廓的查找.表达方式.组织方式.绘制.特性.匹

OpenCV &mdash;&mdash; 轮廓

把检测出的边缘像素组装成轮廓  --  cvFindContours   OpenCV 使用内存存储器来统一管理各种动态对象的内存.内存存储器在底层被实现为一个有许多相同大小的内存块组成的双向链表 内存储器可以通过四个函数访问 : cvCreateMemStorage(创建一个内存存储器,0采用默认大小)    cvReleaseMemStorage   cvClearMemStorage(和通常释放内存的函数区别 -- 只是将释放的内存返还给内存存储器,而并不返还给系统 -- 可以重复使用内存

opencv提取surf特征点出现的错误

opencv实现surf特征的提取.本来是一个非常easy的代码,结果我执行时却出现了各种错误,以下来谈谈我出现的错误及问题的解决过程. 首先,我把提取surf特征的过程整合成了一个函数,我单独建立一个project读取两张图片,然后调用这个surf提取的函数时时不管是debug还是release模式下都是没有问题的.当我把这个函数加入到我如今已有的project代码里面的时候出现了各种奇葩错误.以下是我surf特征提取的函数 void surfdetect(IplImage *image1,I

【OpenCV入门教程之十八】OpenCV仿射变换 &amp; SURF特征点描述合辑

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/33320997 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 知乎:http://www.zhihu.com/people/mao-xing-yun 邮箱: [email protected] 写作当前博文时配套使用的OpenCV版本: 2.4.9 本篇文章中,我们一起探讨了OpenCV中

OpenCV仿射变换 &amp; SURF特征点描述合辑

OpenCV仿射变换 & SURF特征点描述合辑 转载地址:http://blog.csdn.net/poem_qianmo/article/details/33320997?utm_source=tuicool&utm_medium=referral

OpenCV轮廓检测,计算物体旋转角度

效果还是有点问题的,希望大家共同探讨一下 // FindRotation-angle.cpp : 定义控制台应用程序的入口点. // // findContours.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include <vector> #include <opencv2/opencv.hpp> #include <opencv2/core/core.h

学习OpenCV——Surf(特征点篇)&amp;flann

Surf(Speed Up Robust Feature) Surf算法的原理                                                                            1.构建Hessian矩阵构造高斯金字塔尺度空间 其实surf构造的金字塔图像与sift有很大不同,就是因为这些不同才加快了其检测的速度.Sift采用的是DOG图像,而surf采用的是Hessian矩阵行列式近似值图像.Hessian矩阵是Surf算法的核心,为了方便运

opencv图像匹配常用特征点

特征点又称兴趣点.关键点,它是在图像中突出且具有代表意义的一些点,通过这些点我们可以用来识别图像.进行图像配准.进行3D重建等.本文主要介绍OpenCV中几种定位与表示关键点的函数. 一.Harris角点 角点是图像中最基本的一种关键点,它是由图像中一些几何结构的关节点构成,很多都是线条之间产生的交点.Harris角点是一类比较经典的角点类型,它的基本原理是计算图像中每点与周围点变化率的平均值.    (1)   (2) 其中I(x+u,y+u)代表了点(x,y)邻域点的灰度值.通过变换可以将上

Opencv得到HOG特征(HOGDescriptor 的使用)

个人觉得很多的博客都是从这里抄的:http://www.cnblogs.com/justany/archive/2012/12/03/2790548.html 直接说怎么用吧. 包含头文件:和一般的opencv程序无特殊的区别 需要加入的库:opencv_objdetect244.lib(realease中的 debug加一个d,配置的人应该都懂) 基本的使用:(两行代码) HOGDescriptor *desc=new HOGDescriptor(cvSize(40,80),cvSize(10