OpenCV-Python: ValueError: Zu viele Werte zum Entpacken

74

Ich schreibe ein OpenCV-Programm und habe ein Skript für eine andere Frage zum Stapelüberlauf gefunden: Computer Vision: Maskieren einer menschlichen Hand

Wenn ich die Skriptantwort ausführe, wird folgende Fehlermeldung angezeigt:

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

Der Code:

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)

Jede Hilfe wird geschätzt!

ahmadux
quelle
Siehe die Antwort, die ich unten mit der Lösung gepostet habe.
Ahmadad

Antworten:

143

Ich habe die Antwort von der OpenCV Stack Exchange-Site erhalten. Antworten

DIE ANTWORT:

Ich wette, Sie verwenden den aktuellen OpenCV-Hauptzweig: Hier haben sich die return-Anweisungen geändert, siehe http://docs.opencv.org/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html?highlight=findcontours .

Ändern Sie daher die entsprechende Zeile in:

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

Oder: Da der aktuelle Trunk immer noch nicht stabil ist und Sie wahrscheinlich weitere Probleme haben werden, möchten Sie möglicherweise die aktuelle stabile Version 2.4.9 von OpenCV verwenden.

ahmadux
quelle
Ich verstehe nicht, wie ich das beheben soll?
grep
1
@grep gibt es diese 3. return-Anweisung. Vergleiche die fragliche und die Antwortzeile
Eden
26

Dies funktioniert in allen cv2 Versionen:

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

Erläuterung : Mit using nehmen [-2:]wir grundsätzlich die letzten beiden Werte aus den tuplezurückgegebenen von cv2.findContours. Da in einigen Versionen zurückgegeben wird (image, contours, hierarchy)und in anderen Versionen zurückgegeben wird (contours, hierarchy), contours, hierarchysind immer die letzten beiden Werte.

Safwan
quelle
1
ahh-mazinnnnnnn
Benten
1
Hat auch für mich gearbeitet.
Ahmed J.
2
Es ist erstaunlich, Hack
TechAJ
16

Sie müssen diese Zeile ändern;

image, contours, _ = cv2.findContours(skin_ycrcb, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
Volkan Altıntaş
quelle
3
Willkommen bei StackOverflow! Während Antworten immer geschätzt werden, wurde diese Frage vor 2 Jahren gestellt und hatte bereits eine akzeptierte Lösung. Und dass Sie ihm nicht sagen , was er die Linie ändern muss zu . Bitte versuchen Sie zu vermeiden, dass Fragen nach oben stoßen, indem Sie Antworten darauf geben, es sei denn, die Frage wurde nicht bereits als gelöst markiert oder Sie haben einen dramatisch besseren alternativen Ansatz für das Problem gefunden :)
Obsidian Age
4

Ich verwende python3.x und opencv 4.1.0. Im folgenden Code wurde ein Fehler angezeigt:

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

ERROR : too many values to Unpack

dann habe ich erfahren, dass der obige Code in python2.x verwendet wird. Also habe ich den obigen Code durch den folgenden ersetzt (IN python3.x), indem ich ein weiteres '_' in der linken Seite hinzugefügt habe

_,cnts, _ = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
Priyansh Gupta
quelle
Die einfachste Lösung
3

Sie müssen lediglich '_' hinzufügen, wenn Sie nicht die erforderliche Variable verwenden, die ursprünglich angegeben wurde von:

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

zu

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

Hier wird das Originaldokument angegeben: https://docs.opencv.org/3.1.0/d4/d73/tutorial_py_contours_begin.html

Edwardabk
quelle
2

Python ist richtig.
Sie können nicht 3 Werte aus dem Turple auspacken und in einen Turple von zwei legen contours, _ = cv2.findContours(skin_ycrcb, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

verwenden

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

Kishea
quelle
0

Keine große Sache, nur verwenden Sie möglicherweise open-cv 3.something, das an der Fehlerstelle 3 Werte zurückgibt, und Sie müssen nur 2 abfangen. Fügen Sie einfach eine Zufallsvariable vor der Konturvariablen hinzu.

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