2010-09-28 14 views
7

Ich habe den großen Emgu C# -Wrapper für OpenCV verwendet, um Bilder von einem selbstgebauten Stereo-Rig zu sammeln. Zwei Webcams sind in einem Abstand von 35cm zu einem Stück Holz verschraubt, um hoffentlich Tiefenkarten im 10-20m Bereich erstellen zu können. Ich habe sie so parallel aufgestellt, wie ich es machen kann (etwa 89,3 Grad aus einem Triangulationstest).Emgu (OpenCV für C#) - Erstellen einer Disparitätskarte mit cvStereoRectify

Ich versuche, eine Disparitätskarte aus diesen zu machen, und obwohl der Prozess als Code funktioniert, sind die Ergebnisse sehr zufällig. Damit meine ich jedes Mal, wenn ich versuche, die Stereo-Korrektur durchzuführen, sehr unterschiedliche Ergebnisse und das Bild ist oft so stark verzogen, dass es auf dem Bildschirm kaum etwas zu sehen gibt.

Wie ich ihm die Art und Weise verstehen, dies zu tun, ist wie folgt:


1) ein Schachbrettmuster Drucken aus (zum Beispiel 6 von 8 Innenecken) - Aufkleben auf etwas flach.

2) Nehmen Sie einen Satz von etwa 10 Fotos von Kamera 1, die das Schachbrett in voller Ansicht, aber verschiedenen Positionen halten.

3) verwenden CameraCalibration.FindChessboardCorners die inneren Ecken (6 von 8)

4) verwenden img.FindCornerSubPix() zu finden, diese Eckpositionen auf Subpixel-Niveau

5) CameraCalibration.CalibrateCamera verwenden zu verfeinern(), um die intrinsischen Kamera Details zu berechnen, und speichern Sie diese als XML-Datei

6) Wiederholen Sie oben für Kamera 2.

7) Jetzt können Sie die interne Kamera Verzeichnung Informationen haben Sie eine Stereo-p nehmen Hoto-Paar verwenden und CameraCalibration.StereoCalibrate() mit den zuvor berechneten intrinsischen Daten verwenden, um die extrinsischen Informationen (Offsets und Rotationen zwischen Kamera 1 und 2) zu berechnen.

8) Verwenden Sie CvInvoke.cvStereoRectify() und CvInvoke.cvInitUndistortRectifyMap() und dann CvInvoke.cvRemap(), um ein Ausgabebild zu erstellen, das in Y aufgereiht sein sollte, damit Sie einen der Stereokorrespondenztests ausführen können.

Ich fand, dass Sie Emgu 2.1 ver 806 verwenden müssen, um den cvStereoRectify ohne Zugriffsverletzung Fehler zu erhalten.


ich meine Fragen erraten sind:

A) Ist mein Prozess richtig? Ich habe die intrinsische Kalibrierung der Kamera als separaten Prozess durchgeführt, weil die Kameras 35 cm voneinander entfernt sind, ist es nicht einfach, das Schachbrett im Blick auf beide im Büro zu bekommen und es viel herum zu bewegen .. wie es bald von der Seite geht einer der Kameraansichten. Ich habe mir gedacht, dass es sich bei den Werten um intrinsische Werte handelt, die sich auf die Kamera beziehen und daher auf die Stereo-Prozedur OK übertragen werden sollten. Ist das richtig?

Es scheint, dass die intrinsischen Werte während des Prozesses cvStereoRectify geändert werden und sehr unterschiedlich sind.

z. Verzerrungswerte von der ersten Stufe = 0,22, -1,2,0,01, -0,01,2,6 nach cvStereoReceive die Werte wurden geändert in = 10, -489, -0,03, -0,09,13208

Ich bin kein Experte, aber der erste Set scheint mehr wie das zu sein, was ich von den Kommentaren anderer gesehen habe, und das zweite Set scheint ziemlich out zu sein!

B) Gibt es eine Möglichkeit, die intrinsischen + Verzerrungswerte, die während cvStereoRectify aktualisiert werden, zu stoppen?

C) Scheint dies richtig für die inneren Werte (937,0,290,0,932,249,0,0,1)?

Vielen Dank für irgendwelche Tipps ... Ich bin seit einer Weile hier fest ... und ich bin mir wirklich nicht sicher, welcher Teil des Prozesses die Fehler ausgibt. Irgendwelche Tipps oder Vorschläge wären sehr willkommen ...

+0

Ich habe gerade festgestellt, dass alles besser zu funktionieren scheint, wenn Sie das Bildset von L und R Kameras gleichzeitig sammeln, dann lösen Sie alle Objektmodellpunkte (zB Schachbrettecken) und die beiden Sätze Bild-Ecke-Koordinaten (dh linke und rechte Kamera-Sub-Pixel-Koordinaten). – timemirror

+0

Auch scheint es eine bessere Arbeit zu leisten, wenn das Schachbrett ziemlich nah an der Kamera ist ... mein Problem ist, dass mir das nicht viel Platz zum Arbeiten gibt, da meine Kameras so weit auseinander liegen. Deshalb habe ich gerade ein größeres Schachbrett (200%) gemacht und es weiter weg gehalten. Das gibt mir die Genauigkeit bei der Eckenanpassung und auch mehr Platz um es zu bewegen. Scheint zu helfen ... arbeite noch daran! – timemirror

+0

@timemirror: Haben Sie die Matlab-Kalibrierungs-Toolbox (www.vision.caltech.edu/bouguetj/calib_doc/) oder Danail Stoyonovs Kamera-Kalibrierungstools (http://ubimon.doc.ic.ac.uk/dvs/m581) überprüft .html) sind beide ausgezeichnete Werkzeuge für die Kalibrierung. Was haben Sie übrigens mit der emguCV-Bibliothek herausgefunden, haben Sie damit zufriedenstellende Ergebnisse erzielt? –

Antwort

0

Ich habe EMGU in ein paar Jahren nicht benutzt, aber ich benutzte es, um eine Kamera und eine Kinect zu kalibrieren.

Ich fand, dass es etwas Verwirrung mit der Ordnung der rechteckigen Ecken geben kann, wenn das Rechteck völlig horizontal ist - ich habe nie wirklich auf den Grund warum, und das schien nur für mich zu arbeiten. Versuchen Sie, die Platte so aufzustellen, dass das Rechteck eine Rolle von 45 Grad hat (d. H. Von vorne würden Sie eher eine Rautenform sehen, wenn das irgendeinen Sinn ergibt).

Mein grundlegendes Verständnis ist, dass dies es beiden Kameras erleichtern sollte, sicherzustellen, dass sie die gleiche Ecke wie die erste Ecke auswählen, von der aus gezählt werden soll.

Ich kann nicht garantieren, dass dies Ihr Problem beheben wird - es könnte einfach sein, dass ich etwas tief in meinem Code falsch gemacht hatte und deshalb konnte es keine regelmäßigen Ergebnisse erzielen, wenn das Schachbrett flach war. Andererseits wird es nicht lange dauern zu testen und könnte nur funktionieren.