opencv 9 -- 轮廓 特征 一

Posted wust小吴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv 9 -- 轮廓 特征 一相关的知识,希望对你有一定的参考价值。

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

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% 时得到的近似轮廓。
第三个参数设定弧线是否闭合

以上是关于opencv 9 -- 轮廓 特征 一的主要内容,如果未能解决你的问题,请参考以下文章

youcans 的 OpenCV 例程200篇197.轮廓的基本特征

OpenCV-Python教程:19.轮廓属性

OpenCV中的图像处理 —— 轮廓入门+轮廓特征

OpenCV竟然可以这样学!成神之路终将不远(十八)

OpenCV-Python:轮廓

计算机视觉OpenCV篇 - 轮廓(寻找/绘制轮廓)