12 votes

Dans OpenCV, conversion d'un point d'image 2d en vecteur unitaire du monde 3d

J'ai calibré ma caméra avec OpenCV (findChessboard etc) donc j'ai : - Coefficients de distorsion de la caméra et matrice intrinsèque - Informations sur la pose de la caméra (translation et rotation, calculées séparément par d'autres moyens) sous forme d'angles d'Euler et d'un 4x4. - Points 2D dans le cadre de la caméra

Comment puis-je convertir ces points 2D en vecteurs unitaires 3D pointant vers le monde ? J'ai essayé d'utiliser cv::undistortPoints mais ça ne semble pas fonctionner (ça ne renvoie que des points 2D remappés), et je ne sais pas exactement quelle méthode de calcul matriciel utiliser pour modéliser la caméra via les intrinsèques de Camera que j'ai.

20voto

Hammer Points 4435

Convertissez votre point 2d en un point homogène (donnez-lui une troisième coordonnée égale à 1), puis multipliez-le par l'inverse de la matrice intrinsèque de votre caméra. Par exemple

cv::Matx31f hom_pt(point_in_image.x, point_in_image.y, 1);
hom_pt = camera_intrinsics_mat.inv()*hom_pt; //put in world coordinates

cv::Point3f origin(0,0,0);
cv::Point3f direction(hom_pt(0),hom_pt(1),hom_pt(2));

//To get a unit vector, direction just needs to be normalized
direction *= 1/cv::norm(direction);

L'origine et la direction définissent maintenant le rayon dans l'espace mondial correspondant à ce point image. Notez qu'ici l'origine est centrée sur la caméra, vous pouvez utiliser la pose de votre caméra pour la transformer en une origine différente. Les coefficients de distorsion font correspondre votre caméra réelle au modèle de caméra sténopé et doivent être utilisés au tout début pour trouver votre coordonnée 2d réelle. Les étapes sont donc les suivantes

  1. Déformation d'une coordonnée 2d avec des coefficients de distorsion
  2. Convertir en rayon (comme indiqué ci-dessus)
  3. Déplacez ce rayon dans le système de coordonnées de votre choix.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X