import cv2
import numpy as np
# 读取图像并进行预处理
image = cv2.imread('test.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 图像二值化处理
ret, threshold = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY)
# 寻找图像轮廓
contours, hierarchy = cv2.findContours(threshold, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
# 绘制轮廓
cv2.drawContours(image, contours, -1, (0, 255, 0), 2)
# 显示结果
cv2.imshow('image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.findContours
函数是OpenCV中用于查找图像轮廓的函数。它的参数如下所示:
contours, hierarchy = cv2.findContours(image, mode, method, contours=None, hierarchy=None, offset=None)
参数解释如下:
-
image
: 输入的二值图像,通常为灰度图像或者经过二值化处理的图像。 -
mode
: 轮廓检索模式,指定轮廓的检索方式。可选的模式有以下几种:cv2.RETR_EXTERNAL
: 只检测外部轮廓,忽略图像内部的轮廓。cv2.RETR_LIST
: 检测所有轮廓,不建立轮廓间的层级关系。cv2.RETR_CCOMP
: 检测所有轮廓,并且建立两层的层级关系。cv2.RETR_TREE
: 检测所有轮廓,并且建立完整的层级树结构。
-
method
: 轮廓的近似方法,指定轮廓的近似方式。可选的方法有以下几种:cv2.CHAIN_APPROX_NONE
: 保存所有的轮廓点。cv2.CHAIN_APPROX_SIMPLE
: 仅保存轮廓的终点。cv2.CHAIN_APPROX_TC89_L1
: 使用Teague-Chinlund的方法进行轮廓近似。cv2.CHAIN_APPROX_TC89_KCOS
: 使用Teague-Chinlund-Kim的方法进行轮廓近似。
-
contours
(可选): 输出参数,用于存储找到的轮廓,每个轮廓存储为一个numpy数组。 -
hierarchy
(可选): 输出参数,用于存储轮廓的层级信息,每个轮廓的层级信息存储为一个四元组(next, previous, first_child, parent)
。 -
offset
(可选): 轮廓坐标的可选偏移量。
函数返回两个值:
-
contours
: 找到的轮廓列表,每个轮廓存储为一个numpy数组。 -
hierarchy
: 轮廓的层级信息,每个轮廓的层级信息存储为一个四元组(next, previous, first_child, parent)
。
注意:根据OpenCV的版本,返回值的顺序可能不同。在旧版本的OpenCV中,返回值顺序是 (contours, hierarchy)
,而在较新的版本中是 (hierarchy, contours)
。