次のコードを使用して輪郭を実装しようとしています。
im = cv2.imread('C:\Users\Prashant\Desktop\T.jpg')
imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(imgray,127,255,0)
image, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
img = cv2.drawContour(im, contours, -1, (0,255,0), 3)
cv2.imshow('Image1',img)
しかし、次のエラーが継続的に発生します。
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python27\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 540, in runfile
execfile(filename, namespace)
File "C:/Users/Prashant/.spyder2/.temp.py", line 17, in <module>
image, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
ValueError: need more than 2 values to unpack
関数findContoursにはさらに引数が必要ですか?修正するにはどうすればよいですか?.
OpenCV 2では、 findContours
は2つの値contours
とhierarchy
のみを返します。このエラーは、pythonがこれらの2つの値を、このステートメントの左側にある3つの名前に割り当てようとしたときに発生します。
image, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
これで3つの値が返されます。
findContours(image, mode, method[, contours[, hierarchy[, offset]]])
画像、等高線、階層を返す
findContoursopencvの3つの値の画像、等高線、および階層のみを返します
image, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
2019年現在、OpenCVの3つのバージョン(OpenCV2、OpenCV3、およびOpenCV4)があります。
OpenCV4とOpenCV2の動作は似ています(cv2.findContours
から2つの値を返す)。一方、OpenCV3は3つの値を返します。
if cv2.getVersionMajor() in [2, 4]:
# OpenCV 2, OpenCV 4 case
contour, hier = cv2.findContours(
thresh.copy(), cv2.RETR_CCOMP, cv2.CHAIN_APPROX_NONE)
else:
# OpenCV 3 case
image, contour, hier = cv2.findContours(
thresh.copy(), cv2.RETR_CCOMP, cv2.CHAIN_APPROX_NONE)
これは役立つはずです:
image, contours, hierarchy = cv2.findContours(thresh.copy(),
cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
-findContoursは2つの値のみを返します。だからちょうど使用し、
だから中古
コンター、hierarchy = cv2.findContours(thresh、cv2.RETR_TREE、cv2.CHAIN_APPROX_SIMPLE)
OpenCVのバージョンに応じて、cv2.findContours()
にはさまざまな戻り署名があります。 OpenCV 3.4.Xでは、 cv2.findContours()
は3つの項目を返します。 OpenCV 2.Xおよび4.1.Xでは、 cv2.findContours()
は2つの項目を返します
次のようなバージョンに関係なく、コンターを簡単に取得できます。
cnts = cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
Pythonバージョン2.7.14(v2.7.14:84471935ed、2017年9月16日20:25:58)[MSC v.1500 64ビット(AMD64)]
NumPyバージョン:1.16.1
argparseバージョン:1.1
CV2バージョン:4.0.0
Traceback (most recent call last):
File "omr.py", line 254, in <module>
main()
File "omr.py", line 237, in main
answers, im = get_answers(args.input)
File "omr.py", line 188, in get_answers
contours = get_contours(im)
File "omr.py", line 26, in get_contours
im2, contours, hierarchy =cv2.findContours(image_gray,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
ValueError: need more than 2 values to unpack
これは、26行目から「im2」を削除することで解決されます。OpenCvバージョン3.0以降と同様に、関数「findContours」は2つの値のみを返すため、ステートメントは次のようになります。
contours, hierarchy =cv2.findContours(image_gray,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
openCvのバージョンをアップグレードする
現在のOpencvバージョンcv2.findContoursによると、2つの値が返されます。輪郭は、同じ色または強度を持つ、(境界に沿った)すべての連続した点を結ぶ曲線として簡単に説明できます。輪郭は、形状分析とオブジェクトの検出と認識に役立つツールです。