首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >opencv 9 -- 轮廓 特征 一

opencv 9 -- 轮廓 特征 一

作者头像
wust小吴
发布2019-07-08 18:26:26
7310
发布2019-07-08 18:26:26
举报
文章被收录于专栏:风吹杨柳风吹杨柳

查找轮廓的不同特征,例如面积,周长,重心,边界框

1 矩

图像的矩可以帮助我们计算图像的质心,面积等

函数 cv2.moments() 会将计算得到的矩以一个字典的形式返回

cnt = contours[0]
M = cv2.moments(cnt) print M

结果:

{'mu02': 185.57864792644978, 
 'mu03': -96.2852087020874, 
 'm11': 1624279.2083333333, 
 'nu02': 0.1077536059959064, 
 'nu20': 0.11998893138723407,
 'm30': 23403716.05, 
 'nu21': 0.015200089449869787, 
 'mu12': -131.628704666673, 
 'nu11': 0.03254640471211304, 
 'nu12': -0.011863978902607857, 
 'm03': 4421663080.0, 
 'm00': 41.5, 
 'mu30': 255.25263517722487,
 'm10': 3426.1666666666665, 
 'm20': 283064.9166666666, 
 'm21': 134200383.33333333}

根据这些矩的值,我们可以计算出对象的重心:

这里写图片描述
这里写图片描述
cx = int(M['m10']/M['m00'])
cy = int(M['m01']/M['m00'])

2 轮廓面积

轮廓的面积可以使用函数 cv2.contourArea() 计算得到, 也可以使用矩 (0 阶矩),M[‘m00’]

area = cv2.contourArea(cnt)

3 轮廓周长

也被称为弧长。可以使用函数 cv2.arcLength() 计算得到。 这个函数 的第二参数可以用来指定对象的形状是闭合的(True),还是打开的(一条曲线)

perimeter = cv2.arcLength(cnt,True)

4 轮廓近似

将轮廓形状近似到另外一种由更少点组成的轮廓形状,新轮廓的点的数目 由我们设定的准确度来决定。使用的Douglas-Peucker算法

为了帮助理解,假设我们要在一幅图像中查找一个矩形, 但是由于图像的 种种原因,我们不能得到一个完美的矩形, 而是一个“坏形状”(如下图第一幅所示)。

现在你就可以使用这个函数来近似这个形状()了。 这个函数的第二个参数叫 epsilon,它是从原始轮廓到近似轮廓的最大距离。 它是一个准确度参数。 选择一个好的 epsilon 对于得到满意结果非常重要

epsilon = 0.1*cv2.arcLength(cnt,True)
approx = cv2.approxPolyDP(cnt,epsilon,True)

下边,第二幅图中的绿线是当 epsilon = 10% 时得到的近似轮廓, 第三幅 图是当 epsilon = 1% 时得到的近似轮廓。 第三个参数设定弧线是否闭合

这里写图片描述
这里写图片描述
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年05月21日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 矩
  • 2 轮廓面积
  • 3 轮廓周长
  • 4 轮廓近似
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档