Optical Flow
Il flusso ottico stima lo spostamento di ogni pixel tra due fotogrammi video sotto forma di campo di vettori di movimento. Metodi classici e deep learning, applicazioni e codice OpenCV.
Il flusso ottico è il movimento apparente dei pattern di luminosità tra due immagini, di solito fotogrammi video consecutivi. Un algoritmo di flusso ottico stima, per ogni pixel del primo fotogramma, un vettore di spostamento 2D (dx, dy) che indica dove appare il contenuto di quel pixel nel secondo fotogramma. Il risultato, chiamato campo di flusso, descrive il movimento degli oggetti in movimento e della telecamera stessa, consentendo ai sistemi di visione artificiale di stabilizzare i video, stimare il movimento proprio, interpolare i fotogrammi e riconoscere le azioni. Il flusso misura ciò che vede la telecamera, non il vero movimento 3D: una sfera perfettamente uniforme che ruota sul posto non produce flusso, mentre un’ombra in movimento produce flusso anche se non si muove nulla di fisico.
Come si stima il flusso ottico#
La maggior parte dei metodi parte dalla costanza della luminosità, ovvero dall’ipotesi che un punto mantenga la stessa intensità mentre si sposta. La sua linearizzazione produce un’equazione per pixel, Ix·u + Iy·v + It = 0, dove Ix, Iy e It sono le derivate dell’immagine rispetto a x, y e al tempo, e (u, v) è il flusso incognito. Un’equazione non può determinare due incognite: questo è il problema dell’apertura. Guardando un bordo rettilineo attraverso una piccola finestra, è misurabile solo il movimento perpendicolare al bordo. I metodi classici aggiungono una seconda ipotesi per risolverlo:
- Metodo di Lucas-Kanade (1981): Presuppone che il flusso sia costante all’interno di una piccola finestra e risolve le equazioni di tutti i suoi pixel con il metodo dei minimi quadrati. Funziona quando la finestra contiene gradienti in due direzioni, come agli angoli, perciò viene solitamente eseguito come flusso sparso su punti caratteristici selezionati.
- Metodo di Horn-Schunck (1981): Presuppone che il campo di flusso sia uniforme in tutta l’immagine e risolve un problema di ottimizzazione globale, producendo un flusso denso per ogni pixel.
Entrambe le ipotesi non reggono in presenza di grandi movimenti, quindi i metodi pratici stimano il flusso da grossolano a fine su una piramide di immagini: un movimento di 16 pixel alla risoluzione massima corrisponde a un movimento di 2 pixel tre livelli più in basso:
OpenCV implementa Lucas-Kanade piramidale per i punti sparsi e l’algoritmo di espansione polinomiale di Gunnar Farnebäck del 2003 per il flusso denso. Questo codice sposta una texture casuale di una quantità nota e recupera il movimento con il flusso denso di Farnebäck:
import cv2
import numpy as np
# A smooth random texture, then the same texture moved 3 px right and 2 px down
rng = np.random.default_rng(0)
texture = cv2.GaussianBlur(rng.random((240, 320)), (0, 0), 3)
frame1 = cv2.normalize(texture, None, 0, 255, cv2.NORM_MINMAX).astype(np.uint8)
frame2 = np.roll(frame1, shift=(2, 3), axis=(0, 1))
# Dense Farneback optical flow: one (dx, dy) displacement vector for every pixel
flow = cv2.calcOpticalFlowFarneback(
frame1, frame2, None, pyr_scale=0.5, levels=3, winsize=15, iterations=3, poly_n=5, poly_sigma=1.2, flags=0
)
print(f"flow field shape: {flow.shape}")
print(f"median motion: dx={np.median(flow[..., 0]):.2f}, dy={np.median(flow[..., 1]):.2f} pixels")Stampa flow field shape: (240, 320, 2) e median motion: dx=3.00, dy=2.00 pixels: un vettore a due componenti per ciascuno dei 76.800 pixel, recuperando lo spostamento di 3 pixel in orizzontale e 2 pixel in verticale.
Metodi di deep learning#
Nel 2015 FlowNet ha dimostrato che una rete neurale convoluzionale poteva apprendere il flusso end-to-end da dati di addestramento sintetici, dato che i video reali raramente includono il flusso di riferimento. PWC-Net ha integrato in una rete compatta le idee di piramide, warping e volume di costo dei metodi classici. RAFT, che ha vinto il premio per il miglior articolo a ECCV 2020, confronta ogni pixel del primo fotogramma con ogni pixel del secondo in un volume di correlazione e perfeziona un singolo campo di flusso ad alta risoluzione con aggiornamenti ricorrenti ripetuti. I metodi basati sull’apprendimento gestiscono spostamenti ampi, mosso e regioni prive di texture molto meglio dei metodi classici, e torchvision include modelli RAFT preaddestrati. La precisione viene riportata come errore di endpoint (EPE), ovvero la distanza media in pixel tra i vettori di flusso previsti e quelli reali, su benchmark come MPI Sintel e KITTI 2015.
Flusso ottico e termini correlati#
- Tracciamento degli oggetti: Segue oggetti interi con ID persistenti per molti fotogrammi, mentre il flusso ottico descrive il movimento per pixel tra due fotogrammi e non conosce gli oggetti. I tracker usano il flusso come indizio: nella modalità di tracciamento di Ultralytics YOLO, il tracker predefinito TrackTrack e BoT-SORT stimano il movimento della telecamera con il flusso sparso di Lucas-Kanade (
gmc_method: sparseOptFlow), tracciando fino a 400 angoli in un fotogramma a metà risoluzione, adattando a essi rotazione, scala e traslazione con RANSAC e spostando ogni riquadro di tracciamento previsto in base a quel movimento prima di associarlo alle nuove rilevazioni. - Tracciamento dei punti: Segue punti selezionati attraverso video lunghi, anche in presenza di occlusioni, invece di stimare il movimento di ogni pixel tra due fotogrammi.
- Flusso di scena: Il movimento 3D dei punti nello spazio, stimato a partire da dati stereo o di profondità. Il flusso ottico è la sua proiezione sul piano dell’immagine.
- Vettori di movimento dei codec video: Gli encoder H.264, HEVC e AV1 memorizzano un vettore di movimento per ogni blocco, scelto per ridurre al minimo i bit necessari a codificare il fotogramma; per questo spesso si discosta dal movimento reale.
Applicazioni nel mondo reale#
- Stabilizzazione video: Il flusso dominante in un fotogramma rivela le vibrazioni della telecamera, che il software compensa deformando ogni fotogramma nella direzione opposta.
- Interpolazione dei fotogrammi: Lo slow motion e la conversione della frequenza dei fotogrammi generano fotogrammi intermedi spostando i pixel parzialmente lungo i rispettivi vettori di flusso.
- Veicoli autonomi e droni: Il flusso supporta l’odometria visiva, mentre la velocità con cui il flusso di un oggetto si espande segnala una collisione imminente.
- Riconoscimento delle azioni: La rete a due flussi del 2014 classificava le azioni usando un flusso spaziale di singoli fotogrammi e un flusso temporale alimentato con una sequenza di 10 campi di flusso ottico consecutivi.










