目录
一、多边形的逼近
findContours后的轮廓信息countours可能过于复杂不平滑,可以用approxPolyDP函数对该多边形曲线做适当近似,这就是轮廓的多边形逼近。
apporxPolyDP就是以多边形去逼近轮廓,采用的是Douglas-Peucker算法(方法名中的DP)
DP算法原理比较简单,核心就是不断去找多边形最远的点加入形成新的多边形,直到最短距离小于指定的精度(阈值)。
approxPolyDP(curve, epsilon, closed[, approxCurvel])
- curve 要逼近的轮廓
- epsilon 即DP算法使用的阈值
- closed 轮廓是否闭合
阈值越大,逼近效果越粗糙;阈值越小,逼近效果越好。
得到的approx本质是一个数组ndarray类型,因此画轮廓的时候需要加上[]变成列表类型。
示例代码如下:
import cv2
import numpy as np
# 导入图片
hand = cv2.imread("hand.png")
# 变为单通道黑白图片
gray = cv2.cvtColor(hand, cv2.COLOR_BGR2GRAY)
# 二值化操作
ret, new_img = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY)
# 查找轮廓
contours, hierarchy = cv2.findContours(new_img, cv2.RETR_TREE, cv2.CHAIN_APPROX