Python 3-ValueError: недостаточно значений для распаковки (ожидается 3, получено 2)

Привет, я новичок в компьютерном зрении и stackoverflow, и у меня проблема с моей программой python 3 в Windows, так как функция cv2.findContours () возвращает 2 вместо трех значений, как в документации. Я передал 2 значения для возврата, чтобы устранить ошибку, тип первого (изображение) - это список, а тип второго (cnts) - int32, но ни один из них не может использоваться в cv2.drawContours () без ошибок здесь я использую изображение в качестве параметра, потому что это единственный возвращаемый список, поэтому я предполагаю, что это список контуров 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 в режиме ожидания:

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

person Godlove    schedule 05.04.2020    source источник
comment
В документации указано 2 возвращаемых значения, а не 3 ... docs.opencv.org/2.4/modules/imgproc/doc/   -  person seven_seas    schedule 05.04.2020
comment
какой тип изображения? прочитав документы, я бы подумал, что это список векторов.   -  person seven_seas    schedule 05.04.2020
comment
@seven_seas Спасибо, я использую cv2 версии 4.2, и в учебном pdf, который я загружаю онлайн, версия python, которую они используют, требует, чтобы cv2.findContours () возвращал 3 переменные, а не 2, как они использовали в своих примерах   -  person Godlove    schedule 05.04.2020
comment
@seven_seas да, и изображение - это список, а cnts - это int32, я думаю изменить свою версию opencv, чтобы решить эту проблему, надеюсь, у них больше не будет проблем   -  person Godlove    schedule 05.04.2020
comment
что в списке? скаляры или массивы numpy? если да, попробуйте использовать те   -  person seven_seas    schedule 05.04.2020
comment
idle shell говорит, что это ни скаляр, ни массив numpy, он говорит, что это тип данных = 17 Я смущен, я не понимаю, что это должно означать, вот ошибка: Traceback (последний вызов последний): файл D : \ PyCharm Projects \ Test_1_docscanner.py, строка 21, в ‹module› img = cv2.drawContours (img, [image], - 1, (255,255,0), 3) TypeError: тип данных контуров = 17 не поддерживается   -  person Godlove    schedule 05.04.2020
comment
Я знаю, но как насчет вещей В списке. не сам список   -  person seven_seas    schedule 05.04.2020
comment
@seven_seas - это небольшой фрагмент содержимого, в нем содержится 12607 строк в неактивной оболочке python: [array ([[[166, 380]]], [[165, 381]], [[165, 382 ]],   -  person Godlove    schedule 05.04.2020


Ответы (1)


Наконец, у меня все заработало, и я сделал следующее:

  • Сначала я испортил большинство своих переменных окружения, не подавив некоторые системные переменные. Итак, я с помощью друга извлек столько, сколько смог, и удалил те, которые создал по глупости.

  • Во-вторых, я удалил все другие версии python (по крайней мере, я пытался), хотя мне кажется, что я все еще вижу их значки (они кажутся «не удаляемыми») и даже тот, который я использовал (Python3.7.3). Затем я устанавливаю Python 3.7.4.

  • В-третьих, и это должно быть ответом на то, что я добавил эту строку cnts = imutils.grab_contours (cnts) перед функциями cv2.drawContours (). Получение этого из пакета imutils с гитхаба Адриана Роузброка. мой код теперь работает из-за этой строки, которая помогает анализировать контуры для любой версии cv2.drawContours () opencv, которую вы используете, тем самым избегая конфликтов версий, происходящих из функции cv2.findContours (), используемой до cv2.drawContours ().
    # P4 #

Надеюсь, это будет полезно

person Godlove    schedule 19.04.2020