web-dev-qa-db-fra.com

Obtenez les coordonnées 3D du pixel de l'image 2D si les paramètres extrinsèques et intrinsèques sont connus

Je fais le calibrage de la caméra du tsai algo. J'ai obtenu une matrice intrensique et extrinsèque, mais comment puis-je reconstruire les coordonnées 3D à partir de cette inormation?

enter image description here

1) Je peux utiliser l'élimination gaussienne pour trouver X, Y, Z, W, puis les points seront X/W, Y/W, Z/W comme système homogène.

2) Je peux utiliser l'approche documentation OpenCV :

enter image description here

comme je sais u, v, R, t, je peux calculer X,Y,Z.

Cependant, les deux méthodes aboutissent à des résultats différents qui ne sont pas corrects.

Qu'est-ce que je fais mal?

34
YAHOOOOO

Si vous avez des paramètres extrinsèques, vous avez tout. Cela signifie que vous pouvez avoir l'homographie des extrinsèques (également appelée CameraPose). Pose est une matrice 3x4, l'homographie est une matrice 3x3, H définie comme

                   H = K*[r1, r2, t],       //eqn 8.1, Hartley and Zisserman

avec K étant la matrice intrinsèque de la caméra, r1 et r2 étant les deux premières colonnes de la rotation matrice, R ; t est le vecteur de traduction.

Normalisez ensuite tout en divisant par t.

Qu'advient-il de la colonne r, ne l'utilisons-nous pas? Non, car il est redondant car il est le produit croisé des 2 premières colonnes de pose.

Maintenant que vous avez l'homographie, projetez les points. Vos 2d points sont x, y. Ajoutez-les a z = 1, donc ils sont maintenant en 3D. Projetez-les comme suit:

        p          = [x y 1];
        projection = H * p;                   //project
        projnorm   = projection / p(z);      //normalize

J'espère que cela t'aides.

29
Jav_Rock

Comme indiqué dans les commentaires ci-dessus, la projection de coordonnées d'image 2D dans un "espace de caméra" 3D nécessite intrinsèquement la composition des coordonnées z, car ces informations sont totalement perdues dans l'image. Une solution consiste à attribuer une valeur fictive (z = 1) à chacun des points d'espace d'image 2D avant la projection, comme l'a répondu Jav_Rock.

p          = [x y 1];
projection = H * p;                   //project
projnorm   = projection / p(z);      //normalize

Une alternative intéressante à cette solution factice consiste à former un modèle pour prédire la profondeur de chaque point avant la reprojection dans l'espace de la caméra 3D. J'ai essayé cette méthode et j'ai eu beaucoup de succès en utilisant un Pytorch CNN formé sur les boîtes de délimitation 3D du jeu de données KITTI. Serait heureux de fournir du code mais ce serait un peu long à publier ici.

1
DerekG