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.