web-dev-qa-db-ja.com

python例外をスローするOpencv polylines関数

Opencvのpolylines関数を使用して、画像上に任意の四角形を描画しようとしています。すると、次のエラーが表示されます

OpenCVエラー:アサーションに失敗しました(p.checkVector(2、CV_32S)> = 0)、ポリライン、ファイル/tmp/buildd/ros-fuerte-opencv2-2.4.2-1precise-20130312-1306/modules/core/src/d rawing.cpp、行2065

私はそのように関数を呼び出します、

cv2.polylines(img, points, 1, (255,255,255))

以下に示すように、ポイントはnumpy配列です(画像サイズは1280x960):

[[910 641]
 [206 632]
 [696 488]
 [458 485]]

そしてimgは私が見せることができる普通の画像です。現在、私は自分でこれらのポイント間に線を引いていますが、よりエレガントなソリューションを探しています。

このエラーを修正するにはどうすればよいですか?

27
Ashok

私の場合の問題は、numpy.arrayがデフォルトでint64-ビット番号を作成したことです。したがって、明示的にint32に変換する必要がありました。

points = np.array([[910, 641], [206, 632], [696, 488], [458, 485]])
# points.dtype => 'int64'
cv2.polylines(img, np.int32([points]), 1, (255,255,255))

(cv2 pythonバインディングのバグのようです。dtypeを確認する必要があります)

41
Vanuan

この関数は十分に文書化されておらず、エラーもあまり役に立ちません。とにかく、 - cv2.polylines はポイントのリストを期待します。行を次のように変更してください:

import cv2
import numpy as np

img = np.zeros((768, 1024, 3), dtype='uint8')

points = np.array([[910, 641], [206, 632], [696, 488], [458, 485]])
cv2.polylines(img, [points], 1, (255,255,255))

winname = 'example'
cv2.namedWindow(winname)
cv2.imshow(winname, img)
cv2.waitKey()
cv2.destroyWindow(winname)

上記の例では、次の画像が印刷されます(再スケーリングされます)。

enter image description here

29
jabaldonedo

エラーには、配列の次元が2である必要があることが示されています。そのため、次のように配列の形状を変更します。

points = points.reshape(-1,1,2)

その後、正常に動作します。

また、jabaldonedoから提供された回答もうまくいきます。

5
Abid Rahman K

cv2.fillPoly( im, np.int32(points))cv2.fillPoly( im, np.int32([points]))に置き換えます。それが動作します。

1
Ranjeet Thakur
pts = np.array([[40,300],[54,378],[60,420],[30,333]],np.int32) 
pts = pts.reshape((-1,1,2))
img = cv2.polylines(img,pts,True,(125,215,145),1)

説明を提供するための公式ドキュメント、再形成が必要

0
xm L