2014-02-05 2 views
1

Я использовал это code в качестве основы для обнаружения моей прямоугольной цели в сцене. Я использую ORB и Flann Matcher. Я смог нарисовать ограничительную рамку обнаруженной цели на моей сцене успешно используя функции findHomography() и perspectiveTransform().
Образное изображение (img_object в приведенном выше коде) является прямым видом только прямоугольной цели. Теперь цель в изображении моей сцены может быть наклонена вперед или назад. Я хочу узнать угол, на котором он был наклонён . Я прочитал разные сообщения и пришел к выводу, что гомография, возвращаемая findHomography(), может быть разложена на матрицу вращения и вектор трансляции. Я использовал код из https: /gist.github.com/inspirit/740979, рекомендованный this link, переведенный на C++. Это код разложения Zhang SVD, полученный от модуля калибровки камеры OpenCV. Я получил полное объяснение этого кода разложения Книга O'Reilly по обучению 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_ {х} = atan2 (R_ {32}, R_ {33})

    theta_ {у} = atan2 (-r_ {31}, {SQRT R_ {32}^2 + R_ {33}^2})

    theta_ {г} = atan2 (R_ {21}, R_ {11})


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


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

ответ

2

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

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

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

+0

На самом деле, поскольку я использую обе формулы на одной матрице поворота, не должен ли один из трех углов эйлера соответствовать углу, полученному от формулы Родригеса? Я новичок в этих концепциях, поэтому, пожалуйста, исправьте меня, если я ошибаюсь. – user2958957

+0

№. Угол в формуле Родригеса - это полное вращение, углы Эйлера - три упорядоченных вращения вокруг трех отдельных осей, которые вместе выполняют одинаковое полное вращение. Попросите, возьмите себе четыре карандаша и какую-нибудь ленту, привяжите три из них под углом 90 градусов, затем смоделируйте всю проблему в ваших руках. –

+0

спасибо за разъяснение :) Я также искал альтернативные способы разложения гомографии и использовал ответ Jav_Rock в [this] (http://stackoverflow.com/questions/8927771/computing-camera-pose-with-homography-matrix- основанные на 4-компланарных точках) для гомографии, возвращаемой findHomography(), но углы поворота всегда равны 0. Есть ли разница, когда я оцениваю гомографию между двумя изображениями с использованием совпадающих точек и используя только 4 точных точки для вычисления гомографии ? – user2958957

Смежные вопросы