Flusso ottico / spostamento dell'immagine approssimativi rapidi


9

Devo rilevare la velocità con cui una telecamera esegue il panning (orizzontale / verticale) per avvertire l'operatore di rallentare.

L'intera immagine si muove come un blocco, non ho bisogno di una direzione reale (anche se H o V sarebbe un bonus) e ho solo bisogno di una grandezza approssimativa - cioè. si attiva se più di 'N' pixel si spostano tra i frame.

Le immagini sono scene a basso contrasto generalmente grandi e uniformi, non ho evidenti punti salienti da tracciare. Devo farlo in tempo reale (60 fps) e senza usare tutta la CPU.

La soluzione Niave è scegliere una RoI al centro, trovare i bordi, calcolare la somiglianza tra coppie di fotogrammi, spostare uno dei fotogrammi a sinistra / destra / su / giù di un pixel, ripetere - trova i minimi.

Mi chiedevo se ci fosse una soluzione più intelligente?

Risposte:


3

Probabilmente se stai cercando un metodo semplice , è applicare gli algoritmi di stima del movimento standard che sono molto maturati nella classe di codec di compressione MPEG. Sono facili da capire e immagino che otterrai molti codici pronti per l'uso. Questo algoritmo produce vettore di movimento su base blocco per blocco, quindi è possibile trovare il cluster più prominente e prendere la direzione e l'entità media del vettore di movimento.

MPEG4 - ha un altro concetto chiave chiamato " Compensazione del movimento globale ", una tecnica che tenta in primo luogo di stimare e compensare il movimento e il pan della telecamera. Il bello è che tali metodi possono essere più semplici o esaustivi a seconda della complessità. Ecco un esempio di carta e un altro documento per lo stesso.

In generale, la panoramica della telecamera e la stima del movimento sono un ambito di ricerca piuttosto consolidato. ecco un riferimento: carta e un'altra carta .

Su questo argomento. Troverai sia un rigore che un algoritmo accurato, nonché semplici e veloci.


Se posso agganciare convenientemente una libreria MPEG che sarebbe buona cosa, ricordo che GMC in Mpeg aveva delle critiche. Ho pensato che sarebbe stata un'area comune a causa degli algoritmi di stabilizzazione della fotocamera
Martin Beckett,

Puoi sicuramente agganciare (o piuttosto estrarre) gli algoritmi MPEG. Puoi usare FFMPEG come libreria ed estrarlo, ma potrebbe diventare complicato. In alternativa, puoi leggere il codice accurato di MSSG da estrarre.
Dipan Mehta,

Per quanto riguarda le critiche su GMC, è molto più che promettente ridurre drasticamente il bit rate e creare una codifica basata su oggetti . Tuttavia, non è così difficile stimare i parametri di movimento della telecamera.
Dipan Mehta,

grazie, darò un'occhiata a MSSG. Uso ffmpeg ma non è una libreria semplice per estrarre le cose!
Martin Beckett,

3

Questa potrebbe essere una soluzione lenta e terribile, ma potresti fare una correlazione incrociata basata su FFT dei frame successivi e quindi trovare il picco per identificare l'offset tra i frame. Forse fallo solo su un piccolo sottoinsieme dell'immagine per salvare i cicli del processore.

Non funzionerebbe con la rotazione o cambi drastici di scena da un fotogramma all'altro e probabilmente ci sono metodi migliori. Questa è una specie di soluzione "Ho un martello, quindi tutto sembra un chiodo". Immagino che sia proprio come la tua ingenua soluzione, tranne per il fatto che non è necessario il rilevamento dei bordi e FFT lo rende molto più veloce rispetto allo spostamento esplicito di un pixel alla volta.

Questa domanda è simile e nessuno suggerisce altro che la correlazione incrociata, quindi forse non è così male: usare MATLAB per calcolare l'offset tra le immagini successive


Grazie, è facile supporre che FFT sia lento, ma posso fare una piccola finestra 2 ^ n. ps. Solo per la ricerca stackoverflow.com/questions/1100100/…
Martin Beckett

3

Un modo per stimare la velocità e la direzione sarebbe quello di fare una stima del flusso "locale", ad esempio di quattro finestre al centro dell'immagine. Il metodo differenziale di Lucas-Kanade presuppone che lo spostamento sia approssimativamente costante ed è quindi possibile risolverlo come equazione.

Quindi la mia guida dettagliata sarebbe:

  1. Ottieni una finestra di pixel al centro dell'immagine, ad esempio 20x20
  2. Calcola i gradienti Ix e Iy.
  3. Dividi la finestra del gradiente in quattro pezzi, ad esempio 4x10x10.
  4. Risolvi le quattro equazioni dei minimi quadrati lineari con il fotogramma successivo.
  5. Media dei quattro vettori di velocità.

Ciò determina la direzione e la velocità, tuttavia è possibile utilizzare una finestra ponderata per renderla più robusta. Guarda il metodo Lucas-Kanade per le sue estensioni.


0

Penso che la correlazione incrociata sia un buon approccio per trovare l'offset, ma se si desidera farlo molto velocemente, si potrebbe provare a limitarlo a una sola linea di scansione verticale e una orizzontale (cioè attraverso il centro dell'immagine). Il calcolo della correlazione incrociata tra le linee di scansione in entrambi i frame dovrebbe fornire un'approssimazione dell'offset orizzontale e verticale.


Questo potrebbe funzionare, ma se esegue la panoramica in diagonale, non funzionerà bene, anche se è solo un po 'di jitter su e giù durante la panoramica lateralmente. Penso che una sottoregione rettangolare al centro dell'immagine sarebbe migliore.
endolith
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.