使用findContours()
时间: 2024-12-26 20:16:40 浏览: 4
### 如何使用 `cv2.findContours` 函数
#### 函数概述
`cv2.findContours()` 是 OpenCV 库中用于检测二值图像中轮廓的函数。轮廓是指沿着边缘连接起来形成封闭形状的点集,这些点通常具有相同颜色或灰度级别[^1]。
#### 参数说明
此函数接受多个参数并返回两个主要变量:
- **image**: 输入图像应为单通道、8位的二值图;一般情况下,在调用之前会对原彩色图片做预处理操作如阈值分割、边缘提取等。
- **mode**: 轮廓检索模式,定义了如何构建轮廓之间的层次结构关系。
- **method**: 轮廓逼近方法,决定了保存哪些部分作为最终输出的结果。
- **contours**: 输出参数,用来接收找到的所有轮廓数据。
- **hierarchy**: 可选输出参数,表示各层轮廓间的关系矩阵。
- **offset**: (可选)偏移量,默认无偏移。
具体实现如下所示:
```python
import cv2 as cv
import numpy as np
# 创建一个黑色背景上的白色矩形图像
img = np.zeros((500, 500), dtype=np.uint8)
cv.rectangle(img, (100, 100), (400, 400), color=255, thickness=-1)
# 查找轮廓
contours, hierarchy = cv.findContours(
img,
mode=cv.RETR_EXTERNAL, # 检索最外侧轮廓
method=cv.CHAIN_APPROX_SIMPLE # 压缩水平/垂直方向以及对角线方向上共线的点
)
print(f"Detected {len(contours)} contours.")
```
上述代码创建了一个简单的黑白图形,并利用 `cv2.findContours` 来获取其中存在的轮廓信息。这里选择了只保留外部轮廓 (`RETR_EXTERNAL`) 并简化了轮廓描述(`CHAIN_APPROX_SIMPLE`)以减少冗余的数据量。
对于更复杂的场景,则可能需要先应用一些滤波器(比如高斯模糊)、边缘检测算法(例如 Canny 边缘检测器),然后再执行轮廓查找过程[^4]。
阅读全文