Wie man ein individuelles eingebettetes Stereosystem erstellt
Bauanleitung für ein eigenes 3D-Embedded-System
Dieser Artikel beschreibt zunächst die Hauptteile eines Stereo-Sichtsystems und gibt dann Anweisungen zur Herstellung einer anwenderspezifischen Stereokamera mit Hardware-Komponenten von der Stange und Open-Source-Software. Da sich diese Einrichtung darauf konzentriert, das System einzubetten, wird dabei in Echtzeit eine Tiefenkarte jeder Szene berechnet, ohne dass ein Host-Computer erforderlich ist.
Stereovision – ein Überblick
Stereovision ist die Extraktion von 3D-Informationen aus digitalen Bildern durch Vergleichen der Informationen in einer Szene aus zwei Blickwinkeln. Die relativen Positionen eines Objektes in zwei Bildebenen liefern Informationen über die Tiefe des Objektes.
Damit ein Stereovisionsystem Bilder erstellen kann, sind die folgenden Schritte notwendig:
- Kalibrierung der Kamera:
Hier wird unterschieden zwischen intrinsischer und extrinsischer Kalibrierung. Die intrinsische bestimmt die Bildmitte, Brennweite und Verzerrungsparameter, während die extrinsische Kalibrierung die Positionen der Kameras im Raum bestimmt. Dies ist ein entscheidender Schritt bei vielen Anwendungen für die Bildbearbeitung, insbesondere wenn Messdaten zu der Szene gewünscht sind, zum Beispiel die Tiefe.
- Entzerrung:
Die Stereo-Entzerrung ist die Reprojektion von Bildebenen auf eine gemeinsame Ebene parallel zur Linie zwischen den Mittelpunkten der Kameras. Nach der Korrektur liegen korrespondierende Punkte in derselben Zeile, was die Kosten und die Unklarheit des Abgleichs erheblich reduziert. Dieser Schritt wird mit dem bereitgestellten Code durchgeführt, mit dem Anwender ihr eigenes System erstellen können.
- Stereo-Abgleich:
Dabei werden die Pixel zwischen dem linken und rechten Bild abgeglichen, was Disparitätsabbildungen erzeugt. Der SGM-Algorithmus (Semi-Global Matching) wird im Code verwendet, der Anwendern zur Verfügung steht.
- Triangulation:
Hier wird die Position eines Punktes im dreidimensionalen Raum anhand seiner Projektion auf den beiden Bildern ermittelt. Auf diese Weise wird die Disparitätsabbildung in eine 3D-Punktwolke konvertiert.
Konstruktionsbeispiel „mobiler Roboter in dynamischer Umgebung“
Zur Veranschaulichung soll hier ein Konstruktionsbeispiel für ein Stereosystem herhalten. Dabei geht es um eine mobile Roboteranwendung in einer dynamischen Umgebung mit sich schnell bewegenden Objekten. Die zu erfassende Szene ist 2 m groß, der Abstand von den Kameras zur Szene beträgt 3 m und die gewünschte Genauigkeit beträgt 1 cm.
Der Tiefenfehler ist gegeben durch:
ΔZ=Z²/Bf * Δd, abhängig von folgenden Faktoren:
Z ist der Tiefenbereich
B ist der Basisabstand
f ist die Brennweite in Pixeln, die mit dem Kamerasichtfeld und der Bildauflösung zusammenhängt
Es gibt verschiedene Gestaltungsmöglichkeiten, die diese Anforderungen erfüllen können. Anhand der obigen Anforderungen an die Szenengröße und den Abstand lässt sich die Brennweite des Objektivs für einen bestimmten Sensor bestimmen. Zusammen mit dem Basisabstand lässt sich anhand der obigen Formel der erwartete Tiefenfehler bei 3 m berechnen, um zu überprüfen, ob er die Anforderung an die Genauigkeit erfüllt.
Es gibt grundsätzlich zwei Möglichkeiten, um die Anforderungen zu erfüllen: Kameras mit niedrigerer Auflösung und einem längeren Basisabstand oder Kameras mit höherer Auflösung und einem kürzeren Basisabstand. Die erste Option ist eine größere Kamera, die jedoch einen geringeren Rechenbedarf hat, die zweite Option ist eine kompaktere Kamera, jedoch mit höherem Rechenbedarf. Für diese Anwendung soll die zweite Option zum Einsatz kommen, da eine kompakte Größe für den mobilen Roboter eher wünschenswert ist, und die Quartet-Embedded-Lösung für TX2 von Teledyne Flir gut dazu passt. Sie verfügt über eine leistungsstarke GPU, die die Daten verarbeiten kann.
Embedded-Lösung: Die nötige Hardware
Bei diesem Beispiel werden zwei Blackfly-S-Platinenkameras mit 1,6 MP mit dem Sensor Sony-Pregius-IMX273 auf einer 3D-gedruckten Leiste bei einem Basisabstand von 12 cm montiert. Beide Kameras verfügen über ähnliche 6-mm-Objektive mit S-Mount. Die Kameras werden über zwei FPC-Kabel mit der anwenderspezifischen Trägerplatine Quartet-Embedded-Lösung für TX2 verbunden. Um die linke mit der rechten Kamera zu synchronisieren und die Bilder gleichzeitig aufzunehmen, wird ein Synchronisationskabel zwischen den beiden Kameras angebracht. Beide Objektive sollten so eingestellt werden, dass die Kameras auf die Entfernungen ausgerichtet sind, die für Ihre Anwendung erforderlich sind.
Embedded-Lösung: Die nötige Software
a. Spinnaker
Das Teledyne Flir Spinnaker SDK ist auf der Embedded Lösung Quartet für TX2 vorinstalliert. Das SDK muss mit den Kameras kommunizieren.
b. OpenCV 4.5.2 mit CUDA-Unterstützung
OpenCV Version 4.5.1 oder neuer ist für den Stereo-Abgleichs-Algorithmus SGM erforderlich. Die Zip-Datei lässt sich mit dem Link aus der Liste am Ende dieses Artikels heunterladen. Deren Inhalt muss in den Ordner „StereoDepth“ entpackt werden.
Das Skript zur Installation von OpenCV ist OpenCVInstaller.sh. Der folgende Befehl muss in einem Terminalfenster eingegeben werden:
cd ~/StereoDepth
chmod +x OpenCVInstaller.sh
./OpenCVInstaller.sh
Das Installationsprogramm wird dazu auffordern, das Administratorkennwort einzugeben. Das Installationsprogramm beginnt mit der Installation von OpenCV 4.5.2. Es kann einige Stunden dauern, OpenCV herunterzuladen und zu erstellen.
Die Kalibrierung der individuellen Stereovision-Embedded-Lösung
Der Code zum Erfassen und Kalibrieren von Stereobildern befindet sich im Ordner „Kalibrierung“. Die Seriennummern für die linke und rechte Kamera lässt sich mit dem Spinview GUI identifizieren. In diesem Beispiel ist die rechte Kamera der Master, die linke der Slave. Die Seriennummern der Master- und der Slave-Kamera müssen in Zeilen 60 und 61 der Datei grabStereoImages.cpp kopiert werden. Die ausführbare Datei wird mit den folgenden Befehlen erstellt:
cd ~/StereoDepth/Calibration
mkdir build
mkdir -p images/{left, right}
cd build
cmake ..
make
Danach muss das Schachbrettmuster ausgedruckt werden, das unter diesem Link zu finden ist, um es als Kalibrierungsziel zu verwenden (www.ablwerbung.de/flir4.html ). Optimale Ergebnisse während der Kalibrierung erhält der Anwender, wenn er in Spinview die automatische Belichtung auf Aus schaltet und die Belichtung so anpasst, dass das Schachbrettmuster klar sichtbar ist und die weißen Quadrate nicht zu stark belichtet werden. Nach dem Erfassen der Kalibrierungsbilder können in Spinview die Verstärkung und die Belichtung auf Automatik gestellt werden.
Die Erfassung von Bildern startet mit folgendem Befehl
./grabStereoImages
Der Code sollte beginnen, Bilder mit etwa 1 fps zu erfassen. Die linken Bilder werden im Ordner Bilder/links und die rechten Bilder im Ordner Bilder/rechts gespeichert. Das Ziel muss so bewegt werden, dass es in jeder Ecke des Bildes erscheint. Dabei kann es gedreht werden und auch der Abstand kann variiert werden. Standardmäßig erfasst das Programm 100 Bildpaare, kann jedoch mit dem folgenden Befehlszeilenargument geändert werden:
./grabStereoImages 20
So werden nur 20 Bildpaare erfasst. Zu beachten ist, dass dadurch alle Bilder überschrieben werden, die in den Ordnern gespeichert sind.
Nach dem Aufnehmen der Bilder wird der Python-Kalibrierungscode ausgeführt. Gestartet wird das mit diesem Befehl:
cd ~/StereoDepth/Calibration
python cameraCalibration.py
Damit werden zwei Dateien namens „intrinsics.yml“ und „extrinsics.yml“ erstellt, die die intrinsischen und extrinsischen Parameter des Stereosystems enthalten. Der Code nimmt standardmäßig eine Größe der Schachbrettquadrate von 30 mm an. Dies kann jedoch gegebenenfalls geändert werden. Am Ende der Kalibrierung wird der RMS-Fehler angezeigt, der angibt, wie gut die Kalibrierung ist. Der RMS-Fehler sollte für eine gute Kalibrierung typischerweise unter 0,5 Pixel liegen.
Erstellen einer Echtzeit-Tiefenkarte
Der Code zur Berechnung der Ungleichheit in Echtzeit befindet sich im Ordner „Depth“. Die Seriennummern der Kameras müssen in die Zeilen 230 und 231 der Datei live_disparity.cpp kopiert werden. Die ausführbare Datei wird mit den folgenden Befehlen in einem Terminal erstellt:
cd ~/StereoDepth/Depth
mkdir build
cd build
cmake ..
make
Die im Kalibrierungsschritt erhaltenen Dateien „intrinsics.yml“ und „extrinsics.yml“ werden in diesen Ordner kopiert. Die Echtzeit-Demo der Tiefenkarte startet mit
./live_disparity
Dann werden das linke Kamerabild (rohes, nicht korrigiertes Bild) und die Tiefenkarte (die endgültige Ausgabe) angezeigt. Der Abstand zur Kamera ist entsprechend der Legende rechts auf der Tiefenkarte farbcodiert. Der schwarze Bereich auf der Tiefenkarte bedeutet, dass in diesem Bereich keine Disparitätsdaten gefunden wurden. Mit dem Grafikprozessor Nvidia Jetson TX2 können bis zu 5 fps mit einer Auflösung von 1.440 × 1.080 und bis zu 13 fps mit einer Auflösung von 720 × 540 ausgeführt werden.
Um die Tiefe an einem bestimmten Punkt auf der Tiefenkarte zu sehen, klickt der Anwender auf diesen.
Zusammenfassung
Stereovision für die Tiefenwahrnehmung hat die Vorteile, dass dies gut im Freien funktioniert und eine hochauflösende Tiefenkarte erstellt werden kann – und dies mit kostengünstigen Komponenten von der Stange. Je nach den Anforderungen gibt es eine Reihe von handelsüblichen Stereosystemen auf dem Markt. Sollte sich dort keines finden lassen, lässt sich mithilfe dieser Anleitung ein individuelles Embedded-Stereovision-System relativ einfach entwickeln.
Autor
Dr. Stephen Se
Senior Research Manager
Links zu den Komponenten eines individuellen Embedded-Stereovision-System
Hardware
- Quartet Embedded Solution für TX2:
https://www.flir.com/products/quartetembedded-solution-for-tx2/
- Blackfly S-Platinenkameras mit 1,6 MP:
https://www.flir.com/products/blackflys-board-level/
- 6-mm-Objektive mit S-Mount:
https://www.flir.com/products/s_mount-front/
Software
- Teledyne FLIR Spinnaker SDK:
https://www.flir.com/products/spinnaker-sdk/
- OpenCV Version 4.5.1:
https://flir.app.box.com/s/h4soinqjchdqson2gm1piyf745idw7zb