(opencv5)轮廓检测函数
contours, hierarchy = cv2.findContours(img, mode, method,[offset)
注意 : 1.输入为二值图像,黑色为背景,白色为目标
2.该函数会修改原图像,因此若想保留原图像在,则需拷贝一份,在拷贝图里修改。
img :
二值图像
-
cv2.RETR_EXTERNAL: (retrieve external检测轮廓)只检测最外面的轮廓
-
cv2.RETR_LIST: 检测的轮廓不建立等级关系,都是同级
-
cv2.RETR_CCOMP: 建立两个等级的轮廓,上面一层为外边界,里面一层为内孔的边界信息
-
cv2.RETR_TREE: 建立一个等级树结构的轮廓
offset:(可选参数)
-
轮廓点的偏移量,格式为tuple,如(-10, 10)表示轮廓点沿X负方向偏移10个像素点,沿Y轴方向偏移10个像素点
method:
-
cv2.CHAIN_APPROX_NONE : 存储所有边界点
-
cv2.CHAIN_APPROX_SIMPLE:压缩垂直、水平、对角方向,只保留端点
-
cv2.CHAIN_APPROX_TX89_L1:使用teh-Chini近似算法
-
cv2.CHAIN_APPROX_TC89_KCOS:使用teh-Chini近似算法
返回值 :
-
contours : 轮廓点。列表格式,每一个元素为一个三维数组(其形状为(n, 1, 2), 其中n表示轮廓点个数,2表示像素点坐标(x, y))。每一个元素表示一个轮廓。
-
hierarchy : 轮廓间的层次关系,为三维数组,形状为(1, n, 4),其中n表示轮廓总个数,4指的是用4个数表示个轮廓间的相互关系。第一个数表示同级轮廓的下一个轮廓编号,第二个数表示同级轮廓的上一个轮廓编号,第三个数表示该轮廓下一级轮廓的编号,第四个数表示该轮廓的上一级轮廓的编号。
示例图片
示例代码01
import cv2
def cv_show(image, name):
cv2.imshow(name, image)
cv2.waitKey(0)
cv2.destroyAllWindows()
img = cv2.imread('tu1.jpg')
# 转为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 二值化 超过127取255,没超过取0
thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)[1]
# 轮廓检测, 检测所有外轮廓, 存储所有边界点, 返回 轮廓点(列表格式),轮廓间的层次关系(三维数组)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
# 绘制轮廓前复制图像,不然原图会变哒!
res = cv2.drawContours(img.copy(), contours, -1, (0, 0, 255), 2)
print('contours', type(contours), contours)
print('hierarchy', type(hierarchy), hierarchy)
cv_show(res, 'res')
运行结果01
示例代码02
import cv2
def cv_show(image, name):
cv2.imshow(name, image)
cv2.waitKey(0)
cv2.destroyAllWindows()
img = cv2.imread('tu1.jpg')
# 转为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 二值化 超过127取255,没超过取0
thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)[1]
# 轮廓检测, 只检测外轮廓, 存储所有边界点, 返回 轮廓点(列表格式),轮廓见的层次关系
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
# 绘制轮廓前复制图像,不然原图会变哒!
res = cv2.drawContours(img.copy(), contours, -1, (0, 0, 255), 2)
print('contours', type(contours), contours)
print('hierarchy', type(hierarchy), hierarchy)
cv_show(res, 'res')
运行结果02