原文地址:https://blog.csdn.net/vclearner2/article/details/120776685
contours, hierarchy = cv2.findContours(img, mode, method)
img: 单通道二值图。(白色是前景,黑色是背景)
mode: 轮廓返回模式。
(1)RETR_EXTERNAL, 只返回外轮廓
(2)RETR_LIST, 返回所有轮廓,不建立等级关系
(3)RETR_CCOMP,返回所有轮廓,建立两层等级结构
(4)RETR_TREE,返回所有轮廓,建立完整的等级结构
method: 轮廓存储方式。
(1)CHAIN_APPROX_NONE, 返回所有轮廓点
(2)CHAIN_APPROX_SIMPLE, 只保存轮廓的角点
(3)CHAIN_APPROX_TC89_L1
(3)CHAIN_APPROX_TC89_KCOS
contours: 轮廓列表。
hierarchy: 轮廓等级。
hierarchy以[前,后,子,父]的顺序,存储轮廓索引。
一. 示例

1. 只提取外轮廓
contours, hierarchy = cv2.findContours(fgmask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)



hierarchy返回值:
| 序号 | 后 | 前 | 子 | 父 |
| 0 | 1 | -1 | -1 | -1 |
| 1 | 2 | 0 | -1 | -1 |
| 2 | -1 | 1 | -1 | -1 |
2. 返回所有轮廓,不建立等级关系
contours, hierarchy = cv2.findContours(fgmask, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)



hierarchy返回值:
| 序号 | 后 | 前 | 子 | 父 |
| 0 | 1 | -1 | -1 | -1 |
| 1 | 2 | 0 | -1 | -1 |
| 2 | 3 | 1 | -1 | -1 |
| 3 | 4 | 2 | -1 | -1 |
| … | ||||
| 9 | -1 | 8 | -1 | -1 |
3. 返回所有轮廓,建立二层等级关系
contours, hierarchy = cv2.findContours(fgmask, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_NONE)



hierarchy返回值:
| 序号 | 后 | 前 | 子 | 父 |
| 0 | 2 | -1 | 1 | -1 |
| 1 | -1 | -1 | -1 | 0 |
| 2 | 4 | 0 | 3 | -1 |
| 3 | -1 | -1 | -1 | 2 |
| 4 | 6 | 2 | 5 | -1 |
| 5 | -1 | -1 | -1 | 4 |
| 6 | -1 | 4 | 7 | -1 |
| 7 | 8 | -1 | -1 | 6 |
| 8 | 9 | 7 | -1 | 6 |
| 9 | -1 | 8 | -1 | 6 |



4. 返回所有轮廓,建立完整等级关系
contours, hierarchy = cv2.findContours(fgmask, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)



hierarchy返回值:
| 序号 | 后 | 前 | 子 | 父 |
| 0 | 4 | -1 | 1 | -1 |
| 1 | -1 | -1 | 2 | 0 |
| 2 | -1 | -1 | 3 | 1 |
| 3 | -1 | -1 | -1 | 2 |
| 4 | 6 | 0 | 5 | -1 |
| 5 | -1 | -1 | -1 | 4 |
| 6 | -1 | 4 | 7 | -1 |
| 7 | 8 | -1 | -1 | 6 |
| 8 | 9 | 7 | -1 | 6 |
| 9 | -1 | 8 | -1 | 6 |



