Я использую два изображения одного объекта, объект поворачивается в определенной степени от его первого изображения.
Я рассчитал POSE каждого изображения и преобразовал вектор вращения в матрицу, используя Rodergues (). Теперь, как мне рассчитать и посмотреть, насколько он повернут с первой позиции?
Я пробовал много способов, но ответы не были близки
РЕДАКТИРОВАТЬ: Моя камера зафиксирована, только объект движется.
Мы можем получить углы Эйлера из матрицы вращения, используя следующую формулу.
Учитывая матрицу вращения 3 × 3
3 угла Эйлера
Здесь atan2 — это та же функция арктангенса, с проверкой квадранта, которую вы обычно найдете в C или Matlab.
Примечание. Необходимо соблюдать осторожность, если угол вокруг оси Y составляет точно +/- 90 °. В этом случае все элементы в первом столбце и последней строке, кроме элемента в нижнем углу, который равен 1 или -1, будут равны 0 (cos (1) = 0). Одним из решений было бы зафиксировать вращение вокруг оси x на 180 ° и вычислить угол вокруг оси z из: atan2 (r_12, -r_22).
Смотрите также https://www.geometrictools.com/Documentation/EulerAngles.pdf, который включает в себя реализации для шести различных порядков углов Эйлера.
Если р является матрицей вращения (3×3), то угол поворота будет acos ((tr (р) -1) / 2), где tr (р) — это след матрицы (то есть сумма диагональных элементов).
Это то, что вы просили; Я оцениваю вероятность 90%, что это не то, что вы хотите.
Для справки, этот код вычисляет углы Эйлера в 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];
Код предоставлен Грэмом Тейлором, Джеффом Хинтоном и Сэмом Роуисом. Для получения дополнительной информации см. Вот
Пусть R1c и R2c будут 2 матрицы вращения, которые вы вычислили. Они выражают повороты от объекта в позах 1 и 2 соответственно к кадру камеры (отсюда второй суффикс c). Нужная матрица вращения — от позы 1 к позе 2, т.е. R12. Чтобы вычислить его, вы должны повернуть в своем уме объект из позы_1 в камеру, а затем из камеры в позу_2. Последнее вращение является обратной к позе 2 к камере, выраженной R2c, следовательно:
R12 = R1c * inv(R2c)
Из матрицы R12 вы можете вычислить угол и ось вращения, используя формулу Родигеса.