cnts,hierarchy= cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, ValueError: not enough values to unpack (expected 2, got 1)解决此问题
时间: 2024-10-07 13:02:52 浏览: 23
当你遇到`cv2.findContours()`函数返回错误"not enough values to unpack (expected 2, got 1)",这通常是因为函数期望返回两个值(轮廓列表和层次结构),但实际上它只返回了一个。这个错误发生在OpenCV版本4.x之后,`findContours()`的默认行为发生了变化,不再直接返回层次信息。
为了解决这个问题,你需要明确指定你想要获取的结果。你可以通过设置`cv2 RETR_TREE`标志来获取层次结构,同时使用`cv2.CHAIN_APPROX_SIMPLE`来压缩轮廓表示。这里是修改后的代码示例:
```python
import cv2
# 其他步骤...
thresh = ... # 二值化图像
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
```
在这个例子中,`RETR_TREE`会返回一个嵌套的轮廓树,`CHAIN_APPROX_SIMPLE`会让OpenCV使用更紧凑的方式存储轮廓数据。现在你应该能得到预期的两个值了。
相关问题
cv2.findContours(mark, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
`cv2.findContours()` 函数是OpenCV库中的一个用于查找轮廓的方法,它在图像处理中非常有用。这个函数接收两个参数:输入图像(这里是`edged.copy()`)和一些标志来定义搜索方式。
`cv2.RETR_EXTERNAL`标志表示只寻找外部轮廓,即最外层的对象边缘。这意味着函数不会跟踪内部孔洞或物体的一部分,仅返回与背景分离的完整形状。
`cv2.CHAIN_APPROX_SIMPLE`标志则控制结果轮廓的存储方式。`CHAIN_APPROX_SIMPLE`会压缩垂直和水平连续像素点,只保留终点坐标,这对于简化轮廓并节省内存空间很有帮助。
示例演示:
```python
# 假设`edged`是经过边缘检测处理后的二值图像
cnts = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
if cnts and len(cnts[0]) > 0: # 如果找到轮廓
for contour in cnts[0]:
x, y, w, h = cv2.boundingRect(contour)
print(f"Contour at ({x}, {y}) with dimensions ({w}, {h})")
else:
print("No contours found.")
```
这段代码会打印每个外部轮廓的位置及其边界框尺寸。
cnts = cv2.findContours(edged.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)[0] cnts = sorted(cnts, key = cv2.contourArea, reverse = True)[:5]
这段代码使用OpenCV的cv2.findContours函数从边缘图像中查找轮廓。
首先,edged.copy()创建了 edged 的副本,以确保原始图像不会被修改。
然后,cv2.findContours函数被调用,它接受三个参数:
- 第一个参数是边缘图像
- 第二个参数是轮廓检索模式,这里使用cv2.RETR_LIST表示检索所有的轮廓
- 第三个参数是轮廓近似方法,这里使用cv2.CHAIN_APPROX_SIMPLE表示使用简单的近似方法来存储轮廓的点
cv2.findContours函数的返回值是一个包含所有轮廓的列表,其中每个轮廓都是一个NumPy数组。
接下来,使用sorted函数对轮廓进行排序。排序的依据是每个轮廓的面积,通过调用cv2.contourArea函数来计算。参数reverse=True表示按照面积从大到小进行排序。
最后,通过切片操作[:5]取出前5个面积最大的轮廓,并将结果保存在cnts变量中。
阅读全文