У меня есть 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 (который будет намного лучше из-за подхода к минимизации ошибок итеративного перепроецирования).
Вот пример:
Как и вы Как видите, черный куб более или менее в порядке, но не кажется хорошо пропорциональным, хотя векторы кажутся ортонормированными.
РЕДАКТИРОВАТЬ2: Я нормализовал v3 после его вычисления (для обеспечения ортонормированности), и, похоже, он также решает некоторые проблемы.