web-dev-qa-db-fra.com

Que veut l'interface python vers opencv2.fillPoly comme entrée?)

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.

21
DaveA

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

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

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'].

6
Cheaster