Erstellen einer gültigen Punktwolken-Darstellung eines Stereobildpaares mit OpenCV 3.0 StereoSGBM und PCL

8

Ich habe vor kurzem begonnen, mit OpenCV 3.0 zu arbeiten und mein Ziel ist es, ein Paar Stereobilder von einer Reihe von Stereokameras aufzunehmen, eine Disparitätskarte zu erstellen, die Disparitätskarte in eine 3D-Punktwolke umzuwandeln und schließlich den resultierenden Punkt zu zeigen Wolke in einem Point-Cloud-Viewer mit PCL.

Ich habe die Kamerakalibrierung bereits durchgeführt und der resultierende Kalibrierungs-RMS ist 0.4

Sie finden meine Bildpaare (linkes Bild) 1 und (rechtes Bild) 2 in den folgenden Links. Ich verwende StereoSGBM, um Disparitätsbilder zu erzeugen. Ich verwende auch Trackbars, um StereoSGBM-Funktionsparameter einzustellen, um ein besseres Disparitätsbild zu erhalten. Leider kann ich mein Disparitätsbild nicht posten, da ich neu in StackOverflow bin und nicht genug Reputation habe, um mehr als zwei Bildlinks zu posten!

Nachdem ich das Disparitätsbild ("disp" im unten stehenden Code) erhalten habe, verwende ich die Funktion reprojectImageTo3D (), um die Disparitätsbildinformationen in XYZ-3D-Koordinaten umzuwandeln, und wandle dann die Ergebnisse in ein Array von "pcl :: PointXYZRGB "Punkte, damit sie in einem PCL Point Cloud Viewer angezeigt werden können. Nach dem Ausführen der erforderlichen Konvertierung, was ich als Punktwolke bekomme, ist eine dumme Pyramidenformpunktwolke, die keinen Sinn ergibt. Ich habe bereits alle vorgeschlagenen Methoden in den folgenden Links gelesen und ausprobiert:

1- http: //blog.martinperis.com/2012/01/3d-reconstruction-with-opencv-and-point.html

2- http: //stackoverflow.com/questions/13463476/opencv-stereorectifyuncalibrated-to-3d-point-cloud

3- http: //stackoverflow.com/questions/22418846/reprojectimageto3d-in-opencv

und keiner von ihnen hat funktioniert !!!

Im Folgenden habe ich den Conversion-Teil meines Codes angegeben. Es wäre sehr hilfreich, wenn Sie mir sagen könnten, was ich vermisse:

%Vor%     
Ehsan Masnavi 16.12.2015, 22:04
quelle

1 Antwort

11

Nachdem ich einige Arbeiten und Recherchen durchgeführt habe, habe ich meine Antwort gefunden und teile sie hier, damit andere Leser sie nutzen können.

Mit dem Konvertierungsalgorithmus aus dem Disparitätsbild in 3D XYZ (und eventuell in einer Punktwolke) war nichts falsch. Das Problem war die Entfernung der Objekte (von denen ich Bilder machte) zu den Kameras und die Menge an Informationen, die für die StereoBM- oder StereoSGBM-Algorithmen verfügbar war, um Ähnlichkeiten zwischen den zwei Bildern (Bildpaar) zu erkennen. Um eine geeignete 3D-Punktwolke zu erhalten, ist ein gutes Disparitätsbild erforderlich. Um ein gutes Disparitätsbild zu erhalten (vorausgesetzt, Sie haben eine gute Kalibrierung durchgeführt), stellen Sie Folgendes sicher:

1- Es sollten genug erkennbare und unterscheidbare gemeinsame Merkmale zwischen den beiden Bildern (rechtes und linkes Bild) verfügbar sein. Der Grund dafür ist, dass StereoBM- oder StereoSGBM-Algorithmen nach gemeinsamen Merkmalen zwischen den zwei Bildern suchen, und sie können leicht durch ähnliche Dinge in den zwei Bildern verfälscht werden, die nicht notwendigerweise zu den gleichen Objekten gehören. Ich persönlich denke, dass diese beiden Matching-Algorithmen viel Raum für Verbesserungen bieten. Also pass auf, was du mit deinen Kameras anschaust.

2- Objekte von Interesse (diejenigen, an denen Sie interessiert sind, ihr 3D-Punktwolkenmodell zu haben) sollten sich in einer bestimmten Entfernung zu Ihren Kameras befinden. Je größer die Grundlinie ist (Grundlinie ist der Abstand zwischen den beiden Kameras), desto weiter können Ihre Objekte von Interesse sein (Ziele).

Ein geräuschvolles und verzerrtes Disparitätsbild erzeugt niemals eine gute 3D-Punktwolke. Eine Sache, die Sie tun können, um Ihre Disparitätsbilder zu verbessern, ist die Verwendung von Trackbars in Ihren Anwendungen, so dass Sie die StereoSBM- oder StereoSGBM-Parameter anpassen können, bis Sie gute Ergebnisse sehen (klares und glattes Disparitätsbild). Code unten ist ein kleines und einfaches Beispiel, wie man Trackbars erzeugt (ich schrieb es so einfach wie möglich). Verwenden Sie wie erforderlich:

%Vor%

Wenn Sie nicht die richtigen Ergebnisse und das glatte Ungleichheitsbild erhalten, lassen Sie sich nicht enttäuschen. Versuchen Sie, die OpenCV-Beispielbilder (das mit einer orangefarbenen Schreibtischlampe) mit Ihrem Algorithmus zu verwenden, um sicherzustellen, dass Sie die richtige Pipelinefunktion haben. Versuchen Sie dann, Bilder aus verschiedenen Entfernungen aufzunehmen und mit StereoBM / StereoSGBM-Parametern zu spielen sinnvoll. Ich benutzte mein eigenes Gesicht für diesen Zweck und da ich eine sehr kleine Grundlinie hatte, kam ich sehr nah an meine Kameras heran (Hier ist ein Link zu meinem 3D-Gesichtspunkt-Wolkenbild, und hey, wage es nicht zu lachen !!! ) 1 . Ich war sehr glücklich, mich selbst in einer 3D-Punktwolkenform gesehen zu haben, nachdem ich eine Woche gekämpft hatte. Ich war noch nie so glücklich, mich selbst gesehen zu haben !!! ;)

    
Ehsan Masnavi 18.12.2015, 18:16
quelle

Tags und Links