2017-07-20 14 views
2

Meine Stereo-Kamera hat verschiedene Auflösungen 1280x480, 640x240 und 320x120. (Die Kamera streamt ein synchronisiertes Bildpaar 640X480 horizontal eingefügt, deshalb ist 1280x480).In Stereo-Kalibrierung, wie die extrinsische Matrix ändert, wenn ich die Auflösung der Stereo-Kamera ändern

Ich habe den Algorithmus von Opencv3 Stereo Calibration im folgenden link verwendet, um die Stereokamera mit der Auflösung von 1280 * 480 zu kalibrieren.

stereoRectify(M1, D1, M2, D2, img_size, R, T, R1, R2, P1, P2, Q, CALIB_ZERO_DISPARITY, -1, img_size, &roi1, &roi2); 
    Mat map11, map12, map21, map22; 
    initUndistortRectifyMap(M1, D1, R1, P1, img_size, CV_16SC2, map11, map12); 
    initUndistortRectifyMap(M2, D2, R2, P2, img_size, CV_16SC2, map21, map22); 

    Mat img1r, img2r; 
    remap(img1, img1r, map11, map12, INTER_LINEAR); 
    remap(img2, img2r, map21, map22, INTER_LINEAR); 

Die stereoRectify berechnet die Rotationsmatrix R, Translationsmatrix T zwischen linken und rechten Kamera. Und es berechnet auch zwei Matrizen der Rotation R1, R2 und zwei Matrizen der Projektion P1 P2. Ich habe die Ausgabe von stereoRectify als Eingabe von initUndistortRectifyMap und dann neu zuordnen, um die Projektion anzuwenden.

Hier ist eine stackoverflow Antwort zu erklären, wie es geht.

Jetzt habe ich die zwei Matrizen der Entzerrung Karte von links map11, map12 und rechte Kamera map21, map22.

Aber jetzt möchte ich diese Kameramatrizen M1 und M2, die Verzerrungsmatrizen D1 und D2 und die extrinsischen Matrizen R, T, R1, R2, P1 und P2 verwenden, um die Kamerabilder in einer niedrigeren Auflösung (320x120) zu korrigieren . PS Ich habe die Kamera nicht direkt mit der Auflösung von 320 * 120 kalibriert, da das Bild zu klein ist und der Algorithmus von Opencv die Schachbrettecken nicht finden kann, um die Kalibrierung durchzuführen.

Ich weiß, dass "die Verzerrungskoeffizienten nicht von der betrachteten Szene abhängen. Somit gehören sie auch zu den intrinsischen Kameraparametern. Und sie bleiben unabhängig von der aufgenommenen Bildauflösung gleich. Wenn zB eine Kamera hat auf Bilder mit einer Auflösung von 320 x 240 kalibriert wurden, können für 640 x 480 Bilder derselben Kamera absolut die gleichen Verzerrungskoeffizienten verwendet werden, während f_x, f_y, c_x und c_y entsprechend skaliert werden müssen. " nach the documentation of opencv. (Ich testete und es funktioniert)

Ich möchte wissen: Wie sollte ich die Matrizen von R, T, R1, R2, P1, P2 ändern, um die Remap in einer niedrigeren Auflösung von 1280x480 zu 320x120?

Antwort

0

Eigentlich Ich ändere die Matrizen von P1 und P2, die die Kombination aus Kamera intrinsische Matrix und Kamera Translationsmatrix sind.

Ich teile sie nur durch 4 für 320x120. Die allgemeine Formel ist:

fx '= (dimX'/dimX) * fx

fy '= (dimy'/dimy) * fy

fx‘ist der Wert für die neue Auflösung, fx ist der Wert, den Sie bereits für Ihre ursprüngliche Auflösung haben, dimx 'ist die neue Auflösung entlang der X-Achse, dimx ist die Originalauflösung. Das Gleiche gilt für FY.

cx und cy werden analog berechnet, da alle diese Werte in Pixelkoordinaten ausgedrückt werden.

-1

Nach vielen Herumspiele nicht nurP1 und P2 skaliert werden sollen, sondern auch M1 und M2 (im Code des OP).

Denken Sie daran, dass die Skalierung nur zwei erste Diagonaleinträge der linken Skalierungsmatrix ist und dass die dritte 1 bleibt.

Verwandte Themen