Вычисление позы камеры с матрицей гомографии на основе 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 с результатами, полученными с помощью метода executePnP OpenCV (используя следующие трехмерные точки [0,0,0] [0,1,0] [1,0,0] [1,1 , 0]).

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

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

Любое понимание того, что я делаю неправильно?

Редактировать после попытки метода @ Jav_Rock

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

Вот пример:

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

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

EDIT2: Я нормализовал v3 после его вычисления (для обеспечения ортонормированности), и это, похоже, также решает некоторые проблемы.

Ответы на вопрос(6)

Ваш ответ на вопрос