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)
|
