2012-10-27 21 views
5

La documentazione più recente OpenCV here dice che si può convertire un IplImage a un array Numpy proprio come questo:veloce conversione di IplImage di serie Numpy

arr = numpy.asarray(im) 

ma che non funziona per le mie esigenze, perché a quanto pare doesn 'supporto matematica t:

x = arr/0.01 
TypeError: unsupported operand type(s) for /: 'cv2.cv.iplimage' and 'float' 

Se provo a specificare il tipo di dati, non posso nemmeno arrivare così lontano:

arr = numpy.asarray(im, dtype=num.float32) 
TypeError: float() argument must be a string or a number 

Quindi sto utilizzando il codice fornito nella documentazione precedente here. In sostanza, lo fa:

arr = numpy.fromstring(im.tostring(), dtype=numpy.float32) 

Ma la chiamata tostring è molto lento, forse perché è la copia dei dati? Ho bisogno che questa conversione sia molto veloce e non copi nessun buffer di cui non abbia bisogno. Non penso che i dati siano intrinsecamente incompatibili; Sto creando il mio IplImage con cv.fromarray in primo luogo, che è estremamente veloce e accettato dalle funzioni OpenCV.

C'è un modo per far funzionare il nuovo metodo asarray per me, oppure posso accedere direttamente al puntatore dati in IplImage in modo che lo numpy.fromstring lo accetti? Sto usando OpenCV 2.3.1 prepackaged per Ubuntu Precise.

+0

OpenCV è in fase di sviluppo, anche i binding Python. Dovresti prima provare OpenCV 2.4.2 o 2.4.3rc. – ypnos

+0

La domanda è valida. Esiste già un codice Python precedente per i bindgins 'cv' di OpenCV. Sono ancora supportati a partire da OpenCV 2.4.2. Convertirli in 'cv2' potrebbe non essere sempre un'opzione. – sastanin

risposta

9

Curiosità:
Di 'si chiama:

import cv2.cv as cv #Just a formality! 

Capture = cv.CaptureFromCAM(0) 
Img = cv.QueryFrame(Capture) 

L'oggetto Img è un ipimage, e numpy.asarray(Img) è irregolare al meglio. Però! Img[:,:] è un tipo cvmat e numpy.asarray(Img[:,:]) funziona in modo fantastico e più importante: rapidamente!

Questo è di gran lunga il modo più veloce che ho trovato per prendere un frame e renderlo un ndarray per l'elaborazione numpy.

+0

Fantastico, ci proverò. Non sarà presto, purtroppo. – jab

+0

Grazie! Funziona alla grande. –

0

Questa pagina non dice di IplImage. Dice circa CvMat che è diverso.

In ogni caso è preferibile utilizzare i wrapper dal nuovo spazio dei nomi cv2. In modo nativo utilizza array numpy invece dei propri contenitori immagine. Anche l'intero modulo cv è considerato deprecato e verrà completamente eliminato nella versione principale più vicina.

+1

Vuoi dire che dovrei usare 'cv2.fromarray()' o qualcosa del genere, e quindi 'numpy.asarray()' funzionerà magicamente? Puoi fornire un link ai documenti? – jab

+0

Inoltre, come * # @ $ qualcuno avrebbe dovuto saperlo? Sto usando OpenCV spento e acceso dalla versione 0.1, e scappo sempre urlando. È come un film dell'orrore - temo che ci sarà un mostro dietro la porta, ma lo apro comunque. – jab