OpenCV python: ValueError: забагато значень для розпакування


77

Я пишу програму opencv, і я знайшов сценарій на інше запитання stackoverflow: Комп’ютерне бачення: маскування людської руки

Коли я запускаю відповідь за сценарієм, я отримую таку помилку:

Traceback (most recent call last):
    File "skinimagecontour.py", line 13, in <module>
    contours, _ = cv2.findContours(skin_ycrcb, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
ValueError: too many values to unpack

Код:

import sys
import numpy
import cv2

im = cv2.imread('Photos/test.jpg')
im_ycrcb = cv2.cvtColor(im, cv2.COLOR_BGR2YCR_CB)

skin_ycrcb_mint = numpy.array((0, 133, 77))
skin_ycrcb_maxt = numpy.array((255, 173, 127))
skin_ycrcb = cv2.inRange(im_ycrcb, skin_ycrcb_mint, skin_ycrcb_maxt)
cv2.imwrite('Photos/output2.jpg', skin_ycrcb) # Second image

contours, _ = cv2.findContours(skin_ycrcb, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for i, c in enumerate(contours):
    area = cv2.contourArea(c)
    if area > 1000:
        cv2.drawContours(im, contours, i, (255, 0, 0), 3)
cv2.imwrite('Photos/output3.jpg', im)

Будь-яка допомога вдячна!


Дивіться відповідь, яку я розмістив нижче із рішенням.
ahmadux

Відповіді:


146

Я отримав відповідь на сайті OpenCV Stack Exchange. Відповідь

ВІДПОВІДЬ:

Б'юсь об заклад, ви використовуєте поточну головну гілку OpenCV: тут оператори повернення змінилися, див. Http://docs.opencv.org/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html?highlight=findcontours .

Таким чином, змініть відповідний рядок, щоб читати:

_, contours, _= cv2.findContours(skin_ycrcb, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

Або: оскільки поточний стовбур все ще не стабільний, і, ймовірно, у вас виникнуть ще деякі проблеми, можливо, ви захочете використовувати поточну стабільну версію 2.4.9 OpenCV.


Я не розумію, як це виправити?
grep

1
@grep є той 3-й оператор повернення. порівняйте питання, про яке йдеться, та рядки відповідей
eden

26

Це працює у всіх cv2 версіях:

contours, hierarchy = cv2.findContours(skin_ycrcb, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2:]

Пояснення : За допомогою [-2:], ми в основному беремо два останні значення з tupleповернутого cv2.findContours. Оскільки в деяких версіях він повертається(image, contours, hierarchy) і в інших версіях він повертається (contours, hierarchy), contours, hierarchyзавжди останні два значення.


1
ааа-mazinnnnnnn
Бенте

1
Працював і у мене.
Ахмед Дж.

2
Це дивовижний хак
TechAJ

16

Ви повинні змінити цей рядок;

image, contours, _ = cv2.findContours(skin_ycrcb, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

3
Ласкаво просимо до StackOverflow! Хоча відповіді завжди цінують, це питання було задано 2 роки тому і вже мало прийняте рішення. І при цьому, ви не говорите йому , що він повинен змінити лінію до . Будь ласка, намагайтеся уникати "натрапляння" запитань на вершину, надаючи відповіді на них, якщо тільки питання ще не було позначене як вирішене, або ви знайшли значно кращий альтернативний підхід до проблеми :)
Обсидіан Вік,

5

Я використовую python3.x та opencv 4.1.0, я отримував помилку в наступному коді:

cnts, _ = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

ERROR : too many values to Unpack

тоді я дізнався, що наведений вище код використовується в python2.x ТАК що я просто замінив наведений вище код на один (В python3.x), додавши ще один знак "_" у лівій частині, щоб виглядати

_,cnts, _ = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

Найпростіше рішення

3

Що вам потрібно зробити, це просто додати '_' там, де ви не використовуєте необхідну змінну, спочатку вказану:

im2, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

до

_ , contours, _ = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

Тут подано оригінальний документ: https://docs.opencv.org/3.1.0/d4/d73/tutorial_py_contours_begin.html


2

python має рацію.
ви не можете розпакувати 3 значення з черепашки і помістити їх в черепашку з двох contours, _ = cv2.findContours(skin_ycrcb, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

використання

img, contours, _ = cv2.findContours(skin_ycrcb, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)


0

Нічого страшного, просто ви можете використовувати open-cv 3.something, який повертає 3 значення в точці помилки, і ви повинні вловлювати лише 2, просто додайте будь-яку випадкову величину перед змінною контурів -

_,contours,_ = cv2.findContours(skin_ycrcb, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.