2012-06-29 12 views
6

Estoy tratando de dibujar un polígono utilizando la interfaz de python para opencv, cv2. Creé una imagen vacía, solo una matriz numpy de 640x480. Tengo una lista de polígonos (cuadriláteros de cuatro puntos) que quiero dibujar en la imagen, sin embargo, parece que no puedo obtener el formato correcto para instruir cv2 donde deberían estar los cuadriláteros, y sigo obteniendo este error:¿Qué quiere la interfaz de python para opencv2.fillPoly como entrada?

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 las siguientes:

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 en espera tiene el 'límite' que contiene el valor de una lista de (x, y) puntos. La impresora de código:

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

que pensé que esta es la lista de puntos de un polígono, pero al parecer esa lista tiene un inválido points.checkvector, cualquiera que sea. Una búsqueda en google de ese error no arrojó nada útil.

+0

He intentado tanto cv2.fillPoly y cv2.fillConvexPoly aquí, y ambos lanzan el mismo error ... – DaveA

+0

nota, OPENCV quiere 'uint8' para imágenes. Si bien parecía que podía salir con 'int8' aquí, me causó problemas más tarde ... – DaveA

Respuesta

4

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

" Cambio

cv2.fillConvexPoly (binary_image, np. array (rect [ 'límite']), 255) a

cv2.fillConvexPoly (binary_image, np.array (rect [ 'límite'], 'int32'), 255) "

4

tengo probado 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 los pts es el conjunto de matriz de puntos, por lo que debe cambiar como esto

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

añadir [] a la rect [ 'límite' ].

6
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

Cuestiones relacionadas