Dokumentation
libMPTStereo

Einleitung

Die Bibliothek libMPTStereo stellt alle notwendigen Funktionen für die Berechnung von 3D-Punkten aus Stereobildpaaren zur Verfügung. Die Berechnung der 3D-Punkte erfolgt auf Basis der Epipolargeometrie. Dazu werden diejenigen Punkte im linken Bild ausgewählt, deren 3D-Position bestimmt werden soll. Danach wird für jeden dieser Punkte, die folgende Routine durchlaufen:

  1. Berechnen der Epipolarlinie im rechten Bild (Bereich auf dem der Punkt im linken Bild auf das rechte Bild abgebildet werden kann)
  2. Suche des korrespondierenden Punktes im rechten Bild entlang der Epipolarlinie.
  3. Berechnung des 3D-Punktes als Schnittpunkt der beiden Geraden durch die beiden korrespondierenden Punkte.

Zur Reduzierung der Rechenzeit werden die Berechnungen auf Basis der Epipolargeometrie ausschließlich auf rektifizierten Bildern durchgeführt. Das bedeutet. dass alle Epipolarlinien horizontale Geraden sind. Die Bibliothek stellt Funktionen für folgende Aufgaben zur Verfügung:

Die Anwendungsmöglichkeiten der Bibliothek libMPTStereo werden in den Abschnitten Beispiele und Anwendung genauer beschrieben.

Module

Die Bibliothek besteht aus folgenden Modulen:

Beispiele

Es werden einige Beispiele mitgeliefert, die einen guten Ausgangspunkt zum Schreiben eigener Anwendungen bieten:

MeasureRuler

Das erste Beispiel befindet sich im Unterordner examples/MeasureRuler und demonstriert das metrische Messen im dreidimensionalen Raum Es ist eine in C geschriebene Konsolenanwendung.

Mit einem Stereo-Messsystem, dessen Kalibrierung mit den Fraunhofer IFF Camera-Tools erstellt wurde, ist ein Bildpaar von einem Lineal aufgenommen worden. Ziel ist es die Abstände auf dem Lineal zu messen (es sollten natürlich die abgelesen Werte berechnet werden).

Es wurden manuell die Pixel-Koordinaten von der 15, 20, 25 und 30 cm Marke im linken Bild ermittelt. Dies geschah mit einem Bildbetrachter, der auf Mausklick die Bildkoordinate anzeigte.

example-1.png
Linke Aufnahme des Lineals. Die mit der Maus markierten Messpunkte sind rot markiert.

In dem Beispiel werden folgende Schritte demonstriert:

  1. Einlesen von Bildern.
  2. Einlesen von Kamerakalibrierungen.
  3. Entzerren und Rektifizieren von Bildern.
  4. Entzerren und Rektifizieren von Soll-Koordinaten.
  5. Berechnen von Epipolarlinen für Soll-Koordinaten.
  6. Berechnung von korrespondierenden Pixeln.
  7. Vorwärtsschnitt zu dreidimensionalen Welt-Koordinaten.

Am Ende werden die Abstände der berechneten 3D-Punkte ausgegeben. Mit dem Testdatensatz wird eine maximale Abweichung von 5/100 mm erreicht, was in etwa der Auflösung der Kameras entspricht.

Der Ablauf der Berechnung entspricht dem Schema in Klassische Anwendung der Bibliothek libMPTStereo.

ReconstructStereo

Das zweite Beispiel befindet sich im Unterordner examples/ReconstructStereo und demonstriert eine großflächige Stereo-Rekonstruktion, d.h. 3D-Punktewolkenerstellung, von einer getragenen Brille. Hierbei handelt es sich um eine fortgeschrittene C++-Konsolenanwendung, die eine XYZ-Koordinatendatei erstellt.

Als Ausgangsdaten stehen eine Stereo-Messsystem-Kalibrierung und ein Beispiel-Bildpaar zur Verfügung. Auf dem Bildpaar trägt ein Proband eine schwarze Brille, die vollständig in eine metrische 3D-Punktewolke umgewandelt werden soll. Zusätzlich soll auch die Position des Augapfels rekonstruiert werden. Dazu wurde bereits im Vorfeld manuell eine Binärmaske von Brille und Pupille erstellt, in der die zu rekonstruierenden Pixel weiß dargestellt sind. Das Beispielprogramm liest die Maske ein, sucht zu allen weißen Pixeln die korrespondierenden Punkte und berechnet für alle gefundenen Stereo-Bildpaare die 3D-Koordinaten.

