cv2.findContours(img,mode,method):

mode:轮廓检索模式
·RETR_EXTERNAL 只检测最外面的轮廓
·RETR_LIST 检索所有的轮廓,并将其保存到一条链表当中
·RETR_CCOMP 检索所有的轮廓,并将他们组织为两层:顶层是各部分的外部边界,第二层是空洞的边界
·RETR_TREE 检索所有的轮廓,并重构嵌套轮廓的整个层次
method:轮廓逼近方法
·CHAIN_APPROX_NONE 以Freeman链码的方式输出轮廓,所有其他方法使出多边形(顶点的序列)
·CHAIN_APPROX_SIMPLE 压缩水平的、垂直和斜的部分,也就是,函数只保留他们的终点部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#cv2.findContours(img,mode,method)
#***** 要一个通道 *****
'''

mode:轮廓检索模式
·RETR_EXTERNAL 只检测最外面的轮廓
·RETR_LIST 检索所有的轮廓,并将其保存到一条链表当中
·RETR_CCOMP 检索所有的轮廓,并将他们组织为两层:顶层是各部分的外部边界,第二层是空洞的边界
·RETR_TREE 检索所有的轮廓,并重构嵌套轮廓的整个层次
method:轮廓逼近方法
·CHAIN_APPROX_NONE 以Freeman链码的方式输出轮廓,所有其他方法使出多边形(顶点的序列)
·CHAIN_APPROX_SIMPLE 压缩水平的、垂直和斜的部分,也就是,函数只保留他们的终点部分

'''

import cv2
import numpy as np


thresh = cv2.imread("test_thresh.png",cv2.IMREAD_GRAYSCALE)
#binary,contours,hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE) #2、4的版本没有binary的值
contours,hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE) #https://www.cnblogs.com/guobin-/p/10842486.html
# countours 保存的是图片轮廓信息
# hierarchy 保存的是层级
cnt = contours[0]
print(np.array(contours[0]))
#面积
print(cv2.contourArea(cnt))
#周长 True表示闭合
print(cv2.arcLength(cnt,True))

img = thresh[438:447,553:559]
cv2.imshow('img',img)
cv2.waitKey(0)


#绘制轮廓
draw_img = thresh.copy()
res = cv2.drawContours(draw_img,contours,-1,(255,0,0),2)
cv2.imshow('res_1',res)
cv2.waitKey(0)


#轮廓近似
cnt = contours[10]
epsilon = 0.1*cv2.arcLength(cnt,True)#设置精度(从轮廓到近似轮廓的最大距离)
approx = cv2.approxPolyDP(cnt,epsilon,True)#获取近似轮廓

draw_img = thresh.copy()
res = cv2.drawContours(draw_img,[approx],-1,(255,0,0),4)
cv2.imshow('res_2',res)
cv2.waitKey(0)

image-20230304203644793