Epipolar Geometry
Epipolargeometrie beschreibt die Beziehung zwischen zwei Ansichten einer Szene: Sie beschränkt die Zuordnung jedes Punkts auf eine Linie im anderen Bild und bildet so die Grundlage für Stereotiefenmessung und 3D-Kartierung.
In der Computer Vision beschreibt die Epipolargeometrie die geometrische Beziehung zwischen zwei Kameraansichten derselben Szene. Ein Pixel in einem Bild entspricht einem Strahl möglicher 3D-Punkte. Dieser Strahl wird in das zweite Bild als Gerade projiziert – die Epipolarlinie, auf der das passende Pixel liegen muss. Die Bedingung hängt nur von den internen Parametern und der relativen Pose der Kameras ab, nicht von der Struktur der Szene. Dadurch beschränkt sich die Suche nach einer Übereinstimmung auf eine Linie statt auf das ganze Bild. Die Epipolargeometrie bildet damit die Grundlage für Stereo Vision, Structure from Motion und visuelles SLAM, das Roboter und Headsets steuert. Multiple View Geometry in Computer Vision von Richard Hartley und Andrew Zisserman ist das maßgebliche Standardwerk.
Epipole, Epipolarlinien und die Epipolarebene#
Die beiden Kamerazentren und ein beliebiger Szenenpunkt bilden eine Ebene: die Epipolarebene. Die Verbindungslinie der Kamerazentren ist die Basislinie. Sie durchstößt jede Bildebene am Epipol, dem Bild des jeweils anderen Kamerazentrums, der außerhalb des Bildausschnitts oder im Unendlichen liegen kann. Jede Epipolarebene schneidet jedes Bild in einer Epipolarlinie, auch Epilinie genannt. Daher verlaufen alle Epipolarlinien eines Bildes durch seinen Epipol. Bewegt sich der Szenenpunkt entlang des Sichtstrahls der ersten Kamera, verschiebt sich seine Projektion im zweiten Bild entlang der Epipolarlinie.
Fundamental- und Essentialmatrizen#
Die Fundamentalmatrize F ist eine 3 × 3-Matrix vom Rang zwei und beschreibt die gesamte Beziehung in Pixelkoordinaten. Für korrespondierende Punkte x und x′ in homogenen Koordinaten (x, y, 1) lautet die Epipolarbedingung x′ᵀ F x = 0. Das Produkt F x ergibt die Koeffizienten der Epipolarlinie von x im zweiten Bild. Werden die Kameras durch Kamerakalibrierung kalibriert, drückt die Essentialmatrix E = K′ᵀ F K dieselbe Bedingung in normierten Koordinaten aus und lässt sich in die relative Rotation R und Translation t zerlegen: E = [t]ₓ R. Christopher Longuet-Higgins führte die Essentialmatrix und den Acht-Punkte-Algorithmus 1981 ein. Olivier Faugeras, Quang-Tuan Luong und Richard Hartley entwickelten Anfang der 1990er-Jahre die unkalibrierte Fundamentalmatrize weiter. Da E nur die Richtung von t festlegt, ergibt sich die Szenenform aus zwei Ansichten allein nur bis auf einen unbekannten Maßstab. Eine bekannte Basislinie oder Objektgröße legt den Maßstab fest.
Beide Matrizen werden anhand übereinstimmender Keypoints geschätzt, etwa anhand von SIFT-Merkmalen. Zum Einsatz kommt ein robuster Schätzer wie RANSAC, der die Matrix wiederholt an einer minimalen Stichprobe von Übereinstimmungen anpasst und das Modell auswählt, dem die meisten Übereinstimmungen entsprechen. Dieses Beispiel erzeugt zwei Ansichten mit 100 Punkten, ersetzt 20 Übereinstimmungen durch zufällige falsche Zuordnungen und schätzt F mit der MAGSAC-Variante von RANSAC aus OpenCV:
import cv2
import numpy as np
rng = np.random.default_rng(0)
K = np.array([[800.0, 0, 320], [0, 800.0, 240], [0, 0, 1]]) # intrinsics shared by both cameras
# 100 scene points seen by two cameras; the second sits 0.5 m to the right, turned 5 degrees
points = rng.uniform([-2, -1, 4], [2, 1, 8], (100, 3))
rvec = np.array([0.0, np.radians(5), 0.0])
tvec = -cv2.Rodrigues(rvec)[0] @ np.array([0.5, 0.0, 0.0])
x1 = cv2.projectPoints(points, np.zeros(3), np.zeros(3), K, None)[0].reshape(-1, 2) + rng.normal(0, 0.5, (100, 2))
x2 = cv2.projectPoints(points, rvec, tvec, K, None)[0].reshape(-1, 2) + rng.normal(0, 0.5, (100, 2))
x2[:20] = rng.uniform([0, 0], [640, 480], (20, 2)) # replace 20 matches with wrong ones
# Robust estimation keeps the matches that agree with a single fundamental matrix
F, inliers = cv2.findFundamentalMat(x1, x2, cv2.USAC_MAGSAC, 1.0)
kept = inliers.ravel() == 1
print(f"Kept {kept[20:].sum()} of 80 true matches and {kept[:20].sum()} of 20 wrong ones")
# Each point in image 1 defines a line a*x + b*y + c = 0 in image 2 that its match must lie on
lines = cv2.computeCorrespondEpilines(x1, 1, F).reshape(-1, 3)
dist = np.abs((lines[:, :2] * x2).sum(axis=1) + lines[:, 2])
print(f"Median distance to epipolar line: {np.median(dist[20:]):.2f} px (true), {np.median(dist[:20]):.0f} px (wrong)")
print(f"Wrong match that survived: {dist[:20][kept[:20]].round(2)} px from its line")Der Algorithmus behält 75 der 80 echten Übereinstimmungen bei und verwirft 19 der 20 falschen. Echte Übereinstimmungen liegen aufgrund des Halb-Pixel-Rauschens im Median 0,43 Pixel von ihren Epipolarlinien entfernt, falsche dagegen 144 Pixel. Die eine falsche Übereinstimmung, die bestehen bleibt, liegt zufällig 0,61 Pixel von ihrer Linie entfernt. Da die Bedingung eine Übereinstimmung auf eine Linie beschränkt, kann nur das Erscheinungsbild den richtigen Punkt entlang der Linie bestimmen.
Bei einer reinen Rotation gibt es keine Basislinie, und eine einzelne Ebene passt gleichermaßen zu vielen Fundamentalmatrizen. In beiden Fällen kommt daher eine Homographie zum Einsatz: die 3 × 3-Abbildung zwischen Ansichten einer Ebene. ORB-SLAM initialisiert seine Karte, indem es parallel eine Homographie und eine Fundamentalmatrize anpasst und diejenige auswählt, die die Übereinstimmungen besser erklärt.
Rektifizierung, Disparität und Tiefe#
Bei der Rektifizierung wird ein Stereobildpaar so verzerrt, dass seine Epipolarlinien horizontal und ausgerichtet verlaufen. So liegt jede Übereinstimmung auf derselben Bildzeile. Stereo-Matcher durchsuchen anschließend jede Zeile. Der Spaltenabstand zwischen Übereinstimmungen, die Disparität d, ergibt die Tiefe Z = f × B / d für die Brennweite f und die Basislinie B. So erstellen Stereosysteme Karten zur Tiefenschätzung. Der KITTI-Stereo-Benchmark bewertet solche Matcher anhand rektifizierter Szenen aus dem autonomen Fahren.
Anwendungen jenseits von Stereo Vision#
Bei der 3D-Rekonstruktion überprüft COLMAP jedes Bildpaar, indem es Fundamental-, Essential- oder Homographiematrizen anpasst. Paare und Übereinstimmungen ohne ausreichende geometrische Unterstützung werden verworfen. Bildabgleich-Pipelines nutzen dieselbe Prüfung, um falsche Zuordnungen zu verwerfen. Die Bildregistrierung nutzt den oben beschriebenen Homographie-Zweig, wenn die Szene flach ist oder sich die Kamera nur dreht, etwa beim Zusammenfügen von Panoramen. Zwischen zwei Bildern einer bewegten Kamera gilt die Epipolarbedingung nur für statische Oberflächen. Optischer Fluss-Vektoren, die dagegen verstoßen, weisen daher auf unabhängig bewegte Objekte hin. Bei der Mehrkameraaufnahme der menschlichen Pose wird dieselbe Person über verschiedene Ansichten hinweg anhand der Nähe ihrer Gelenkpunkte zu den jeweiligen Epipolarlinien zugeordnet, bevor ein 3D-Skelett trianguliert wird. Ein Ultralytics-YOLO26-Posenschätzungsmodell liefert in jeder Ansicht 17 COCO-Körper-Keypoints pro Person.










