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?
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 :
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?
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.
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.