cv2.findContours 函数用于轮廓检测,其输入为二值图像(binary image),前景(目标)和背景.
OpenCV 中,cv2.findContours 函数的使用如:
# opencv-python 3.X,如 3.4.3.18
image,contours,hierarchy = cv2.findContours(
binary_image,
mode=cv2.RETR_TREE,
method=cv2.CHAIN_APPROX_SIMPLE)
# opencv-python 2.X 或 4.X,如 4.1.0.25
contours,hierarchy = cv2.findContours(
binary_image,
mode=cv2.RETR_TREE,
method=cv2.CHAIN_APPROX_SIMPLE)
注:
pip 安装指定版本的 opencv-python:
pip install opencv-python==3.4.3.18
pip install opencv-python==4.1.0.25
1. cv2.findContours 函数使用示例
#!/usr/bin/python3
import cv2
import matplotlib.pyplot as plt
img = cv2.imread('test.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img,contours,-1,(0,0,255),3)
plt.imshow("img", img)
plt.show()
2. cv2.findContours 函数输出
findContours 轮廓提取函数会返回值为:
[1] - image
- 处理后的图像
[2] - contours
- 检测到的轮廓的点集
[3] - hierarchy
- 各层轮廓的索引
3. cv2.findContours 函数输入
cv2.findContours() 函数有三个输入参数:
- 输入图像(二值图像)
- 轮廓检索方式
- 轮廓近似方法
[1] - 轮廓检索方式
mode | 含义 |
---|---|
cv2.RETR_EXTERNAL | 只检测外轮廓信息 |
cv2.RETR_LIST | 输出的轮廓间无等级关系,以list形式输出轮廓信息 |
cv2.RETR_CCOMP | 输出两层轮廓信息,即内外两个边界. 上面一层为外边界,里面一层为内孔的边界信息 |
cv2.RETR_TREE | 以树结构输出轮廓信息 |
[2] - 轮廓近似方法
method | 含义 |
---|---|
cv2.CHAIN_APPROX_NONE | 存储所有边界点 |
cv2.CHAIN_APPROX_SIMPLE | 压缩垂直、水平、对角方向,只保留端点 |
cv2.CHAIN_APPROX_TX89_L1 | 使用teh-Chini近似算法 |
cv2.CHAIN_APPROX_TC89_KCOS | 使用teh-Chini近似算法 |
4. 版本问题导致 ValueError: not enough values to unpack (expected 3, got 2)
更换对应的 opencv-python 版本.