La caméra pose d'estimation (OpenCV PnP)

Je suis en train d'essayer d'obtenir une pose estimation à partir d'une image de quatre fiducials connus avec des positions mondiales à l'aide de ma webcam.

J'ai vérifié de nombreuses stackexchange questions et quelques papiers et je n'arrive pas à obtenir une solution correcte. Les numéros de poste, je ne sors sont reproductibles, mais en aucune façon linéairement proportionnelle au mouvement de la caméra. Pour info, je suis en utilisant C++, OpenCV 2.1.

ce lien est sur la photo mes systèmes de coordonnées et les données de test utilisés ci-dessous.

% Input to solvePnP():
imagePoints =     [ 481, 831; % [x, y] format
                    520, 504;
                   1114, 828;
                   1106, 507]
objectPoints = [0.11, 1.15, 0; % [x, y, z] format
                0.11, 1.37, 0; 
                0.40, 1.15, 0;
                0.40, 1.37, 0]

% camera intrinsics for Logitech C910
cameraMat = [1913.71011, 0.00000,    1311.03556;
             0.00000,    1909.60756, 953.81594;
             0.00000,    0.00000,    1.00000]
distCoeffs = [0, 0, 0, 0, 0]

% output of solvePnP():
tVec = [-0.3515;
         0.8928; 
         0.1997]

rVec = [2.5279;
       -0.09793;
        0.2050]
% using Rodrigues to convert back to rotation matrix:

rMat = [0.9853, -0.1159,  0.1248;
       -0.0242, -0.8206, -0.5708;
        0.1686,  0.5594, -0.8114]

Jusqu'à présent, peut-on voir rien de mal avec ces chiffres? Je vous serais reconnaissant si quelqu'un pouvait vérifier, par exemple, dans MatLAB (code ci-dessus est m-fichier de l'environnement).

À partir de ce point, je ne suis pas certain de la façon d'obtenir le mondial de pose de la rMat et tVec.
De ce que j'ai lu dans cette question, pour obtenir la pose de la rMat et tVec est tout simplement:

position = transpose(rMat) * tVec   % matrix multiplication

Cependant je soupçonne d'autres sources que j'ai lu il n'est pas aussi simple que cela.

Pour obtenir la position de la caméra dans le monde réel les coordonnées, que dois-je faire?
Comme je ne suis pas sûr si c'est un problème de mise en œuvre (cependant plus probable une théorie de problème) je voudrais que quelqu'un qui a utilisé le solvePnP fonction avec succès dans OpenCV pour répondre à cette question, bien que toutes les idées sont les bienvenue aussi!

Je vous remercie beaucoup pour votre temps.

vous avez oublié à l'inverse de tVec. Donc la bonne façon de le faire est -transposition(rMat) * tVec

OriginalL'auteur Gouda | 2013-04-28