原文地址: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 |


