Разрешение матриц вращения для получения углов

Я использовал это код в качестве основы для обнаружения моей прямоугольной цели в сцене. Я использую ORB и Flann Matcher. Мне удалось успешно нарисовать ограничивающую рамку для обнаруженной цели в моей сцене, используя функции findHomography () и перспективыTransform ().

Эталонное изображение (img_object в коде выше) является прямым видом только прямоугольной target.Now цель в моей сцене изображения может быть наклонена вперед или backwards.I хочет узнать угол, на который он был tilted.I есть прочитал различные посты и пришел к выводу, что гомография, возвращаемая функцией findHomography (), может быть разложена на матрицу вращения и вектор перевода. Я использовал код из https: /gist.github.com/inspirit/740979, рекомендованный эта ссылка переведено на C ++. Это код разложения SVD Чжана, полученный из модуля калибровки камеры OpenCV. Я получил полное объяснение этого кода разложения из книги O’Reilly Learning OpenCV.

Я также использовал solvePnP () на ключевых точках, возвращаемых средством сравнения, для перекрестной проверки матрицы вращения и вектора перевода, возвращенного из разложения гомографии, но они не кажутся одинаковыми.

У меня уже есть измерения наклона всех моих изображений сцены. Я нашел 2 способа извлечь углы из матрицы вращения, чтобы проверить, насколько хорошо они соответствуют моим значениям.

  • Учитывая матрицу вращения 3 × 3

    R =
    [r_ {11} & R_ {12} & r_ {13}] [r_ {21} & R_ {22} & r_ {23}] [r_ {31} & R_ {32} & r_ {33}]

    3 угла Эйлера

    theta_ {x} = atan2 (r_ {32}, r_ {33})

    theta_ {y} = atan2 (-r_ {31}, sqrt {r_ {32} ^ 2 + r_ {33} ^ 2})

    theta_ {z} = atan2 (r_ {21}, r_ {11})

  • Ось, представление угла — Будучи R общая матрица вращения, соответствующая ей ось вращения u
    и угол поворота θ можно узнать из:
    cos (θ) = (след (R) — 1) / 2
    [u] × = (R — R⊤) / 2 sin (θ)

Я рассчитал углы, используя оба метода для матриц вращения, полученных из разложения по гомографии, и solvepnp (). Все углы разные и дают очень неожиданные значения.

Есть ли дыра в моем понимании? Я не понимаю, где мои расчеты неверны. Есть ли альтернативы, которые я могу использовать?

1

Решение

Почему вы ожидаете, что они будут такими же? Они совсем не одно и то же.

Углы Эйлера — это три угла поворота вокруг одной оси одновременно, начиная с мировой системы отсчета.

Формула Родригеса дает компоненты одного вектора в мировой системе отсчета и угол поворота вокруг этого вектора.

2

Другие решения

Других решений пока нет …