2017-07-20 3 views
2

Mon appareil stéréo a différentes résolutions 1280x480, 640x240 et 320x120. (La caméra diffuse une paire synchronisée d'images 640X480 collées horizontalement, c'est pourquoi 1280x480).En étalonnage stéréo, comment la matrice extrinsèque change si je change la résolution de la caméra stéréo

J'ai utilisé l'algorithme de calibrage stéréo Opencv3 dans le link suivant pour calibrer la caméra stéréo avec la résolution de 1280 * 480.

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); 

Le stereoRectify calcule la matrice de rotation R, la matrice T translation entre la caméra gauche et à droite. Et aussi, il calcule deux matrices de rotation R1, R2 et deux matrices de projection P1 P2. J'ai utilisé la sortie de stereoRectify comme l'entrée de initUndistortRectifyMap, puis remappez pour appliquer la projection.

Voici une réponse stackoverflow pour expliquer comment le faire.

Maintenant, j'ai les deux matrices de la carte de rectification de gauche map11, map12 et carte de droite map21, map22. Mais maintenant je veux utiliser ces matrices de caméras M1 et M2, les matrices de distorsion D1 et D2, et les matrices extrinsèques R, T, R1, R2, P1 et P2 pour rectifier les images de la caméra dans une résolution inférieure (320x120) chacune . PS Je n'ai pas calibré l'appareil photo avec la résolution de 320 * 120 directement parce que l'image est trop petite et l'algorithme d'Opencv ne trouve pas les coins de l'échiquier pour effectuer le calibrage. Je sais que "Les coefficients de distorsion ne dépendent pas de la scène vue, ils appartiennent aussi aux paramètres intrinsèques de la caméra et ils restent les mêmes quelle que soit la résolution de l'image capturée. calibrés sur des images de résolution 320 x 240, les mêmes coefficients de distorsion peuvent être utilisés pour les images 640 x 480 de la même caméra, alors que f_x, f_y, c_x et c_y doivent être mis à l'échelle de manière appropriée. " selon the documentation of opencv. (J'ai testé et ça marche)

Je veux savoir: comment dois-je modifier les matrices de R, T, R1, R2, P1, P2 pour faire le remappage dans une résolution inférieure de 1280x480 à 320x120 ?.

Répondre

0

En fait Je change les matrices de P1 et P2 qui sont la combinaison de la matrice intrinsèque de la caméra et de la matrice de traduction de la caméra.

Je juste les diviser par 4 pour l'utilisation 320x120. La formule générale est:

fx '= (dimx'/dimx) * fx

fy '= (dimy'/dimy) * fy

FX » est la valeur de votre nouvelle résolution, fx est la valeur que vous avez déjà pour votre résolution d'origine, dimx 'est la nouvelle résolution le long de l'axe des x, dimx est l'original. La même chose s'applique à fy.

cx et cy sont calculés analogiquement car toutes ces valeurs sont exprimées en coordonnées de pixels.

-1

Après beaucoup jouer autour non seulementP1 et P2 devraient être mis à l'échelle, mais aussi M1 et M2 (dans le code de l'OP).Rappelez-vous que la mise à l'échelle ne concerne que deux premières entrées diagonales de la matrice de mise à l'échelle de gauche et que la troisième est la suivante.