J'essaye de dessiner un polygone en utilisant l'interface python interface vers opencv, cv2. J'ai créé une image vide, juste un tableau numpy 640x480. J'ai une liste de polygones (quadrilatères à quatre points ) que je veux dessiner sur l'image, cependant, je n'arrive pas à obtenir le bon format pour indiquer à cv2 où les quadrilatères devraient être, et j'obtiens toujours cette erreur:
OpenCV Error: Assertion failed (points.checkVector(2, CV_32S) >= 0) in fillConvexPoly, file .../OpenCV-2.4.0/modules/core/src/drawing.cpp, line 2017
Mon code se compose essentiellement de ce qui suit:
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()
où ma liste de rects dans attendue a la "limite" contenant la valeur d'une liste de (x, y) points. Le code s'imprime:
[[ 91 233]
[419 227]
[410 324]
[ 94 349]]
J'ai pensé que c'était la liste des points pour un polygone, mais apparemment cette liste a un points.checkvector
, Quoique ce soit. Une recherche Google pour cette erreur n'a rien révélé d'utile.
AssertionError vous indique qu'OpenCV veut un entier 32 bits signé. Le tableau de points de polygone doit avoir ce type de données particulier (par exemple points = numpy.array(A,dtype='int32')
). Vous pouvez également simplement le lancer pour l'appel de fonction (c'est-à-dire my_array.astype('int32')
) ou comme un ami l'a mis une fois ...
" En changeant
cv2.fillConvexPoly(binary_image, np.array(rect['boundary']), 255)
à
cv2.fillConvexPoly(binary_image, np.array(rect['boundary'], 'int32'), 255)
"
J'ai essayé dans opencv 2.4.2 et python 2.7. Depuis l'interface 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()
)
nous savons que pts est le tableau du tableau de points, vous devriez donc changer comme ceci
cv2.fillConvexPoly(binary_image, np.array([rect['boundary']], 'int32'), 255)
ajoutez [] au rect ['boundary'].