《OpenCV 轻松入门 面向Python》 学习笔记
计算轮廓时,可能不需要实际的轮廓,而仅需要一个接近于轮廓的近似多边形,Opencv中提供了多种计算轮廓近似多边形的方法。
轮廓拟合
- 1. 矩形包围框 cv2.boundingRect()
- 2. 最小包围矩形框 cv2.minAreaRect()
- 3. 最小包围圆形 cv2.minEnclosingCircle()
- 4. 最优拟合椭圆 cv2.fitEllipse()
- 5. 最优拟合直线 cv2.fitLine()
- 6. 最小外包三角形 cv2.minEnclosingTriangle()
- 7. 逼近多边形 cv2.approxPolyDP()
1. 矩形包围框 cv2.boundingRect()
2. 最小包围矩形框 cv2.minAreaRect()
函数原型:
retval =cv2.minAreaRect(points)
- 返回值retval表示返回的矩阵特征信息,结构是(最小外接矩形的中心(x,y),(宽度,高度),旋转角度)。
- points 是轮廓
注意,返回值retval不满足 cv2.drawContours() 参数结构要求,必须将其转换为符合要求的结构才可以使用。如下函数可以将上面的返回值retval转换成符合要求的结构:
points = cv2.boxPoints(box)
- 返回值 points,是能够用于函数 cv2.drawContours()参数的轮廓点。
- 参数 box 是函数 cv2.minAreaRect()返回值的类型的值。
3. 最小包围圆形 cv2.minEnclosingCircle()
函数原型:
center, radius = cv2.minEnclosingCircle(points)
参数:
- 返回值center是最小包围圆形的圆心
- 返回值radius是最小包围圆形的半径
- 参数points是轮廓
4. 最优拟合椭圆 cv2.fitEllipse()
函数原型:
retval = cv2.fitEllipse(points)
参数:
- 返回值retval是 RotatedRect 类型的值,这个是拟合椭圆的外界矩形,包含外接矩形的质心,宽,高,旋转角度等参数信息,这些信息与椭圆的中心点,轴长度,旋转角度等信息吻合
- 参数points是轮廓
5. 最优拟合直线 cv2.fitLine()
函数原型:
line = cv2.fitLine(points, distType, param, reps, aeps)
参数:
- line 为返回值,是返回的最优拟合直线参数
- points:轮廓
- distType 距离类型。拟合直线时,要使输入点到拟合直线的距离之和最小
- param 距离参数,与所选的距离类型有关。当此参数被设为0时,该参数会自动选择最优值。
- reps ,aeps 用于表示拟合直线所需要的径向精度,角度精度,通常设置为0.01
6. 最小外包三角形 cv2.minEnclosingTriangle()
retval, triangle = cv2.minEnclosingTriangle(points)
参数:
- retval 最小外包三角形的面积
- triangle 最小外包三角形的三个顶点集
7. 逼近多边形 cv2.approxPolyDP()
# 用来构造指定精度的逼近多边形曲线
approxCurve = cv2.approxPolyDP(curve, epsilon, closed)
返回值:
- approxCurve 为逼近多边形的点集
参数:
- curve: 轮廓
- epsilon: 精度,原始轮廓的边界的与逼近多边形边界之间的最大距离
- closed: 布尔值,是否封闭。值为True时,逼近多边形是封闭的
函数 cv2.apprxPolyDP() 采用 Douglas-Peucker算法(DP算法) 该算法首先从轮廓中找到距离最远的两个点,将两点相连,然后在轮廓上找一个离当前直线最远的点,将该点与原有直线连成一个封闭的三角形。
然后不断重复上述过程,将新找到的距离当前多边形最远的点加入到结果中,当轮廓上所有的点到到当前多边形的距离都小于函数epsilon 参数的值,就停止。epsilon 是逼近多边形的精度信息,通常设置为多边形总长度百分比的形式