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 版本.

5. 参考

[1] - cv2.findContours()函数 - 2019.08.16

Last modification:April 10th, 2020 at 01:57 pm