Optical Flow
Optischer Fluss schätzt die Bewegung jedes Pixels zwischen zwei Videobildern als Feld von Bewegungsvektoren. Klassische und Deep-Learning-Methoden, Anwendungen und OpenCV-Code.
Optischer Fluss ist die scheinbare Bewegung von Helligkeitsmustern zwischen zwei Bildern, in der Regel aufeinanderfolgenden Videobildern. Ein Algorithmus für optischen Fluss schätzt für jedes Pixel im ersten Bild einen 2D-Verschiebungsvektor (dx, dy), der angibt, an welcher Stelle im zweiten Bild der Inhalt dieses Pixels erscheint. Das Ergebnis, das Flussfeld, erfasst Bewegungen von Objekten und der Kamera selbst. Dadurch können Computer-Vision-Systeme Videos stabilisieren, Eigenbewegungen schätzen, Bilder interpolieren und Aktionen erkennen. Der Fluss misst, was die Kamera sieht, und nicht die tatsächliche 3D-Bewegung: Eine vollkommen gleichmäßige Kugel, die sich an Ort und Stelle dreht, erzeugt keinen Fluss, während ein wandernder Schatten Fluss erzeugt, obwohl sich nichts Physisches bewegt.
So wird optischer Fluss geschätzt#
Die meisten Verfahren gehen von der Helligkeitskonstanz aus, also von der Annahme, dass ein Punkt bei seiner Bewegung dieselbe Intensität behält. Die Linearisierung ergibt eine Gleichung pro Pixel, Ix·u + Iy·v + It = 0. Dabei sind Ix, Iy und It die Ableitungen des Bildes in x-, y- und Zeitrichtung, und (u, v) ist der unbekannte Fluss. Eine Gleichung reicht nicht aus, um zwei Unbekannte zu bestimmen. Das ist das Aperturproblem: Betrachtet man eine gerade Kante durch ein kleines Fenster, lässt sich nur die Bewegung senkrecht zur Kante messen. Klassische Verfahren lösen das Problem mithilfe einer zweiten Annahme:
- Lucas-Kanade-Verfahren (1981): Das Verfahren nimmt an, dass der Fluss innerhalb eines kleinen Fensters konstant ist, und löst die Gleichungen aller Pixel darin mit der Methode der kleinsten Quadrate. Es funktioniert dort, wo das Fenster Gradienten in zwei Richtungen enthält, etwa an Ecken. Deshalb wird es üblicherweise als dünn besetzter Fluss auf ausgewählten Merkmalspunkten angewendet.
- Horn-Schunck-Verfahren (1981): Das Verfahren nimmt an, dass das Flussfeld im gesamten Bild glatt ist, und löst ein globales Optimierungsproblem. So entsteht ein dichter Fluss für jedes Pixel.
Beide Annahmen versagen bei großen Bewegungen. Praktische Verfahren schätzen den Fluss daher auf einer Bildpyramide von grob nach fein. Dort entspricht eine Bewegung von 16 Pixeln in voller Auflösung drei Ebenen tiefer einer Bewegung von 2 Pixeln:
OpenCV implementiert das Pyramidenverfahren von Lucas-Kanade für dünn besetzte Punkte und den Polynom-Expansionsalgorithmus von Gunnar Farnebäck aus dem Jahr 2003 für dichten Fluss. Dieser Code verschiebt eine zufällige Textur um einen bekannten Betrag und ermittelt die Bewegung mit dem dichten Farnebäck-Fluss:
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")Die Ausgabe lautet flow field shape: (240, 320, 2) und median motion: dx=3.00, dy=2.00 pixels: ein zweikomponentiger Vektor für jedes der 76.800 Pixel. Damit werden die horizontale Verschiebung um 3 Pixel und die vertikale Verschiebung um 2 Pixel ermittelt.
Methoden des Deep Learning#
FlowNet zeigte 2015, dass ein faltendes neuronales Netz den Fluss durchgängig aus synthetischen Trainingsdaten lernen kann, da echte Videos nur selten mit einem Referenz-Flussfeld versehen sind. PWC-Net vereinte die Pyramiden-, Warping- und Kostenvolumen-Ideen klassischer Verfahren in einem kompakten Netz. RAFT, das 2020 den Preis für die beste Arbeit auf der ECCV erhielt, vergleicht jedes Pixel des ersten Bildes mit jedem Pixel des zweiten in einem Korrelationsvolumen und verfeinert ein einzelnes hochauflösendes Flussfeld durch wiederholte rekurrente Aktualisierungen. Lernbasierte Verfahren bewältigen große Verschiebungen, Bewegungsunschärfe und strukturlose Bereiche weitaus besser als klassische Verfahren, und torchvision liefert vortrainierte RAFT-Modelle. Die Genauigkeit wird als Endpunktfehler (EPE) angegeben, also als durchschnittlicher Abstand in Pixeln zwischen vorhergesagten und tatsächlichen Flussvektoren, und anhand von Benchmarks wie MPI Sintel und KITTI 2015 bewertet.
Optischer Fluss und verwandte Begriffe#
- Objektverfolgung: Verfolgt ganze Objekte über viele Bilder hinweg anhand dauerhafter IDs. Optischer Fluss beschreibt dagegen die Bewegung einzelner Pixel zwischen zwei Bildern und kennt keine Objekte. Tracker nutzen den Fluss als Anhaltspunkt: Im Ultralytics YOLO-Track-Modus schätzen der standardmäßige TrackTrack-Tracker und BoT-SORT die Kamerabewegung mithilfe eines dünn besetzten Lucas-Kanade-Flusses (
gmc_method: sparseOptFlow). Dabei werden bis zu 400 Eckpunkte in einem Bild mit halber Auflösung verfolgt, per RANSAC Rotation, Skalierung und Verschiebung angepasst und anschließend alle vorhergesagten Track-Boxen um diese Bewegung verschoben, bevor sie neuen Erkennungen zugeordnet werden. - Punktverfolgung: Verfolgt ausgewählte Punkte durch lange Videos, auch bei Verdeckungen, statt die Bewegung jedes Pixels zwischen zwei Bildern zu schätzen.
- Szenenfluss: Die 3D-Bewegung von Punkten im Raum, geschätzt anhand von Stereo- oder Tiefendaten. Optischer Fluss ist deren Projektion auf die Bildebene.
- Bewegungsvektoren von Videocodecs: H.264-, HEVC- und AV1-Encoder speichern einen Bewegungsvektor pro Block. Dieser wird so gewählt, dass möglichst wenige Bits zur Codierung des Bildes benötigt werden, und weicht deshalb oft von der tatsächlichen Bewegung ab.
Anwendungen in der Praxis#
- Videostabilisierung: Der vorherrschende Fluss über ein Bild hinweg zeigt Kameraverwacklungen, die eine Software ausgleicht, indem sie jedes Bild in die entgegengesetzte Richtung verzerrt.
- Bildinterpolation: Bei Zeitlupe und Bildratenkonvertierung werden Zwischenbilder erzeugt, indem Pixel einen Teil der Strecke entlang ihrer Flussvektoren zurücklegen.
- Autonome Fahrzeuge und Drohnen: Der Fluss unterstützt die visuelle Odometrie. Die Geschwindigkeit, mit der sich der Fluss eines Objekts ausdehnt, warnt vor einer drohenden Kollision.
- Aktionserkennung: Das Zwei-Strom-Netzwerk aus dem Jahr 2014 klassifizierte Aktionen anhand eines räumlichen Stroms aus Einzelbildern und eines zeitlichen Stroms, dem eine Folge von 10 aufeinanderfolgenden optischen Flussfeldern zugeführt wurde.










