contours, hierarchy = cv2.findContours(img, mode=cv2.RETR_EXTERNAL, method=cv2.CHAIN_APPROX_NONE)
输入参数:
- img : 单通道二值图像,白色是前景
- RETR_EXTERNAL : 只返回最外边的轮廓, hierarchy[i][2]=hierarchy[i][3]=-1
- CHAIN_APPROX_NONE : 存储轮廓上的所有点
输出参数:
- contours : 轮廓 M*N M是轮廓个数 N是每个轮廓的点
- hierarchy : 轮廓等级关系 M*4
不同版本的opencv中输出参数个数有3个的,有2个的,我的版本是opencv-python 4.5.3.56
这个函数输出数里的contours很好理解,主要是后面这个hierarchy(等级关系)和后面这个mode与method的关系不是很好理解,其中,method主要是表示存储方式的不同,如下:
CV_CHAIN_APPROX_NONE :存储轮廓的所有点
CV_CHAIN_APPROX_SIMPLE :不保存轮廓中水平、垂直、对角的线段,只保存轮廓的角点
CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS : 应用了 Teh-Chin 链近 似算法的一种存储风格,这个我也没搞懂
剩下的就是重点,就是输出参数hierarchy和mode的关系到底是什么样的,hierarchy的四个参数到底表示的是什么意思,这四个值分别表示当前轮廓的“后前子父”对象的序号,下面看验证,首先看mode的四个选项,
- CV_RETR_EXTERNAL :返回最外层轮廓, hierarchy[i][2]=hierarchy[i][3]=-1
- CV_RETR_LIST :返回所有的轮廓,但是没建立等级关系
- CV_RETR_CCOMP :返回所有轮廓,包含两个层级结构
- CV_RETR_TREE :返回所有轮廓,建立完整的层次结构
例子:采用图片如下:
验证1、 contours, hierarchy = cv2.findContours(fgmask, cv2