Вычисление позы камеры с матрицей гомографии на основе 4 копланарных точек

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

Поскольку точки компланарны, я могу вычислить гомографию между углами единичного квадрата (т.е. [0,0] [0,1] [1,0] [1,1]) и координатами видео квадрата. .

Из этой омографии я смогу вычислить правильную позу камеры, т. Е.[R | t], где R - матрица вращения 3x3, а t - вектор трансляции 3x1, так что виртуальный куб лежит на квадрокоптере.

Я прочитал много решений (некоторые из них на SO) и попытался реализовать их, но они, похоже, работают только в некоторых «простых» случаях (например, когда видео-квадратик представляет собой квадрат), но не работают в большинстве случаев.

Вот методы, которые я пробовал (большинство из них основано на тех же принципах, только вычисления перевода немного отличаются). Пусть K - внутренняя матрица камеры, а H - гомография. Мы вычисляем:

A = K-1 * H

Пусть a1, a2, a3 будут векторами-столбцами A, а r1, r2, r3 - векторами-столбцами матрицы вращения R.

r1 = a1 / ||a1||
r2 = a2 / ||a2||
r3 = r1 x r2
t = a3 / sqrt(||a1||*||a2||)

Проблема в том, что это не работает в большинстве случаев. Чтобы проверить свои результаты, я сравнил R и t с результатами, полученными методом OpenCV resolvePnP (используя следующие трехмерные точки [0,0,0] [0,1,0] [1,0,0] [1,1 , 0]).

Поскольку я показываю куб таким же образом, я заметил, что в каждом случае resolvePnP дает правильные результаты, в то время как поза, полученная из гомографии, в основном неверна.

Теоретически, поскольку мои точки компланарны, можно вычислить позу из гомографии, но я не смог найти правильный способ вычислить позу из H.

Есть какие-нибудь идеи о том, что я делаю неправильно?

Отредактируйте после попытки @Jav_Rock

Привет, Jav_Rock, большое спасибо за ваш ответ, я попробовал ваш подход (и многие другие), который кажется более или менее нормальным. Тем не менее, у меня все еще есть некоторые проблемы при вычислении позы на основе 4 копланарных точек.Чтобы проверить результаты, я сравниваю с результатами от resolvePnP (который будет намного лучше из-за подхода к минимизации ошибок итеративного перепроецирования).

Вот пример:

cube

  • Желтый куб: Решите PNP
  • Черный куб: техника Jav_Rock
  • Голубой (и фиолетовый) куб (ы): некоторые другие методы дают точно такие же результаты

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

РЕДАКТИРОВАТЬ2: Я нормализовал v3 после его вычисления (для обеспечения ортонормированности), и, похоже, он также решает некоторые проблемы.

44
задан alexburtnik 15 May 2017 в 10:52
поделиться