opencv轮廓学习总结

最近几天学习了好多opencv里有关轮廓查找与绘制的函数,想做一下整理,把所有学的函数列出来,以便于统一思考一下,怎样充分的运用它们做一些自己想做的事情。就比如我最近参加一个比赛,负责做我们项目里的动作行为识别,轮廓识别就是首当其冲的一个研究点。

今天把它们列在这里,也希望可以帮到各位博客友人,以便于思考解决你们想做的事情。

1、什么是轮廓?

轮廓可以简单认为成将连续的点(连着边界)连在一起的曲线,具有相同的颜色或者灰度,提取轮廓就是提取这些具有相同颜色或者灰度的曲线,或者说是连通域,轮廓在形状分析和物体的检测和识别中非常有用。

注意事项:

为了更加准确,要使用二值化图像。在寻找轮廓之前,要进行阈值化处理
    或者
Canny 边界检测
查找轮廓的函数会修改原始图像。如果你在找到轮廓之后还想使用原始图
    像的话,你应该将原始图像存储到其他变量
(clone(), copyTo())

③在OpenCV中,查找轮廓就像在黑色背景中找白色物体。你应该记住,
    要找的物体应该是白色而背景应该是黑色

2、开始上函数!

(1)查找轮廓---findContours()


image: 输入图像 , Mat 类型 8 位单通道图像 ( 一般为二值图 )
contours: 检测到的轮廓 , 每个轮廓存储为一个点向量 , Point 类型的 vector 表示
hierarchy : 可选的输出向量 , 包含图像的拓扑信息。其作为轮廓数量的表示 , 包含了许多元素 , 每个轮廓 contours[ i ] 对应 4 hierarchy 元素 hierarchy[ i ][0]~ hierarchy[ i ][3], 分别表示后一轮廓、前一轮廓、父轮廓、内嵌轮廓的索引编号 , 如果没有对应项 , 设置为负数
mode: 轮廓检索模式 , 取值如下 :

    CV_RETR_EXTERNAL=0-----表示只检测最外层轮廓

   CV_RETR_LIST=1------提取所有轮廓并放置在list, 轮廓不建立等级关系

    CV_RETR_CCOMP=2------提取所有轮廓并组织为双层结构

   CV_RETR_TREE=3------提取所有轮廓并重新建立网状轮廓结构

method: 轮廓的近似方法
o ffset: 每个轮廓的可选偏移量 , 默认值 Point()
例子:


(2)绘制轮廓---drawContours()


image: 目标图像 , Mat 类型对象即可
contours: 所有的输入轮廓 , 每个轮廓存储为一个点向量
contourIdx : 轮廓绘制指示变量 ( 索引 ), 若为负值 , 则表示绘制所有轮廓
color : 绘制轮廓的颜色
thickness : 轮廓线条的粗细 , 默认值 1, 如果为负值 , 则绘制轮廓内部 , 可选宏 CV_FILLED
lineType : 线条类型 , 默认值 8
h ierarcy : 可选的层次结构信息 , 默认值 noArray ()
maxLevel : 表示用于绘制轮廓的最大等级 , 默认值 INT_MAX
o ffset: 可选的轮廓偏移参数 , 默认值 Point()
例子:


(3)寻找凸包---convexHull()


points: 输入的二维点集 , 可以填 Mat 类型或 std ::vector
hull: 函数调用后找到的凸包
clockwise: 操作方向标志符 , 当为 true , 输出的凸包为顺时针方向 , false 为逆时针方向 ( 假定坐标系 x 轴指向右, y 轴指向上方 )
returnPoints : 操作标志符 , 默认值 true. 当标志符为 true , 函数返回凸包各个点 , 否则返回凸包各点的指数 , 当输出数组是 std ::vector , 此标志被忽略
例子1:
例子2:

(4)凸包缺陷分析---convexityDefects()

contour: 表示输入参数检测到的轮廓 , 可以用 findContours 函数获得
convexhull : 输入参数表示检测到的凸包 , 可以用 convexHull 函数获得
convexityDefects : 检测到的最终结果 , 应为 vector<vector<Vec4i>> 类型 , Vec4i 存储了起始点、结束点、距离及最远点到凸包的距离

(5)轮廓外接矩形---boundingRect()


points: 输入的二维点集 , 可以填 Mat 类型或 std ::vector
返回 : Rect 类矩形对象
例子:

(6)轮廓最小外接矩形---minAreaRect()


points: 输入的二维点集 , 可以填 Mat 类型或 std ::vector
返回 : RotatedRect 类矩形对象 , 外接旋转矩形主要成员有 center size angle points

例子:


(7)轮廓最小外接圆---minEnclosingCircle()


points: 输入的二维点集 , 可以填 Mat 类型或 std ::vector
c enter: Point2f& 类型的 center, 圆的输出圆心
r adius: float& 类型 , 表示圆的输出半径

(8)轮廓椭圆拟合---fitEllipse()

points: 输入的二维点集 , 可以填 Mat 类型或 std ::vector

返回: RotatedRect类旋转矩形对象

(9)逼近多边形曲线---approxPolyDP()


curve: 输入的二维点集 , 可以填 Mat 类型或 std ::vector
approxCurve : 多边形逼近的结果 , 其类型和输入二维点集类型一致
e psilon: 逼近的精度 , 为原始曲线和近似曲线间的最大值
c losed: 如果其为真 , 则近似的曲线为封闭曲线 , 否则近似的曲线不封闭

(10)计算轮廓面积---contourArea()

contour: 输入的二维点集或轮廓 , 可以填 Mat 类型或 std ::vector
oriented: 默认值 false, 表示返回面积为绝对值 , 负责带符号
返回值 : double 类型返回轮廓面积


(11)计算轮廓长度---arcLength()


curve: 输入的二维点集 , 可以填 Mat 类型或 std ::vector
colsed : 用于指示曲线是否封闭的标识符 , 默认值 true, 表示曲线封闭
返回值 : double 类型返回轮廓长度


(12)计算点与轮廓的距离及位置关系---pointPolygonTest()

contour: 所需检测的轮廓对象
pt : Point2f 类型的 pt , 待判定位置的点
measureDist : 是否计算距离的标志 , 当其为 true , 计算点到轮廓的最短距离 , 当其为 false , 只判定轮廓与点的位置关系 , 具体关系如下 :

    ①返回值为-1, 表示点在轮廓外部

    ②返回值为0, 表示点在轮廓上

    ③返回值为1, 表示点在轮廓内部

例子:


(13)矩的计算---moments()


array: 输入参数 , 可以是光栅图像或二维数组
binaryImage : 默认值 false, 非零像素取其本身值 , 若为 true, 则非零像素取 1
返回 : Moments 类的对象 , 返回对应的轮廓的空间矩 / 中心矩和归一化中心矩 ( 最高 3 )
例子:


(14)形状匹配---matchShapes()


contour1: 所需比较的轮廓 1
contour2: 所需比较的轮廓 2
method: 轮廓比较的方法
p arameter: 比较方法的特殊参数 ( 目前不支持 )

(15)颜色空间转换---cvtColor()


(16)颜色区间范围删选---inRange()


src : 输入原图或数组
lowerb : 低边界或者颜色阈值
upperb : 高边界或者颜色阈值
dst : 输出目标图像 , 需要和原图一样的 size 并且类型需为 CV_8U

例子:




  • 17
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值