¿Qué quiere la entrada de la interfaz de python para opencv2.fillPoly?

Estoy tratando de dibujar un polígono usando la interfaz de python para opencv, cv2. He creado una imagen vacía, solo una matriz de 640×480 números. Tengo una lista de polígonos (cuadriláteros de cuatro puntos) que quiero dibujar en la imagen, sin embargo, no puedo encontrar el formato correcto para indicar a cv2 dónde deberían estar los cuadriláteros, y sigo recibiendo este error:

OpenCV Error: Assertion failed (points.checkVector(2, CV_32S) >= 0) in fillConvexPoly, file .../OpenCV-2.4.0/modules/core/src/drawing.cpp, line 2017 

Mi código consiste esencialmente en lo siguiente:

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

donde mi lista de rectas esperadas tiene el ‘límite’ que contiene el valor de una lista de puntos (x, y). El código se imprime:

 [[ 91 233] [419 227] [410 324] [ 94 349]] 

Me di cuenta de que esta es la lista de puntos para un polígono, pero aparentemente esa lista tiene points.checkvector no points.checkvector , sea lo que sea. Una búsqueda en google de ese error resultó nada útil.

AssertionError le está diciendo que OpenCV quiere un entero de 32 bits firmado. La matriz de puntos de polígono debe tener ese tipo de datos en particular (por ejemplo, points = numpy.array(A,dtype='int32') ). También puede simplemente my_array.astype('int32') para la llamada a la función (es decir my_array.astype('int32') ) o como amigo lo puso una vez …

” Cambiando

cv2.fillConvexPoly(binary_image, np.array(rect['boundary']), 255) para

cv2.fillConvexPoly(binary_image, np.array(rect['boundary'], 'int32'), 255)

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

pantalla de resultados

He intentado en opencv 2.4.2 y python 2.7. Desde la interfaz 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() ) 

sabemos que los puntos son la matriz de puntos, por lo que deberías cambiar así

 cv2.fillConvexPoly(binary_image, np.array([rect['boundary']], 'int32'), 255) 

agregue [] al rect [‘límite’] .