cv2.findContours()
时间: 2023-10-15 18:28:38 浏览: 55
`cv2.findContours()` 是一个用于查找二值图像中轮廓的函数。它接受三个参数:
- 输入图像:必须是灰度图像,并且是二值图像(黑白图像)。
- 轮廓检索模式:表示轮廓的层次结构,常用的有 `cv2.RETR_EXTERNAL` 只检测外部轮廓,`cv2.RETR_LIST` 只检测轮廓,不建立层次结构等。
- 轮廓逼近方法:表示轮廓的近似方法,常用的有 `cv2.CHAIN_APPROX_SIMPLE` 表示轮廓只保留端点,`cv2.CHAIN_APPROX_NONE` 表示轮廓保留所有点等。
`cv2.findContours()` 函数返回三个值:
- 输出图像:与输入图像大小相同,但是包含轮廓的二值图像。
- 轮廓列表:包含检测到的轮廓的 Python 列表。
- 轮廓层次结构:可选输出,表示轮廓的层次结构。
相关问题
contours, hierarchy = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) ValueError: too many values to unpack怎么解决
这个错误的原因是`cv2.findContours()`函数返回的值的数量与你尝试解包的变量数量不匹配。这是因为OpenCV版本不同,函数返回值的格式有所不同。
在OpenCV 3版本及以下,`cv2.findContours()`函数只返回轮廓列表,不返回层次结构。因此,你可以将函数调用修改为以下形式:
```python
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
```
这样,只将轮廓列表赋值给`contours`变量,而忽略了层次结构的返回值。
在OpenCV 4版本及以上,`cv2.findContours()`函数返回两个值:轮廓列表和层次结构列表。因此,你可以将函数调用修改为以下形式:
```python
_, contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
```
这样,只将轮廓列表赋值给`contours`变量,而忽略了层次结构的返回值。
根据你使用的OpenCV版本,选择相应的修改方式来解决这个错误。
python cv2.findContours()参数配置
cv2.findContours()函数是用于在二值图像中查找轮廓的函数。它有三个参数:
1. image:输入图像,必须是一个二值图像(黑白图)。
2. mode:轮廓查找模式,有四种模式可选:
- cv2.RETR_EXTERNAL:只检测外轮廓。
- cv2.RETR_LIST:检测所有轮廓,但不建立轮廓层级关系。
- cv2.RETR_CCOMP:检测所有轮廓,并建立两层轮廓结构。
- cv2.RETR_TREE:检测所有轮廓,并建立完整的轮廓层级结构。
3. method:轮廓逼近方法,有三种方法可选:
- cv2.CHAIN_APPROX_NONE:存储所有的轮廓点,适用于绘制轮廓。
- cv2.CHAIN_APPROX_SIMPLE:仅存储水平、垂直、对角线方向的轮廓点,适用于轮廓面积计算等操作。
- cv2.CHAIN_APPROX_TC89_L1 和 cv2.CHAIN_APPROX_TC89_KCOS:使用Teague-Chinliski算法进行轮廓逼近,适用于高精度轮廓。
一般来说,cv2.RETR_EXTERNAL和cv2.CHAIN_APPROX_SIMPLE是最常用的参数配置。例如:
contours, hierarchy = cv2.findContours(threshold_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
其中threshold_image是一个二值图像,contours是找到的轮廓,hierarchy是轮廓之间的关系。
阅读全文