web-dev-qa-db-fra.com

OpenCV python: ValueError: trop de valeurs à décompresser

J'écris un programme ouvert et j'ai trouvé un script sur une autre question de stackoverflow: Computer Vision: Masquer une main humaine

Lorsque j'exécute la réponse par script, le message d'erreur suivant s'affiche:

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

Le 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)

Toute aide est appréciée!

65
ahmadux

J'ai eu la réponse du site OpenCV Stack Exchange. réponse

LA RÉPONSE:

Je parie que vous utilisez la branche principale d’OpenCV actuelle: ici, les instructions de retour ont changé, voir http://docs.opencv.org/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html?highlight=findcontours .

Ainsi, modifiez la ligne correspondante pour lire:

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

Ou: comme le tronc actuel n'est toujours pas stable et que vous rencontrerez probablement d'autres problèmes, vous pouvez utiliser la version stable actuelle d'OpenCV 2.4.9.

123
ahmadux

Vous devez changer cette ligne.

image, contours, _ = cv2.findContours(skin_ycrcb, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
16
Volkan Altıntaş

Cela fonctionne dans toutes les versions cv2:

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

3
Safwan

La chose que vous devez faire est simplement d'ajouter '_' là où vous n'utilisez pas la variable requise, donnée à l'origine par:

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

à

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

Ici, le document original est donné: https://docs.opencv.org/3.1.0/d4/d73/tutorial_py_contours_begin.html

3
Edwardabk

python a raison.
vous ne pouvez pas décompresser 3 valeurs de la turple et les placer dans une turple de deux contours, _ = cv2.findContours(skin_ycrcb, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

utilisation

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

2
kishea

J'utilise python3.x et opencv 4.1.0, j'ai eu une erreur dans le code suivant:

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

ERROR : too many values to Unpack

alors je suis venu pour savoir que le code ci-dessus est utilisé dans python2.x SO je viens de remplacer le code ci-dessus par au-dessous d'un (IN python3.x) en ajoutant un '_' de plus dans le côté gauche regarde

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