Вычисление позы камеры с матрицей гомографии на основе 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 после его вычисления (для обеспечения ортонормированности), и это, похоже, также решает некоторые проблемы.