web-dev-qa-db-ja.com

python opencv2.fillPolyへのインターフェースは入力として何を求めますか?

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、それが何であれ。そのエラーをグーグルで検索しても何も役に立たなかった。

21
DaveA

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) "

10
adrien g
import numpy as np
import cv2
import matplotlib.pyplot as plt

a3 = np.array( [[[10,10],[100,10],[100,100],[10,100]]], dtype=np.int32 )
im = np.zeros([240,320],dtype=np.uint8)
cv2.fillPoly( im, a3, 255 )

plt.imshow(im)
plt.show()

result display

18
themadmax

私は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']に[]を追加します。

6
Cheaster