Stereo Kamera Kalibrierung mit OpenCV auf dem Raspberry Pi

Stereo Vision wird vielen Leuten kein umgänglicher Begriff sein, daher will ich erst einmal erklären, was es damit auf sich hat. Mit Hilfe unserer Augen können wir Abstände schätzen, unser Gehirn kennt den Abstand unserer Augen und vergleicht die erkannten Bilder, woraus abgeschätzt werden kann, ob ein Objekt nah oder fern ist, denn nahe Objekte verschieben sich (in beiden Bildern) mehr als weit entfernte Objekte. Dieses Prinzip lässt sich auch mit Algorithmen nachstellen; alles was man dazu braucht sind 2 Kameras und einen Raspberry Pi.

Um z.B. Tiefen anhand Stereo Kameras zu schätzen, müssen zu erst die sog. „Intrinsic“ und „Extrinsic“ Parameter der Kameras bestimmt werden, was man Kalibrierung nennt. Dazu bietet OpenCV alle nötigen Funktionen, welche in diesem Tutorial gezeigt werden. Im anschließenden Teil werden wir dann mit Hilfe dieser Kameras Tiefen berechnen.

 

Zubehör

Alles was für Stereo Vision nötig ist, ist folgendes:

Es müssen nicht unbedingt zwei identische Kameras sein, allerdings empfiehlt sich das sehr. Sollten die Kameras eine unterschiedliche Auflösung haben, müssten die Bilder runter skaliert werden, worauf ich aber in diesem Tutorial nicht näher eingehe.

 

Vorkenntnisse

Zuallererst kann ich nur wärmstens empfehlen sich ein wenig in Stereo Vision einzulesen, falls man komplett neu einsteigt. Zwei nützliche Links dazu sind folgende:

 

Außerdem wirst du gleich ein Schachbrettmuster zum Kalibrieren benötigen. Ich habe eines als PDF hoch geladen, welches du ausdrucken und auf einen Karton/gerade Fläche kleben kannst. Die Größe der Felder ist dabei genau 2.5cm. Die PDF mit Checkerboard (Schachbrett) gibt es hier.

 

 

OpenCV installieren und testen

Bevor es losgehen kann, muss OpenCV erst einmal installiert werden. Die Installation kann (abhängig von deinem Raspberry Pi Model) etwas länger dauern.  Eine ausführliche Anleitung zum Installieren von OpenCV3, welches auch in diesem und den kommenden Tutorials verwendet wird, gibt es hier:

OpenCV auf dem Raspberry Pi installieren

 

Kameras verbinden und Bilder aufnehmen

Die beiden Kameras werden ganz normal per USB an das Raspberry angeschlossen und sollten direkt erkannt werden (du kannst es mittels lsusb prüfen). Anschließend erstellen wir ein Verzeichnis und darin unsere Skripte.

mkdir stereoCamera && cd stereoCamera
mkdir images
sudo nano captureImages.py

Dieses Skript zum Aufnehmen der Stereo-Bilder bekommt folgenden Inhalt (STRG+O und STRG+X zum speichern und beenden):

Anschließend können wir die beiden Geräte IDs (ls /dev/video*, z.B. 0 für „/dev/video0“ ) dem Skript übergeben und es erstellt uns die Anzahl der Bilder. Achte darauf, dass als erstes die linke und danach die Rechte Kamera übergeben wird. Die zusätzlichen Parameter für den Ausgabepfad, die Anzahl der Bilder und die Zeit zwischen den Aufnahmen ist optimal (ansonsten werden die im Skript definierten Werte genommen).
Dabei muss noch gesagt werden, dass unterschiedliche Kameras verschieden lange brauchen um ein Bild aufzunehmen. Da beide Bilder hintereinander aufgenommen werden (minimal verzögert), solltest du das Schachbrettmuster still halten.

sudo python captureImages.py 0 1 "images/"

Nach einigen Sekunden werden mit beiden Kameras Bilder aufgenommen. Halte das ausgedruckte Checkerboard in jedem Bild in einer etwas anderen Lage. Ich empfehle zwischen 15 (voreingestellt) und 20 Bildern, da manchmal ein paar Frames fehlerhaft sind. Diese sollten im Nachhinein gelöscht werden (inkl. dem entsprechenden Frame der linken/rechten Kamera).

 

Ein Hinweis: Falls du einen Fehler wie „VIDIOC_STREAMON: Broken pipe“ angezeigt bekommst, liegt das höchstwahrscheinlich daran, dass deine Kamera USB1.1 verwendet. Vereinzelt findet man Hinweise, dass das resetten der USB Verbindung nach jedem Bild helfen würde, was ich aber nicht bestätigen kann. Ich habe dazu bisher keine Lösung gefunden, daher würde ich dringend min. USB2.0 Kameras empfehlen.

 

 

Kalibrierung

Sind alle Bilder gemacht, können wir die Kameras einzeln und zusammen kalibrieren. Dazu verwenden wir die eben gemachten Bilder und ermitteln Intrinsics und Extrinsics. Ich habe dazu ein Skript erstellt, welches du am besten kopieren solltest:

sudo nano stereoCalibrate.py

Der Inhalt ist folgender:

 

Anschließend können wir die Kalibrierung starten. Dazu geben wir noch einen Datei-Namen an, unter dem die Kamera Matrizen gespeichert werden, damit wir sie später einfach laden können, ohne die Kalibrierung erneut durchführen zu müssen:

sudo python stereoCalibrate.py --square_size=2.5 --save "camera_matrices.json" "images/left*.jpg" "images/right*.jpg"

Hat alles geklappt, solltest du alle Matrizen in der Kommandozeile angezeigt bekommen und in einer JSON Datei gespeichert haben.

 

Test

Um nun noch zu evaluieren, ob die Matrizen auch richtig sind, wenden wir sie auf die Bilder an. Dabei zeige ich folgend kurz die Anwendung:

sudo nano test_remap.py

sudo python test_remap.py

Achja, falls du es über SSH ausführst und kein Bild angezeigt bekommst, solltest du X11 (Linux) bzw. Xming (Windows) aktivieren. Ansonsten würde ein Zugriff per Remote auch funktionieren. Die auskommentierte, vorletzte Zeile ist als Alternative bzw. wenn du das Bild speichern willst.

Um die rechten Bilder zu remappen, musst du natürlich alle Matrizen für die rechte Kamera nehmen. Um ein Beispiel zu geben, habe ich „right03.jpg“ (Titel-Bild) mit entsprechenden Matrizen rektifiziert, was folgendermaßen aussieht:

right03_remap

Aufgenommenes Bild nach Rektifizierung (cv2.remap).

Ich verwende ähnlichen Code zur Umrechnung der Bilder, bevor ich Stereo Matching darauf anwende.

 

Bild: OpenCV Sample

Hinterlasse einen Kommentar

Deine Email Adresse wird nicht veröffentlicht.

Blog abonnieren

Abonniere Raspberry Pi Tutorials, um kein Tutorial mehr zu verpassen!