2012-06-29 13 views
6

Sto provando a disegnare un poligono usando l'interfaccia python su opencv, cv2. Ho creato un'immagine vuota, solo un array numpy 640x480. Ho una lista di poligoni (quadrilateri a quattro punti) che voglio disegnare sull'immagine, tuttavia, non riesco a ottenere il formato giusto per istruire il cv2 dove dovrebbero essere i quadrilateri, e continuo a ricevere questo errore:Cosa vuole l'interfaccia python su opencv2.fillPoly come input?

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

il mio codice si compone di essenzialmente i seguenti:

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

dove previsto mia lista di rettangoli ha il 'confine' che contiene il valore di un elenco di (x, y) punti. Le stampe di codice:

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

ho pensato che questo è l'elenco dei punti di un poligono, ma a quanto pare quella lista ha un invalido points.checkvector, qualunque essa sia. Una ricerca su google per quell'errore non è risultata utile.

+0

Ho provato sia cv2.fillPoly e cv2.fillConvexPoly qui, ed entrambi gettare lo stesso errore ... – DaveA

+0

nota, OpenCV vuole 'uint8' per le immagini. Mentre sembravo in grado di scappare con 'int8' qui, mi ha causato problemi in seguito ... – DaveA

risposta

4

L'AssertionError ti dice che OpenCV vuole un numero intero a 32 bit con segno. La matrice di punti poligono dovrebbe avere quel particolare tipo di dati (ad esempio punti = numpy.array (A, dtype = 'int32')). Si potrebbe anche solo il cast per la chiamata di funzione (cioè my_array.astype ('Int32')) o come un amico ha messo una volta ...

" Modifica

cv2.fillConvexPoly (binary_image, np. array (rect [ 'confine']), 255) per

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

4

ho provato in opencv 2.4.2 e python 2.7. Dalla C++ interfaccia

void fillPoly(Mat& img, 
       const Point** pts, 
       const int* npts, 
       int ncontours, 
       const Scalar& color, 
       int lineType=8, 
       int shift=0, 
       Point offset=Point() 
      ) 

Sappiamo che il pts è la matrice della matrice di punti, così si dovrebbe cambiare in questo modo

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

aggiungere [] per il rect [ 'di confine' ].

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

Problemi correlati