查找轮廓的不同特征,例如面积,周长,重心,边界框
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% 时得到的近似轮廓。 第三个参数设定弧线是否闭合