一、cv2.findContours()
用于寻找物体的轮廓。
contours,hierarchy = cv2.findContours(image, mode, method)
参数解释:
- image:寻找轮廓的图像
- mode:表示轮廓的检索模式
- method:轮廓的近视办法
mode | 说明 |
cv2.RETR_EXTERNAL | 表示只检测外轮廓 |
cv2.RETR_LIST | 检测所有的轮廓,包括内围、外围轮廓,但是检测到的轮廓不建立等级关系 |
cv2.RETR_CCOMP | 检测所有的轮廓,但所有轮廓只建立两个等级关系 |
cv2.RETR_TREE | 检测所有轮廓,所有轮廓建立一个等级树结构 |
method | 说明 |
cv2.CHAIN_APPROX_NONE | 保存物体边界上所有连续的轮廓点到contours向量内 |
cv2.CHAIN_APPROX_SIMPLE | 仅保存轮廓的拐点信息,把所有轮廓拐点处的点保存入contour向量内 |
返回值:
- contours:向量内每个元素保存了一组由连续的Point点构成的点的集合的向量,每一组Point点集就是一个轮廓。有多少;轮廓,向量contours就有多少元素。
- hierarchy:向量内每一个元素包含了4个int型变量:[后一个轮廓,前一个轮廓,父轮廓,内嵌轮廓]
二、cv2.drawContours()
用于绘制物体的轮廓。
cv2.drawContours(image,contours,contourldx,color,thickness)
参数解释
- image:需要绘制的图像
- contours:探测的轮廓
- contourldx:表明要绘制轮廓的参数。如果为负,则绘制所有轮廓
- color:绘制轮廓颜色
- thickness:轮廓线粗细
三、实例
import cv2
import numpy as np
## 创建一个300*300图像
img = np.zeros((450,450),dtype = np.uint8)
img_ori = cv2.bitwise_not(img)
cv2.rectangle(img_ori,(20,100),(100,250),0,6)
cv2.circle(img_ori,(280,170),150,0,6)
cv2.circle(img_ori,(280,290),150,0,6)
def draw_contours(contour,ldx,color,thickness):
img = np.ones((450,450),dtype = np.uint8)*255
cv2.drawContours(img,contour,ldx,color,thickness)
return img
## 1.只检测外层轮廓
contour1,hierarchy1 = cv2.findContours(img_ori,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
img_res1 = draw_contours(contour1,-1,0,3)
print("只检测外层轮廓:",hierarchy1)
## 2.不建立等级关系的所有轮廓
contour2,hierarchy2 = cv2.findContours(img_ori,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
img_res2 = draw_contours(contour2,-1,0,3)
print("不建立等级关系的所有轮廓:\n",hierarchy2)
## 3.只建立两个等级关系的所有轮廓
contour3,hierarchy3 = cv2.findContours(img_ori,cv2.RETR_CCOMP,cv2.CHAIN_APPROX_SIMPLE)
img_res3 = draw_contours(contour3,-1,0,3)
print("只建立两个等级关系的所有轮廓:\n",hierarchy3)
## 4.建立一个等级树结构的所有轮廓
contour4,hierarchy4 = cv2.findContours(img_ori,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
img_res4 = draw_contours(contour4,-1,0,3)
print("建立一个等级树结构的所有轮廓:\n",hierarchy4)
cv2.imshow('origin',img_ori)
cv2.imshow('res1', img_res1)
cv2.imshow('res2', img_res2)
cv2.imshow('res3', img_res3)
cv2.imshow('res4', img_res4)
cv2.waitKey(0)
cv2.destroyAllWindows()
1.只检测外层轮廓
当只检测外层轮廓时,向量只有一个,即图片的外框,所以无前后轮廓,无等级关系,故hierarchy的四个参数都为-1。
2.不建立等级关系的所有轮廓
由于不建立等级,第三、第四个参数全为-1,所有轮廓一共有7个,以第一个[1 -1 -1 -1]为例说明,第一个的后一个轮廓索引编号(从0开始)为1,无前一个轮廓,故第一个参数为1,第二个参数为-1。
3.只建立两个等级关系的所有轮廓
只建立两个等级关系的所有轮廓指所有轮廓只建立两个等级关系,外围为顶层,若外围内的内围轮廓还包含了其他的轮廓信息,则内围内的所有轮廓均归属于顶层。下面以颜色表示轮廓:黑色⊆紫色⊆红色。所以顶层的元素有4个黑色轮廓和1个红色轮廓,而红色轮廓有两个内嵌轮廓(紫色)。
4.建立一个等级树结构的所有轮廓