In dem Beispiel werden folgende Schritte demonstriert:

  1. Einlesen von Bildern und Kamerakalibrierungen
  2. Elementares Arbeiten auf Bildern (Extraktion der weißen Pixel und Umrechnung in Koordinaten
  3. Erstellung eines Rektifizier-Objekts
  4. Entzerrung und Rektifizierung der Eingabebilder
  5. Entzerrung und Rektifizierung der Soll-Koordinaten
  6. Berechnung der Stereo-Korrespondenzen und Vorwärtsschnitt zu 3D-Weltkoordinaten
  7. Rechts-Links-Test zur Validierung der Ergebnisse und Filterung von schlechten Ergebnissen
  8. Schreiben in XYZ-Ausgabedateien

Mit dem Beispieldatensatz wird eine Punktewolke von etwa 40.000 Punkten erstellt. Die Position des Augapfels und die Kontur des Brillenrahmens sind sehr gut zu erkennen.

example-2a.png
Rekonstruierte Punktewolke aus der Beispielapplikation
example-2b.png
Beispiel für einen messbaren Abstand in der Punktewolke

Der Ablauf der Berechnung entspricht dem Schema in Klassische Anwendung der Bibliothek libMPTStereo.

Definition der Koordinatensysteme

Die Koordinatensysteme der Kameras sind wie folgt definiert. Der Koordinatenursprung liegt im Mittelpunkt der Chipebene der linken Kamera. Die Z-Achse steht senkrecht auf der Chipebene und ist in Richtung der Kamera orientiert. Die X-Achse ist horizontal und in Richtung der rechten Kamera orientiert. Die Y-Achse ist vertikal.

Rektifizierung

Zur Beschleunigung der Korrespondenzsuche wird in der libMPTStereo grundsätzlich auf rektifizierten Bildern gearbeitet. Unter rektifizierten Bildern versteht man transformierte Kameraaufnahmen, die entstehen würden, wenn die Stereo-Kameras kollinear zu einander ausgerichtet werden. Dann sind die Epipolarlinien exakt horizontal zu einander.

Rektifizierte Bilder erhält kann man bei bekannten intrinsischen und extrinsischen Kameraparametern über eine Homographie-Transformation $R_{left}$ für die linke Kamera und $R_{right}$ für die rechte Kamera. Mit der Homographie lassen sich ideale Pixel $\hat{p}$ in rektifizierte Pixel $\dot{p}$ überführen (homogene Multiplikation):

\[ R * \hat{p} = \dot{p} \]

bzw. mit der Inversen Matrix gelangt man von rektifizierten in ideale Pixelkoordinaten:

\[ R^{-1} * \dot{p} = \hat{p} \]

Die Stereo-Korrespondenzsuche lässt sich dadurch beschleunigen, dass zu einem gegebenen Pixel im linken Bild nur ganze Pixel im rechten Bild abgetastet werden, wodurch Interpolationen auf Nachbarpixeln eingespart werden. Zur Verdeutlichung der Koordinatentransformation werden alle Schritte von einem verzerrten linken Kamerapixel ausgehend aufgeführt (für Pixel in der rechten Kamera ist die Vorgehensweise analog):

  1. Entzerrung der verzerrten Pixelkoordinate in eine ideale Pixelkoordinate: $ \hat{p}_L = F(C_L, \tilde{p}_L)$
  2. Transformation in eine rektifizierte Koordinate: $\dot{p}_L = R_L * \hat{p}_L$
  3. Rundung in ganze Koordinaten: $\dot{p}_L' = \begin{bmatrix} \lfloor\dot{x}_L + 0.5\rfloor \\ \lfloor\dot{y}_L + 0.5\rfloor \end{bmatrix}$
  4. Berechnung der zugehörigen Pixel auf der Epipolarlinie (s. calcEpiLine()): $\dot{P}'_{R, i}, i=1 \ldots n$
  5. Berechnung des Pixels auf der Epipolarlinie mit der größtmöglichen Übereinstimmung (s. calculateMatching()): $\dot{p}_R$. Man beachte, dass $\dot{p}_R$ eine ganzzahlige y-Komponente jedoch aufgrund der Subpixelinterpolation des Korrelationsergebnisses i.A. eine reelle x-Komponente besitzt.
  6. Vorwärtsschnitt der Kamerastrahlen durch die rektifizierten Pixel im linken und im rechten Kamerabild (s. resectForwardRektifier(), resectForwardRect(): $P_{3D} = F(C_L, \dot{p}_L, C_R, \dot{p}_R$.

Es ist zu berücksichtigen, dass es somit nicht exakt möglich ist zu einem gegebenen Pixel im (verzerrten) Kamerabild die 3D-Rekonstruktion durchzuführen, da die Koordinate gerundet werden muss. Dies hat natürlich keine Auswirkung auf die Genauigkeit des Ergebnisses.

Die Rektifizierung von Koordinaten und Bildern kann mit Einzelfunktionen aus dem Modul Funktionen zur Rektifizierung von Stereo-Aufnahmen durchgeführt werden. Für die wiederholte Anwendung ist die Anwendung eines Rektifiziererobjekts (s. Funktionen zur Rektifizierung von Stereo-Aufnahmen mittels einer Lookup-Tabelle.) empfehlenswert.

Multithreading

Thread-Sicherheit der Funktionen

Alle Funktionen sind thread-sicher. D.h. sie können gleichzeitig aus mehreren Threads vom Anwender aufgerufen werden.

Die Handles zu erzeugten Objekten sind sicher innerhalb eines Threads. Dies bedeutet, dass in unterschiedlichen Threads mehrere Handles erzeugt werden können, diese dann aber nur in jeweils einem Thread verwendet werden dürfen.

Parallelisierung der Algorithmen

Funktionen, die größere Datenmengen verarbeiten, nutzen mehrere CPU-Kerne gleichzeitig aus. Dabei ist die tatsächliche CPU-Anzahl nicht relevant, da die Last gleichmäßig auf alle vorhandenen Kerne verteilt wird.

Anwendung

In diesem Abschnitt werden die beiden Arten der Anwendung der Bibliothek libMPTStereo für die Berechnung von 3D-Punkten aus Stereobildpaaren mit Hilfe von Graphen beschrieben. Die Graphen enthalten nur das Mindestmaß an benötigten Funktionen. Es gibt noch weitere, für Stereo Berechnungen nützliche, Funktionen. Die Übersicht über alle Funktionen liefert der Abschnitt Module. Bei der Verbindung der Datenstrukturen mit den Funktionen werden zur Vereinfachung der Graphen nur die wichtigsten Datenstrukturen eingezeichnet.

Legende

Die Knoten der Graphen haben folgende Bedeutung:

  1. Die normalen Funktionen enthalten elementare Funktionalitäten der Bibliothek.
  2. Die austauschbaren Funktionen enthalten Funktionalitäten, die im Rahmen möglicher Weiterentwicklungen durch andere Funktionen ersetzt werden können.
  3. Die Datenstrukturen enthalten die benötigten Daten.
dot_inline_dotgraph_1.png

Klassische Anwendung der Bibliothek libMPTStereo

Die klassische Anwendung der Bibliothek verwendet die Rektifizierungsmatrizen der Kameras und berechnet die Transformation bei der Rektifizierung und der Entzerrung eines Bildes für jeden Pixel neu. Dazu werden die Funktionen aus dem Modul Ver-/Entzerrungsfunktionen mit Rektifizierung verwendet. Diese Variante wird von den beiden Beispielen MeasureRuler und ReconstructStereo genutzt. Die klassische Anwendung der Bibliothek libMPTStereo ist sehr flexibel und einfach zu handhaben.

dot_inline_dotgraph_2.png

Anwendung der Bibliothek libMPTStereo mittels einer Lookup-Tabelle

Die Anwendung der Bibliothek libMPTStereo mittels einer Lookup-Tabelle ermöglicht die schnelle Rektifizierung und Entzerrung von Bildern mit der selben Kalibrierung, da die Transformationen nur einmal berechnet werden müssen. Dazu werden die Funktionen aus dem Modul Funktionen zur Rektifizierung von Stereo-Aufnahmen mittels einer Lookup-Tabelle. verwendet. Diese Variante wird von der Applikation optoInspect2D_stereoView genutzt und eignet sich besonders für Applikationen mit gleichbleibender Kameraanordnung (bzw. Kalibrierung), da sich hier der Geschwindigkeitsvorteil durch die LUT sehr gut ausnutzen lässt.

Der Rektifizierer berechnet die Transformationen für die Rektifizierung und die Entzerrung für die Bilder der linken und der rechten Kamera einer Kalibrierung und speichert sie für jeden Pixel in einer Lookup-Tabelle. Dadurch ist es möglich viele Rektifizierungen und Entzerrungen in kurzer Zeit durchzuführen. Da der Rektifizierer auch die Kamerakalibrierung speichert, kann er für die Berechnung der 3D-Punkte aus Paaren von korrespondierenden Punkten in den rektifizierten und entzerrten Bildern verwendet werden. Um diese Daten speichern zu können, muss ein Rektifiziererobjekt angelegt werden. Jeder Rektifiziererfunktion muss ein Handle auf dieses Objekt übergeben werden. Wird der Rektifizierer nicht mehr benötigt, sollte er gelöscht werden, um den Speicher der LUT wieder freizugeben. Dies geschieht üblicherweise erst beim Beenden der Applikation, welche die libMPTStereo verwendet.

dot_inline_dotgraph_3.png


Copyright © 2012 Fraunhofer IFF
Version 1.0