J'utilise deux images de l'objet unique l'objet est roated certain degré de sa première image.
J'ai calculé le POSE de chaque image et converti le vecteur de rotation en matrice à l'aide de Rodergues (). Maintenant, comment puis-je calculer et voir à quel point il est tourné depuis sa première position?
J'ai essayé de nombreuses façons mais les réponses étaient non étaient proches
EDIT: Ma caméra est fixe, seul l'objet bouge.
Nous pouvons obtenir des angles d'Euler à partir de la matrice de rotation en utilisant la formule suivante.
Étant donné une matrice de rotation 3 × 3
Les 3 angles d'Euler sont
Ici atan2 est la même fonction d'arc tangente, avec la vérification de quadrant, que vous trouvez généralement dans C ou Matlab.
Remarque: Des précautions doivent être prises si l'angle autour de l'axe y est exactement de +/- 90 °. Dans ce cas, tous les éléments de la première colonne et de la dernière ligne, à l'exception de celui du coin inférieur, qui est 1 ou -1, seront 0 (cos (1) = 0). Une solution serait de fixer la rotation autour de l'axe des x à 180 ° et de calculer l'angle autour de l'axe des z à partir de: atan2 (r_12, -r_22).
Voir aussi https://www.geometrictools.com/Documentation/EulerAngles.pdf , qui inclut des implémentations pour six ordres différents d'angles d'Euler.
Si R est la matrice de rotation (3x3), alors l'angle de rotation sera acos ((tr (R) -1)/2), où tr (R) est la trace de la matrice (c'est-à-dire la somme des éléments diagonaux).
C'est ce que vous avez demandé; J'estime une probabilité de 90% que ce n'est pas ce que vous voulez.
Pour votre référence, ce code calcule les angles d'Euler dans MATLAB:
function Eul = RotMat2Euler(R)
if R(1,3) == 1 | R(1,3) == -1
%special case
E3 = 0; %set arbitrarily
dlta = atan2(R(1,2),R(1,3));
if R(1,3) == -1
E2 = pi/2;
E1 = E3 + dlta;
else
E2 = -pi/2;
E1 = -E3 + dlta;
end
else
E2 = - asin(R(1,3));
E1 = atan2(R(2,3)/cos(E2), R(3,3)/cos(E2));
E3 = atan2(R(1,2)/cos(E2), R(1,1)/cos(E2));
end
Eul = [E1 E2 E3];
Code fourni par Graham Taylor, Geoff Hinton et Sam Roweis. Pour plus d'informations, voir ici
Soit R1c et R2c les 2 matrices de rotation que vous avez calculées. Ceux-ci expriment les rotations de l'objet dans les poses 1 et 2 respectivement vers le cadre de la caméra (d'où le deuxième suffixe c). La matrice de rotation que vous souhaitez est de la pose 1 à la pose 2, c'est-à-dire R12. Pour le calculer, vous devez faire pivoter, dans votre esprit, l'objet de pose_1 vers la caméra, puis de la caméra vers la pose_2. Cette dernière rotation est l'inverse de la pose_2 à la caméra exprimée par R2c, d'où:
R12 = R1c * inv(R2c)
A partir de la matrice R12, vous pouvez ensuite calculer l'angle et l'axe de rotation en utilisant la formule de Rodiguez.