OpenCV stereoRectify verzerrt das Bild

Wir haben eine ELP 1.0 Megapixel Dual Lens USB-Stereokamera und versuchen, sie mit OpenCV 3.1 in C ++ zu kalibrieren. Das Ergebnis der Kalibrierung ist jedoch völlig unbrauchbar, da der Aufruf von stereoRectify das Bild total verdreht. Das ist was wir machen

Ermitteln des Kalibrierungsmusters (Schachbrettmuster) bei beiden Kameras. Die Schachbrettgröße beträgt 5 x 7 und das Ergebnis ist nahezu gleich, unabhängig von der Anzahl der aufgenommenen Bilder.

findChessboardCorners(img[k], boardSize, corners, CALIB_CB_ADAPTIVE_THRESH | CALIB_CB_NORMALIZE_IMAGE)
cornerSubPix(img[k], corners, Size(11, 11), Size(-1, -1), TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, 0.01));

Alle Schachbretter werden korrekt erkannt und mit @ verifizier

drawChessboardCorners(img[k], boardSize, corners, bFound);

Dann kalibrieren wir jede Kamera separat (aber dieser Schritt scheint für die Stereokalibrierung nicht wichtig zu sein), aber wir können ihn verwenden, um jede Kamera separat zu überprüfen.

calibrateCamera(objectPoints, imagePoints[k], Size(320, 240), cameraMatrix[k], distCoeffs[k], rvecs, tvecs, 0)

Dann machen wir eine Stereokalibrierung

stereoCalibrate(objectPoints, imagePoints[0], imagePoints[1], cameraMatrix[0], distCoeffs[0], cameraMatrix[1], distCoeffs[1],
    Size(320, 240), R, T, E, F, CALIB_USE_INTRINSIC_GUESS);

Berechnung der Gleichrichtungstransformation

stereoRectify(cameraMatrix[0], distCoeffs[0], cameraMatrix[1], distCoeffs[1], Size(320, 240), R, T, R1, R2, P1, P2, Q,
    CALIB_ZERO_DISPARITY, 1, Size(320, 240), &validRoI[0], &validRoI[1]);

Karten initialisieren für remap

Mat rmap[2][2];
initUndistortRectifyMap(cameraMatrix[0], distCoeffs[0], R1, P1, Size(FRAME_WIDTH, FRAME_HEIGHT), CV_16SC2, rmap[0][0], rmap[0][1]);
initUndistortRectifyMap(cameraMatrix[1], distCoeffs[1], R2, P2, Size(FRAME_WIDTH, FRAME_HEIGHT), CV_16SC2, rmap[1][0], rmap[1][1]);
...
remap(img, rimg, rmap[k][0], rmap[k][1], INTER_LINEAR);
imshow("Canvas", rimg);

Das Ergebnis ist ein total verzerrtes Bild. Wie ich zu Beginn sagte, werden alle Kalibrierungs- / Schachbrettmuster korrekt erkannt, und wenn wir die StereoRectify-Funktion nicht aufrufen, sehen die unverzerrten Bilder (nach der Neuzuordnung) perfekt aus. Das Problem tritt auf, wenn wir die Funktion stereoRectify aufrufen.

Gibt es etwas, das wir verpasst haben? Die Anzahl der Kalibrierungsbilder scheint keine Auswirkung zu haben (manchmal liefert die Aufnahme von 2 Bildern ein besseres Ergebnis (aber immer noch nicht verwendbar) als 10 Bilder).

Dies ist das Beispiel für ein Kalibrierungsmuster. Wir haben verschiedene Ausrichtungen:

Dies ist das Ergebnis der Kalibrierung, wenn wir stereoRectify nicht aufrufen:

Dies ist das falsche Ergebnis, wenn wir stereoRectify aufrufen (aber meistens wird es viel schlimmer):

Vielen Dank im Voraus für jede Hilfe, was falsch sein könnte.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage