2012-11-12 6 views
9

Sto riscontrando un errore interessante con opencv 2.4.3 su python 2.7.3 su Windows. Quando si tenta di utilizzare drawContours, viene visualizzato un errore "TypeError: profilesurs type = 5 non supportato" a meno che non decapri/desimini prima i contorni.Errore di tipo di dati con drawContours a meno che non decapri prima/apri il primo

Questo non funziona (ho la "TypeError: tipo di dati contorni = 5 non è supportato"):

noBg = cv2.blur(src, (5,5)) 
noBg = cv2.inRange(noBg, np.array([80, 0, 200], np.uint8), np.array([255, 50, 255], np.uint8)) 
noBg = np.invert(noBg) 
contours, hierarchy = cv2.findContours(noBg, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) 
cv2.drawContours(src, contours, -1, (0,255,0), 3) 

Ma questo funziona:

noBg = cv2.blur(src, (5,5)) 
noBg = cv2.inRange(noBg, np.array([80, 0, 200], np.uint8), np.array([255, 50, 255], np.uint8)) 
noBg = np.invert(noBg) 
contours, hierarchy = cv2.findContours(noBg, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) 

tmp = cPickle.dumps(contours)  
contours = cPickle.loads(tmp) 

cv2.drawContours(src, contours, -1, (0,255,0), 3) 

Qualcun altro ha visto questo comportamento o mi manca qualcosa di ovvio? Sono nuovo di Python/Opencv, quindi potrebbe essere il caso.

Modifica: Ho appena provato questo sul mio Mac, ed entrambi i casi funzionano bene. Forse solo un problema di Windows?

+0

Hai controllato se il processo di salamoia finisce in realtà per cambiare il vostro contorni tipo di dati ? Dovresti scrivere un altro codice per testare come Pickle/Unpickle modifica effettivamente i dati. – AJMansfield

+0

Se utilizzo la stampa, i dati appaiono identici prima e dopo il decapaggio. C'è un modo migliore per me per confrontare i due? Sono d'accordo che qualcosa deve essere diverso. –

+0

@ user1816939 Non ho davvero idea di come si possa fare un confronto migliore. Forse passando e stampando il valore di tutti i membri degli oggetti? Anche se ciò implicherebbe scrivere più codice di quanto dovrebbe ... Forse una sorta di debugger può farlo? – AJMansfield

risposta

8

Se si esegue il downgrade a 2.4.2 opencv, ciò funzionerà. Sembra essere un bug con 2.4.3 che è stato appena rilasciato due settimane fa.

+1

Questo ha funzionato. Grazie! Questo bug è stato segnalato a OpenCV? –

4

Ho appena avuto lo stesso problema dopo aver ottenuto OpenCV 2.4.3 quando utilizzo i contorni da findContours e convessoHull. Poiché non volevo eseguire il downgrade, la fusione degli elementi dell'array di contorni su int risolve temporaneamente il problema.

contours, _ = cv2.findContours(noBg,cv2.RETR_LIST ,cv2.CHAIN_APPROX_SIMPLE,offset = (0,0)) 
hull_contour = cv2.convexHull(contours[0].astype('int')) 
+0

funziona benissimo! ;) – yakxxx

0

Ho avuto un problema simile con il disegno di polilinee. Si aspettava interi a 32 bit.

stavo facendo il casting per i punti Uint32:

use_points = np.uint32(original_points) 

Il problema era che si aspettava interi con segno di 32 bit, interi non senza segno. E 'stato un subtelty nel codice in modo che era difficile da trovare, ma allora questo ha funzionato:

use_points = np.int32(original_points) 

Usando solo np.int32 invece di np.uint32

Problemi correlati