Optical Flow
O fluxo ótico estima como cada píxel se move entre dois fotogramas de vídeo, representando-o como um campo de vetores de movimento. Métodos clássicos e profundos, aplicações e código OpenCV.
O fluxo óptico é o movimento aparente dos padrões de brilho entre duas imagens, geralmente quadros de vídeo consecutivos. Um algoritmo de fluxo óptico estima, para cada pixel do primeiro quadro, um vetor de deslocamento 2D (dx, dy) que aponta para onde o conteúdo desse pixel aparece no segundo quadro. O resultado, chamado campo de fluxo, captura o movimento de objetos e da própria câmera, permitindo que sistemas de visão computacional estabilizem vídeos, estimem o movimento próprio, interpolam quadros e reconheçam ações. O fluxo mede o que a câmera vê, não o movimento 3D real: uma esfera perfeitamente uniforme girando no mesmo lugar não produz fluxo, e uma sombra em movimento produz fluxo onde nada se move fisicamente.
Como o fluxo óptico é estimado#
A maioria dos métodos parte da constância do brilho, a suposição de que um ponto mantém a mesma intensidade enquanto se move. Linearizá-la produz uma equação por pixel, Ix·u + Iy·v + It = 0, em que Ix, Iy e It são as derivadas da imagem em x, y e no tempo, e (u, v) é o fluxo desconhecido. Uma equação não pode determinar duas incógnitas, o que constitui o problema da abertura: ao observar uma borda reta por uma pequena janela, só é possível medir o movimento perpendicular à borda. Os métodos clássicos acrescentam uma segunda suposição para resolver o problema:
- Método de Lucas-Kanade (1981): Supõe que o fluxo é constante dentro de uma pequena janela e resolve as equações de todos os pixels dessa janela por mínimos quadrados. Funciona quando a janela contém gradientes em duas direções, como nos cantos, por isso geralmente é executado como fluxo esparso em pontos de características selecionados.
- Método de Horn-Schunck (1981): Supõe que o campo de fluxo é suave por toda a imagem e resolve uma otimização global, produzindo fluxo denso para cada pixel.
As duas suposições falham diante de grandes movimentos, por isso os métodos práticos estimam o fluxo de forma grosseira a fina em uma pirâmide de imagens, na qual um movimento de 16 pixels na resolução total corresponde a um movimento de 2 pixels três níveis abaixo:
A OpenCV implementa Lucas-Kanade piramidal para pontos esparsos e o algoritmo de expansão polinomial de Gunnar Farnebäck, de 2003, para fluxo denso. Este código desloca uma textura aleatória por uma quantidade conhecida e recupera o movimento com o fluxo denso de 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")Ele imprime flow field shape: (240, 320, 2) e median motion: dx=3.00, dy=2.00 pixels: um vetor de dois componentes para cada um dos 76.800 pixels, recuperando o deslocamento horizontal de 3 pixels e vertical de 2 pixels.
Métodos de aprendizado profundo#
O FlowNet demonstrou em 2015 que uma rede neural convolucional podia aprender o fluxo de ponta a ponta a partir de dados de treinamento sintéticos, já que vídeos reais raramente vêm acompanhados de fluxo de referência. O PWC-Net incorporou em uma rede compacta as ideias clássicas de pirâmide, deformação e volume de custos. O RAFT, que ganhou o prêmio de melhor artigo da ECCV 2020, compara cada pixel do primeiro quadro com cada pixel do segundo em um volume de correlação e refina um único campo de fluxo de alta resolução com atualizações recorrentes repetidas. Os métodos aprendidos lidam muito melhor do que os métodos clássicos com grandes deslocamentos, desfoque de movimento e regiões sem textura, e a torchvision inclui modelos RAFT pré-treinados. A precisão é informada como erro de ponto final (EPE), a distância média em pixels entre os vetores de fluxo previstos e reais, em benchmarks como MPI Sintel e KITTI 2015.
Fluxo óptico e termos relacionados#
- Rastreamento de objetos: Acompanha objetos inteiros com IDs persistentes ao longo de muitos quadros, enquanto o fluxo óptico descreve o movimento por pixel entre dois quadros e não reconhece objetos. Os rastreadores usam o fluxo como pista: no modo track do Ultralytics YOLO, o rastreador padrão TrackTrack e o BoT-SORT estimam o movimento da câmera com fluxo esparso de Lucas-Kanade (
gmc_method: sparseOptFlow), rastreando até 400 cantos em um quadro com metade da resolução, ajustando uma rotação, escala e translação a eles com RANSAC e deslocando cada caixa de rastreamento prevista de acordo com esse movimento antes de associá-la a novas detecções. - Rastreamento de pontos: Acompanha pontos escolhidos ao longo de vídeos extensos, inclusive durante oclusões, em vez de estimar o movimento de cada pixel entre dois quadros.
- Fluxo de cena: O movimento 3D de pontos no espaço, estimado a partir de dados estéreo ou de profundidade. O fluxo óptico é sua projeção no plano da imagem.
- Vetores de movimento de codecs de vídeo: Os codificadores H.264, HEVC e AV1 armazenam um vetor de movimento por bloco, escolhido para minimizar a quantidade de bits necessária para codificar o quadro, por isso ele muitas vezes difere do movimento real.
Aplicações no mundo real#
- Estabilização de vídeo: O fluxo dominante em um quadro revela a trepidação da câmera, que o software compensa deformando cada quadro na direção oposta.
- Interpolação de quadros: A câmera lenta e a conversão da taxa de quadros sintetizam quadros intermediários deslocando os pixels parcialmente ao longo de seus vetores de fluxo.
- Veículos autônomos e drones: O fluxo auxilia a odometria visual, e a taxa de expansão do fluxo de um objeto alerta para uma colisão iminente.
- Reconhecimento de ações: A rede de dois fluxos de 2014 classificava ações usando um fluxo espacial de quadros individuais e um fluxo temporal alimentado com uma pilha de 10 campos de fluxo óptico consecutivos.










