Bonjour,
J'essaie de trouver les paramètres de ma camera en fonction de points 3D et de leur projection 2D. La fonction calibrateCamera semble être adaptée, mais tout ce que j'arrive a avoir, c'est une belle boucle infinie. La documentation ne précise evidemment absolument rien et mes recherches sur google n'ont rien donné.
Explications du code:
J'ai un tableau de points 3D qui contient les coordonnées réelles des points (fixes) et un tableau de points 2D qui correspond a leur projection à l'écran (pour débugger, j'ai fixé les valeurs pour correspondre aux 4 coins de l'écran).
Ensuite, j'ai les listes de prises de vues qui ne contiennent en fait qu'une vue (correspondant aux tableaux de points).
Et ca coince a la fonction calibrateCamera sans que je sache vraiment pourquoi...
Est-ce que le problème pourrait venir du fait que je n'ai que peu de points ? Ou alors qu'une seule prise de vue ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 std::vector<cv::Point3f> points3Dcoords(4); points3Dcoords[0] = ( cv::Point3f(0,1,0) ); points3Dcoords[1] = ( cv::Point3f(0,0,0) ); points3Dcoords[2] = ( cv::Point3f(1,0,0) ); points3Dcoords[3] = ( cv::Point3f(1,1,0) ); std::vector<cv::Point2f> points2Dcoords(4); points2Dcoords[0] = ( cv::Point2f(0,height) ); points2Dcoords[1] = ( cv::Point2f(0,0) ); points2Dcoords[2] = ( cv::Point2f(width,0) ); points2Dcoords[3] = ( cv::Point2f(width,height) ); // listes de prises de vues (une seule) std::vector< std::vector<cv::Point3f> > views3D; views3D.push_back(points3Dcoords); std::vector< std::vector<cv::Point2f> > views2D; views2D.push_back(points2Dcoords); // resultats cv::Mat projectionMatrix, distortionMatrix; std::vector<cv::Mat> rotations; std::vector<cv::Mat> translations; double d = cv::calibrateCamera(views3D, views2D, cv::Size(width, height), projectionMatrix, distortionMatrix, rotations, translations);
Merci d'avance.
Partager