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

Merci d'avance.