У меня есть 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 (которые будут намного лучше из-за подхода к минимизации ошибок повторного проецирования).
Вот пример:
- Желтый куб: решить PNP
- Черный куб: техника Jav_Rock
- Голубой (и фиолетовый) куб (ы): некоторые другие методы дают точно такие же результаты
Как видите, черный куб более или менее хорош, но не кажется хорошо пропорциональным, хотя векторы кажутся ортонормированными.
РЕДАКТИРОВАТЬ2: Я нормализовал v3 после его вычисления (для обеспечения ортонормированности), и, похоже, он также решает некоторые проблемы.
cameraPoseFromHomography
? Какой параметр - H, а какой - поза? Как нарисовать куб, как на изображении вопроса? Пожалуйста, помогите мне, потому что я не знаю, как продолжить! Приветствую, Джонас (Вы можете найти вопрос здесь: stackoverflow.com/questions/51009968/how-to -draw-cube-c) - person   schedule 24.06.2018