opencv 9 -- 轮廓 特征 一

2019-07-08 18:26:26 浏览数 (1)

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

1 矩

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

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

代码语言:javascript复制
cnt = contours[0]
M = cv2.moments(cnt) print M

结果:

代码语言:javascript复制
{'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}

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

代码语言:javascript复制
cx = int(M['m10']/M['m00'])
cy = int(M['m01']/M['m00'])

2 轮廓面积

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

代码语言:javascript复制
area = cv2.contourArea(cnt)

3 轮廓周长

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

代码语言:javascript复制
perimeter = cv2.arcLength(cnt,True)

4 轮廓近似

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

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

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

代码语言:javascript复制
epsilon = 0.1*cv2.arcLength(cnt,True)
approx = cv2.approxPolyDP(cnt,epsilon,True)

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

cv2

0 人点赞