web-dev-qa-db-ja.com

OpenCV python:ValueError:展開するには値が多すぎます

私は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)

どんな助けも大歓迎です!

65
ahmadux

OpenCV Stack Exchangeサイトから回答を得ました。 回答

答え:

現在のOpenCVのマスターブランチを使用しているに違いありません。ここでreturnステートメントが変更されました。 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)

または:現在のトランクはまだ安定しておらず、おそらくさらにいくつかの問題が発生するため、OpenCVの現在の安定バージョン2.4.9を使用することをお勧めします。

123
ahmadux

この行を変更する必要があります。

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

これはすべてのcv2バージョンで機能します:

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

3
Safwan

必要なのは、必要なvarを使用していない場所に「_」を追加することです。

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

3
Edwardabk

pythonは正しい。
タープルから3つの値をアンパックして、それらを2つのタームに配置することはできません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)

2
kishea

私は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で使用されていることを知りましたSO私は、左端にもう1つ '_'を追加することにより、上記のコードを以下の1つに置き換えました

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