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は私が見せることができる普通の画像です。現在、私は自分でこれらのポイント間に線を引いていますが、よりエレガントなソリューションを探しています。
このエラーを修正するにはどうすればよいですか?
私の場合の問題は、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
を確認する必要があります)
この関数は十分に文書化されておらず、エラーもあまり役に立ちません。とにかく、 - 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)
上記の例では、次の画像が印刷されます(再スケーリングされます)。
エラーには、配列の次元が2である必要があることが示されています。そのため、次のように配列の形状を変更します。
points = points.reshape(-1,1,2)
その後、正常に動作します。
また、jabaldonedoから提供された回答もうまくいきます。
cv2.fillPoly( im, np.int32(points))
をcv2.fillPoly( im, np.int32([points]))
に置き換えます。それが動作します。
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)
説明を提供するための公式ドキュメント、再形成が必要