cnts,hierarchy= cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, ValueError: not enough values to unpack (expected 2, got 1)解决此问题
当你遇到cv2.findContours()
函数返回错误"not enough values to unpack (expected 2, got 1)",这通常是因为函数期望返回两个值(轮廓列表和层次结构),但实际上它只返回了一个。这个错误发生在OpenCV版本4.x之后,findContours()
的默认行为发生了变化,不再直接返回层次信息。
为了解决这个问题,你需要明确指定你想要获取的结果。你可以通过设置cv2 RETR_TREE
标志来获取层次结构,同时使用cv2.CHAIN_APPROX_SIMPLE
来压缩轮廓表示。这里是修改后的代码示例:
import cv2
# 其他步骤...
thresh = ... # 二值化图像
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
在这个例子中,RETR_TREE
会返回一个嵌套的轮廓树,CHAIN_APPROX_SIMPLE
会让OpenCV使用更紧凑的方式存储轮廓数据。现在你应该能得到预期的两个值了。
cnts = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
cv2.findContours()函数是用于寻找图像中的轮廓的函数。该函数会返回三个参数:第一个参数是二值化图像,第二个参数是轮廓检索模式(RETR_TREE表示检索所有轮廓并建立轮廓之间的层级关系),第三个参数是轮廓逼近方法(CHAIN_APPROX_NONE表示保留轮廓的所有点)。函数返回的第一个参数cnts是一个包含所有轮廓的列表,每个轮廓由一系列点的坐标组成。
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变量中。
相关推荐

















