Bonjour,

j'ai calibré une camera avec opencv pour récupérer la matrice intrinseque et la matrice de distortion. Je souhaite maintenant à partir de 6 points de références en 3D connu avec la position sur la caméra en 2D connu également trouvé la matrice extrinseque avec solvepnp et ensuite réafficher le résultat en opengl.

solvepnp fonctionne a priori correctement : lorsque j'utilise projectPoints pour retrouver la position 2D à partir des points 3D estimés, c'est pas trop mal (par parfait .. mais mieux que mon réaffichage en 3D ) ...

j'ai reconstruit la matrice de projection en suivant l'example d'opencv sur posit
http://opencv.willowgarage.com/wiki/Posit

pour la matrice de modelview je fais de la manière suivante je travaille sur une image dont la distortion à été traité ) :

-> point 3D en metre
-> point 2D sur l'image par rapport à l'origine en haut à gauche de l'image :

solvePnP(model3d,imagePt,monosource->cameraMatrix(),NulDist,rvec,tvec,false);
qWarning(qPrintable(QString("translation-- vec %1 %2 %3").arg(translation_vector[0]).arg(translation_vector[1]).arg(translation_vector[2])));

Mat rotM(3,3,CV_64FC1,_d);
Rodrigues(rvec,rotM);
Rodrigues(rotM,rvec);

projectPoints(model3d, rvec,tvec,monosource->cameraMatrix(),NulDist, imagePoints2);
float err = norm(imagePoints, imagePoints2, CV_L2);
float val=sqrt(err*err/count);

MonoSource *tsource=(MonoSource*)source();
if(tsource==NULL) return;

Mat out=tsource->getFrame();
qWarning(qPrintable(QString("error %1").arg(val)));

for(int i=0;i<imagePoints2.size();i++)
{
circle(out,imagePoints2.at(i),5,Scalar(1,1,1,1),-1);

}
imwrite("c:\\temp\\out.png",out);

for(int k=0;k++;k<16)
{
modelViewMatrix[k]=0;
}
modelViewMatrix[0]=_d[0];
modelViewMatrix[1]=-_d[3];
modelViewMatrix[2]=-_d[6];
modelViewMatrix[3]=0;
modelViewMatrix[4]=_d[1];
modelViewMatrix[5]=-_d[4];
modelViewMatrix[6]=-_d[7];
modelViewMatrix[7] = 0.0;
modelViewMatrix[8] = _d[2];
modelViewMatrix[9] = -_d[5];
modelViewMatrix[10] =-_d[8];
modelViewMatrix[11] = 0.0;
modelViewMatrix[12] = tvec.at<double>(0,0);
modelViewMatrix[13] = -tvec.at<double>(1,0);
modelViewMatrix[14] = -tvec.at<double>(2,0);
modelViewMatrix[15] = 1.0;

c'est cette matrice que je charge comme matrice de modelview....

j'apercois quelque chose de globalement cohérent (pas complétement faux) mais c'est quand meme décalé vers la gauche (espece de rotation) de genre 50 pixels ... bien plus que le résultat visible avec projectpoints .. .pour info err vaut 12 et j'ai fais la calibration avec 6 points ....
j'ai retourné tous les forums ... essayer pleins de méthode différentes pour calculer la matrice de model view ... et je retombe toujours sur ce gros décalage ....