2009-12-10 26 views
7

Problema: sto tentando di allineare due fotogrammi di un video in movimento.Come estrarre i vettori di velocità dal flusso ottico denso?

Attualmente sto cercando di utilizzare la funzione "cvCalcOpticalFlowLK" e il risultato emette i vettori di velocità di xey sotto forma di "CvArr".

Quindi ho ottenuto il risultato, ma non sono sicuro di come utilizzare questi vettori di vettori.

La mia domanda è questa ... come faccio a sapere qual è la velocità di ogni pixel? È solo il valore di ciascun valore di pixel in quel particolare punto?

Nota: avrei utilizzato le altre funzioni di flusso ottico come cvCalcOpticalFlowPyrLK() in quanto è molto più semplice, ma voglio il flusso ottico denso.

+0

Quindi ho giocato con l'immagine risultante e vado assumendo che ogni valore di pixel rappresenti la velocità di ciascun pixel, ma in quale unità si misura esattamente? Qualcuno sa come questi "valori di velocità" corrispondono alla velocità di quel pixel? È pixel per frame? O qualcos'altro? Il valore di ciascun pixel è in virgola mobile a 32 bit. – monky822

risposta

4

Apparentemente la mia ipotesi originale era vera. Le uscite "velx" e "vely" dalla funzione di flusso ottico sono le velocità effettive per ciascun valore di pixel. Per estrarli meglio, ho avuto accesso al pixel dai dati grezzi e ho tirato il valore. Ci sono 2 modi per farlo.

cvGet2D() - in questo modo è più lento ma se è necessario accedere solo a 1 pixel, va bene.

o

(uchar *) (immagine-> imageData + altezza * immagine-> widthStep + larghezza);

(immagine è un IplImage, larghezza e altezza sono solo le corrispondenti larghezze e altezze di immagine)