У меня есть 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 (что будет намного лучше благодаря подходу минимизации ошибок повторного проецирования).
Вот пример:
- Желтый куб: Решить PNP
- Черный куб: техника Jav_Rock
- Голубой (и фиолетовый) куб (ы): некоторые другие методы дают точно такие же результаты
Как вы можете видеть, черный куб более или менее в порядке, но не выглядит хорошо пропорциональным, хотя векторы кажутся ортонормированными.
EDIT2: Я нормализовал v3после его вычисления (для обеспечения ортонормированности), и это, похоже, также решает некоторые проблемы.