本文共 1698 字,大约阅读时间需要 5 分钟。
OpenCV之cv2.findContours(Python)
概述
cv2.findContours 是 OpenCV 中一个强大的工具,用于从图像中检测轮廓。该函数能够识别图像中的边界,并返回这些边界的坐标。通过合理配置参数,可以控制轮廓的检测模式和近似方法,满足不同的应用需求。
输入参数解析
image
- 输入图像需为二值化图像(灰度图)或单色图。建议先使用 cv2.cvtColor 将彩色图像转换为灰度图。
mode
- 控制轮廓的检测模式:
- cv2.RETR_EXTERNAL:仅检测外轮廓。
- cv2.RETR_LIST:不建立轮廓等级关系。
- cv2.RETR_CCOMP:建立两层等级轮廓,上层为外轮廓,内层为内孔边界(内孔内连通物体的边界也会被包含)。
- cv2.RETR_TREE:建立层级化的轮廓树结构。
method
- 控制轮廓近似方法:
- cv2.CHAIN_APPROX_NOME:存储所有轮廓点,相邻点间像素差不超过1。
- cv2.CHAIN_APPROX_SIMPLE:压缩轮廓点,只保留各方向的终点坐标。例如,矩形只需4个点。
- cv2.CHAIN_APPROX_TC89_L1 和 cv2.CHAIN_APPROX_TC89_KCOS:基于不同距离度量的近似方法。
返回参数解析
contours
hierarchy
实际应用示例
import cv2# 读取图像并转换为灰度img = cv2.imread('contours2.png')gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 阈值分割,获得二值图ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)# 检测轮廓binary, contours, hierarchy = cv2.findContours( thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)# 获取第一个轮廓cnt = contours[0]# 轮廓近似epsilon = 0.1 * cv2.arcLength(cnt, True)approx = cv2.approxPolyDP(cnt, epsilon, True)# 绘制近似轮廓draw_img = img.copy()ret = cv2.drawContours( draw_img, [approx], -1, (0, 0, 255), 2)# 显示结果cv2.imshow('ret', ret) 辅助工具说明
二值化图像:使用 cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 将彩色图像转换为灰度图。 轮廓面积计算:使用 cv2.contourArea(cnt) 计算轮廓的面积。 轮廓周长计算:使用 cv2.arcLength(cnt, True) 计算轮廓的周长。 轮廓近似:通过设置阈值 epsilon,控制近似程度。例如:epsilon = 0.1 * cv2.arcLength(cnt, True)approx = cv2.approxPolyDP(cnt, epsilon, True)
外接矩形:使用 cv2.boundingRect(cnt) 获取轮廓的最小包围矩形。 外接圆:使用 cv2.minEnclosingCircle(cnt) 获取轮廓的最小包围圆。 绘图参数说明
- color:线的颜色值,例如 (0, 0, 255) 表示红色。
- thickness:线的宽度,-1 表示填充模式。
- lineType:线类型,默认值通常可用。
- hierarchy:轮廓的层级信息。
- maxLevel:绘制的最大等级。
- offset:偏移量,用于调整绘图位置。
通过合理配置这些参数,可以在图像中清晰地显示出所检测的轮廓。
转载地址:http://qrsfk.baihongyu.com/