查找轮廓
查找轮廓前需要黑白化和二值化
findContours(image, mode, method[, contours[, hierarchy[, offset]]])
mode 查找轮廓的模式
-
RETR_EXTERNAL = 0, 表示只检测外围轮
RETR_LIST = 1, 检测的轮廓不建立等级关系, 即检测所有轮廓, 较为常用
RETR_CCOMP = 2, 每层最多两级, 从小到大, 从里到外.
RETR_TREE = 3, 按照树型存储轮廓, 从大到小, 从右到左. -
method 轮廓近似方法也叫ApproximationMode
- CHAIN_APPROX_NONE 保存所有轮廓上的点
- CHAIN_APPROX_SIMPLE, 只保存角点, 比如四边形, 只保留四边形的4个角, 存储信息少, 比较常用
-
返回 contours和hierachy 即轮廓和层级
result, contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
轮廓查找, 新版本返回两个结果, 轮廓和层级, 老版本返回3个参数, 图像, 轮廓和层级
绘制轮廓
- drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset]]]]])
- image 要绘制的轮廓图像
- contours轮廓点
- contourIdx 要绘制的轮廓的编号. -1 表示绘制所有轮廓
- color 轮廓的颜色, 如 (0, 0, 255)表示红色
- thickness线宽, -1 表示全部填充
#绘制轮廓, 注意, 绘制轮廓会改变原图
cv2.drawContours(img, contours, 1, (0, 0, 255), 2)
轮廓的面积和周长
- contourArea(contour)
- arcLength(curve, closed)
- curve即轮廓
- closed是否是闭合的轮廓
conttours[0]是图像最外侧的轮廓,即窗口
area = cv2.contourArea(contours[1])
perimeter = cv2.arcLength(contours[1], True)
多边形逼近与凸包
approxPolyDP(curve, epsilon, closed[, approxCurve])
- curve 要近似逼近的轮廓
- epsilon 即DP算法使用的阈值
- closed轮廓是否闭合
approx = cv2.approxPolyDP(contours[0], 20, True)
凸包
convexHull(points[, hull[, clockwise[, returnPoints]]])
- points 即轮廓
- colckwise 顺时针绘制
hull = cv2.convexHull(contours[0])
外接矩形
-
minAreaRect(points) 最小外接矩阵
- points 即为轮廓
- 返回元组, 内容是一个旋转矩形(RotatedRect)的参数: 矩形的起始坐标x,y, 矩形的宽度和高度, 矩形的选择角度.
-
boundingRect(points) 最大外接矩阵
- points 即为轮廓
(x, y), (w, h), angle = cv2.minAreaRect(contours[1])
#快速把rotatedrect转化为轮廓数据
box = cv2.boxPoints®
print(box)
#轮廓必须是整数, 不能是小数, 所以转化为整数
box = np.round(box).astype(‘int64’)
print(box)
#绘制最小外接矩形
cv2.drawContours(img, [box], 0, (255, 0, 0), 2)
#返回矩形的x,y和w,h
x,y, w, h = cv2.boundingRect(contours[1])
cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)