Гомографическое разложение матрицы, полученной в findHomography()

Я использовал этот код в качестве основы для обнаружения моей прямоугольной цели. в сцене. Я использую ORB и Flann Matcher. Мне удалось успешно нарисовать ограничивающую рамку обнаруженной цели в моей сцене, используя функции findHomography() и perspectiveTransform().
Эталонное изображение (img_object в приведенном выше коде) представляет собой прямой вид только прямоугольной цели. Теперь цель в моем изображении сцены может быть наклонена вперед или назад. Я хочу узнать угол, на который он был наклонен. Я прочитал разные сообщения и пришел к выводу, что гомографию, возвращаемую findHomography(), можно разложить на матрицу вращения и вектор перевода. Я использовал код из рекомендованного http://https:/gist.github.com/inspirit/740979 по этой ссылке, переведенной на C++. Это код декомпозиции Zhang SVD, полученный из модуля калибровки камеры OpenCV. Я получил полное объяснение этого кода декомпозиции из книги O'Reilly Learning OpenCV.
Мои вопросы:

  1. Прав ли я, предполагая, что полученная мной разложенная матрица вращения скажет мне угол, на который была наклонена моя цель?
  2. Во-вторых, могу ли я использовать гомографию, полученную из findHomography(), в качестве входных данных для этого модуля декомпозиции и ожидать правильного результата? Или я что-то упускаю?
  3. Есть ли другой способ добиться того же?

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

Заранее спасибо за ваше время и ответы.


person user2958957    schedule 05.02.2014    source источник
comment
почему бы вам не создать свою гомографию с известными параметрами (масштаб, перемещение и вращение и параметры перспективы) и не попробовать декомпозицию на такой матрице? вы увидите, будут ли извлечены правильные параметры.   -  person Micka    schedule 06.02.2014
comment
проблема не в декомпозиции гомографии. Я совершенно уверен, что она работает правильно. Что я хочу знать, так это в моем случае, могу ли я дать гомографию, возвращаемую findHomography() после применения обнаружения ORB к этому модулю? Будет ли вращение матрица дает мне угол, на который моя цель повернута?   -  person user2958957    schedule 10.02.2014


Ответы (1)


Процедура калибровки Чжана создаст матрицу вращения. Это можно представить как 3 (Эйлеровых) угла, а не один. Или, что то же самое (через формулу Родригеса), как один единичный вектор и угол поворота вокруг этого вектора, то есть снова три числа.

Если ваша камера и цель не очень точно расположены друг относительно друга, нет причин ожидать, что будет только один ненулевой угол поворота.

person Francesco Callari    schedule 06.02.2014
comment
Спасибо за ваш ответ. Я понимаю, что на двух других осях также будут небольшие значения угла. Можете ли вы подробнее рассказать о формуле Родригеса? Для меня цель движется к камере или от нее. Таким образом, эта матрица вращения способна даешь мне это вращение тоже? - person user2958957; 10.02.2014
comment
Формулу Родригеса см., например. wikipedia: en.wikipedia.org/wiki/Axis_angle — в OpenCV есть код для преобразования в /из матриц вращения. Я не понимаю ваш второй вопрос: вращение связано с движением к камере или от нее? Это перевод, а не ротация. - person Francesco Callari; 10.02.2014
comment
извините, я не был понятен. Под наклоном вперед/назад или по направлению к/от камеры я имел в виду, что моя цель вращается вокруг оси x в системе осей opencv, как указано в ссылка, так что это означает, что я получу вращение по этой оси. - person user2958957; 11.02.2014
comment
Да, в этом случае представление оси-угла представляет собой вектор, параллельный оси x, с углом, представляющим вращение вокруг нее, положительным, когда он направлен против часовой стрелки относительно. ось (если смотреть глазами на кончик стрелы, а ногами на перо). Однако на практике ось не будет точно параллельна оси х камеры, если только вы не очень тщательно изготовили установку, которая была бы такой. - person Francesco Callari; 11.02.2014