python opencv、cv2へのインターフェイスを使用してポリゴンを描画しようとしています。空のイメージを作成しました。640x480のnumpy配列だけです。ポリゴンのリストがあります(4点四角形) )画像に描画したいのですが、四角形の位置をcv2に指示するためのギ酸の権利を取得できていないようで、このエラーが発生し続けます。
OpenCV Error: Assertion failed (points.checkVector(2, CV_32S) >= 0) in fillConvexPoly, file .../OpenCV-2.4.0/modules/core/src/drawing.cpp, line 2017
私のコードは基本的に次のもので構成されています:
binary_image = np.zeros(image.shape,dtype='int8')
for rect in expected:
print(np.array(rect['boundary']))
cv2.fillConvexPoly(binary_image, np.array(rect['boundary']), 255)
fig = pyplot.figure(figsize=(16, 14))
ax = fig.add_subplot(111)
ax.imshow(binary_image)
pyplot.show()
ここで、予想される長方形のリストには、(x、y)ポイントのリストの値を含む「境界」があります。コードは次のように出力します。
[[ 91 233]
[419 227]
[410 324]
[ 94 349]]
これはポリゴンのポイントのリストであると考えましたが、そのリストには無効なpoints.checkvector
、それが何であれ。そのエラーをグーグルで検索しても何も役に立たなかった。
AssertionErrorは、OpenCVが符号付きの32ビット整数を必要としていることを通知しています。ポリゴンポイントの配列には、その特定のデータタイプが必要です(例:points = numpy.array(A,dtype='int32')
)。関数呼び出し(つまりmy_array.astype('int32')
)にキャストするか、友人が一度それを置くと...
"変化
cv2.fillConvexPoly(binary_image, np.array(rect['boundary']), 255)
to
cv2.fillConvexPoly(binary_image, np.array(rect['boundary'], 'int32'), 255)
"
私はopencv 2.4.2とpython 2.7。c ++インターフェースから
void fillPoly(Mat& img,
const Point** pts,
const int* npts,
int ncontours,
const Scalar& color,
int lineType=8,
int shift=0,
Point offset=Point()
)
ptsはポイントの配列の配列であるため、次のように変更する必要があります。
cv2.fillConvexPoly(binary_image, np.array([rect['boundary']], 'int32'), 255)
rect ['boundary']に[]を追加します。