cv2.findContours()函数用于从二值图像中查找图像轮廓,其基本格式如下。
contours,hierarchy=cv2.findContours(image,mode,method[,offset])
参数说明如下。
contours为返回的轮廓。
hierarchy为返回的轮廓的层次结构。
image为原图像。
mode为轮廓的检索模式。
method为轮廓的近似方法。
offset为每个轮廓点移动的可选偏移量。
示例代码如下。
查找轮廓
import cv2
import numpy as np
img=cv2.imread('shapes.jpg') #读取图像
cv2.imshow('original',img) #显示原图像
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #将其转换为灰度图像
ret,img2=cv2.threshold(gray,125,255,cv2.THRESH_BINARY) #二值化阈值处理
c,h=cv2.findContours(img2,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) #查找轮廓
print('轮廓:',c)
print('轮廓类型:',type(c))
print('轮廓个数:',len(c))
print('层次:',h)
print('层次类型:',type(h))
for n in(range(3)):
img3=np.zeros(img.shape, np.uint8)+255 #按原图大小创建一幅白色图像
cv2.polylines(img3,[c[n]],True,(255,0,0),2) #绘制轮廓
cv2.imshow('%s' % n,img3) #显示轮廓图像
cv2.waitKey(0) #按任意键结束等待
cv2.destroyAllWindows() #关闭所有窗口
1.cv2.findContours()函数返回结果
cv2.findContours()函数返回一个list对象,保存了轮廓数组。轮廓数组的每个元素都是一个表示轮廓的array对象;返回的轮廓层次是一个numpy.ndarray对象。
2.轮廓层次
根据轮廓的嵌套关系,可将轮廓之间的层次关系分为父级和子级,外部的轮廓为父级,内部的轮廓为子级。例如,图5-4所示的轮廓1是轮廓2的父级,轮廓0和轮廓1同级。
cv2.findContours()函数返回的轮廓层次中,numpy.ndarray对象中的每个元素表示的层次关系格式为:[下一个轮廓 前一个轮廓 第一个子级轮廓 父级轮廓]。例如,[-1 0 2 -1]中,-1表示不存在对应的轮廓,前一个轮廓在轮廓数组中的序号为0,第一个子级轮廓在轮廓数组中的序号为2。
3.轮廓的检索模式
cv2.findContours()函数中的mode参数用于设置轮廓的检索模式,不同检索模式下函数返回的轮廓有所不同。mode参数可设置为下列常数。
cv2.RETR_LIST:仅检索所有轮廓,不创建任何父子关系。
cv2.RETR_EXTERNAL:仅检索所有的外部轮廓,不包含子级轮廓。
cv2.RETR_CCOMP:检索所有轮廓并将它们排列为2级层次结构,所有的外部轮廓为1级,所有的子级轮廓为2级。
cv2.RETR_TREE:检索所有轮廓并创建完整的层次列表,如父级、子级、孙子级等。
4.轮廓的近似方法
cv2.findContours()函数中的method参数用于设置轮廓的近似方法,它用于决定如何确定轮廓包含的像素点。method参数可设置为下列常数。
cv2.CHAIN_APPROX_NONE:存储所有轮廓点,轮廓的任意两个相邻点是水平、垂直或对角线上的邻居。
cv2.CHAIN_APPROX_SIMPLE:只保存水平、垂直和对角线的端点。
cv2.CHAIN_APPROX_TC89_L1:应用Teh-Chin链逼近算法中的一种确定轮廓点。