Python 3-ValueError:没有足够的值可解包(预期3,得到2)

时间:2020-04-05 11:10:50

标签: python python-3.x opencv-python

嗨,我是计算机视觉和stackoverflow的新手,我的Windows 3上的python 3程序有问题,因为cv2.findContours()函数返回2而不是文档中的三个值。我传递了两个返回值来解决该错误,第一个(图像)的类型是一个列表,第二个(cnts)的类型是一个int32,但它们都不能在cv2.drawContours()中使用而不会发生错误这里我使用image作为参数,因为它是返回的唯一列表,所以我猜它是轮廓列表cv2.drawContours()。所以这是代码:

#This is the program for a document scanner so as to extract a document
#from any image and apply perspective transform to show it as final result
import numpy as np
import cv2
import imutils
from matplotlib import pyplot as plt
cap=cv2.VideoCapture(0)
ret,img=cap.read()
img1=img.copy()
cv2.imshow('Image',img1)
img1=cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY)
img1=cv2.bilateralFilter(img1,7,17,17)
img1=cv2.Canny(img1,30,200)
image,cnts=cv2.findContours(img1,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
#cnts=np.asarray(cnts,dtype='uint8')
cnts=np.array(cnts)

cv2.imshow('Edge',img1)
print('cnts var  data type',cnts.dtype)
#print("Hi")

img=cv2.drawContours(img,[image],-1,(255,255,0),3)

这是现在出现的python闲置shell结果:

cnts var  data type is int32
Traceback (most recent call last):
  File "D:\PyCharm Projects\Test_1_docscanner.py", line 20, in <module>
    img=cv2.drawContours(img,[image],-1,(255,255,0),3)
TypeError: contours is not a numpy array, neither a scalar

1 个答案:

答案 0 :(得分:0)

我终于开始工作了,下面我做了:

  • 首先,我以前搞砸了我的大多数环境变量,并没有抑制某些系统变量。因此,我在一个朋友的帮助下,尽可能地检索并删除了我愚蠢无知创建的那些文件。

  • 其次,我卸载了所有其他python版本(至少我尝试过),尽管似乎我仍然看到它们的图标(它们似乎是“不可删除的”),甚至我正在使用的图标也是如此(Python3.7.3) 。然后安装Python 3.7.4。

  • 第三,这一定是答案,我在cv2.drawContours()函数之前添加了cnts = imutils.grab_contours(cnts)这行。从Adrian Rosebrock github的imutils包中获取此信息。我的代码现在可以工作,因为该行有助于解析所使用的cv2.drawContours()opencv版本的轮廓,从而避免了源自cv2.drawContours()之前的cv2.findContours()函数的版本冲突。

    最后,我之前在python3.7.3上尝试了imutils.grab_contours()来进行这些更改,但没有用。但是,我认为最重要的是,解决方案已将“ cnts = imutils.grab_contours(cnts)”与Python3.7.4的更新结合起来。

希望这会有所帮助