web-dev-qa-db-de.com

OpenCV-Python: ValueError: zu viele Werte zum Entpacken

Ich schreibe ein opencv-Programm und habe auf einer anderen Stapelüberlauf-Frage ein Skript gefunden: Computer Vision: Maskieren einer menschlichen Hand

Wenn ich die Antwort per Skript 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!

65
ahmadux

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

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 OpenCVs aktuelle stabile Version 2.4.9 verwenden.

123
ahmadux

Sie müssen diese Zeile ändern;

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

Dies funktioniert in allen cv2 Versionen:

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

3
Safwan

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

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 finden Sie das Originaldokument: https://docs.opencv.org/3.1.0/d4/d73/tutorial_py_contours_begin.html

3
Edwardabk

python ist richtig.
Sie können nicht 3 Werte aus dem Turple auspacken und in einen Turple mit zwei Werten 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)

2
kishea

Ich verwende python3.x und opencv 4.1.0. Ich habe eine Fehlermeldung in folgendem Code erhalten:

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

ERROR : too many values to Unpack

dann erfuhr ich, dass der obige Code in python2.x verwendet wird SO) Ich habe den obigen Code nur durch den folgenden (IN python3.x) ersetzt, indem ich links ein weiteres '_' hinzufügte Guck mal

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