Nous avons une caméra stéréo USB à double objectif ELP de 1,0 mégapixel et nous essayons de la calibrer en utilisant OpenCV 3.1 en C++. Cependant, le résultat du calibrage est totalement inutilisable, car l'appel de stereoRectify twiste totalement l'image. C'est ce que nous faisons:OpenCV stereoRectify déforme l'image
modèle d'étalonnage Finding (jeu d'échecs) dans les deux caméras, la taille de jeu d'échecs est 5x7 et le résultat est presque identique quel que soit le nombre d'images prises
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));
Tous les échiquiers sont correctement détectés qui est vérifiée à l'aide
drawChessboardCorners(img[k], boardSize, corners, bFound);
Ensuite, nous calibrons chaque caméra séparément (mais cette étape ne semble pas être important pour l'étalonnage stéréo), mais nous pouvons l'utiliser pour vérifier chaque caméra séparément
calibrateCamera(objectPoints, imagePoints[k], Size(320, 240), cameraMatrix[k], distCoeffs[k], rvecs, tvecs, 0)
Ensuite, nous faisons l'étalonnage stéréo
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);
Compute la rectification transform
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]);
Initialiser cartes pour 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);
Le résultat est l'image totalement déformée. Comme je l'ai dit au début, tous les modèles d'étalonnage/échiquier sont correctement détectés et si nous n'appelons pas la fonction stereoRectify, les images non déformées (après remappage) semblent parfaites. Le problème vient si nous appelons la fonction stereoRectify.
Y a-t-il quelque chose qui nous manque? Le nombre d'images d'étalonnage ne semble pas avoir
un effet (prenant parfois 2 images donne un meilleur résultat (mais pas encore utilisable) de 10 images) Ceci est l'exemple du modèle d'étalonnage. Nous prenons plusieurs orientations différentes:
Ceci est le résultat de l'étalonnage si nous ne remettons pas stereoRectify:
Ceci est le résultat erroné si nous appelons stereoRectify (mais surtout il est beaucoup (pire):
Merci d'avance pour toute aide que pourrait avoir tort.
Nous vous remercions de votre conseil. Cela m'a beaucoup aidé, mais j'ai remarqué ce qui suit: - CALIB_FIX_K3 doit au moins être passé dans CalibrateCamera et CALIB_SAME_FOCAL_LENGTH info stereoCalibrate sinon le résultat est totalement désordonné - J'obtiens RMS autour de 0.1 de calibrateCamera mais RMS très élevé autour de 20 de stereoCalibrate - bien que le résultat semble bon maintenant, l'image semble être un peu zoomée après remappage - J'ai 320x240, si je redimensionne manuellement l'image à 640x480 avant la détection de l'échiquier, puis redimensionner le résultat par 2.0, le résultat semble être parfait – bigmuscle
Vous pouvez contrôler le niveau de zoom de l'image avec le paramètre alpha et avez-vous les extrinsèques de l'appareil photo corrects? Parce que dans mon cas le vecteur de traduction était éteint de 3-4 cm. Bien que ce ne soit pas pertinent, j'ajouterais que j'ai obtenu de meilleurs résultats avec CalTech ToolBox pour Matlab. –
Le paramètre alpha affecte réellement le niveau de zoom. Cependant, tout ce qui est différent de alpha = 0 ondule les bords de l'image et l'entoure de zones noires (c'est compréhensible), mais le résultat le plus fin (= pas de distorsion, pas de torsion etc.) est alpha = 0 et upscaling l'image échiquier avant findChessboardCorners puis redimensionnement des coins détectés. – bigmuscle