那如果我用cv2.findContours的时候不想要cv2.RETR_EXTERNAL怎么弄
时间: 2024-10-27 12:00:59 浏览: 28
如果你不想仅获取外边界框(即`cv2.RETR_EXTERNAL`),而是想获取所有的轮廓及其相互嵌套关系,你可以使用`cv2.RETR_LIST`选项。这样`findContours()`函数将返回一个轮廓列表,其中包含从大到小的所有轮廓,包括内部轮廓。
以下是相应的修改部分:
```python
contours, hierarchy = cv2.findContours(edges, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
```
在这个返回的`hierarchy`变量中,你可以找到每个轮廓的父轮廓(如果存在)和其他关联信息。例如,`hierarchy[0]`通常是一个二进制掩码,可以用来判断两个轮廓是否相交等。
如果你想获取完整的轮廓树结构,可以使用`cv2.RETR_TREE`,这时`hierarchy`数组会有四个维度,用于描述更复杂的层次关系:
```python
contours, hierarchy = cv2.findContours(edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
```
请注意,随着获取的信息增加,处理和理解这些数据可能会变得复杂一些。
相关问题
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是轮廓之间的关系。
阅读全文