У меня есть 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 быть векторами-столбцами А и r1, r2, r3 векторы-столбцы матрицы вращения R.
r1 = a1/||a1||
r2 = a2/||a2||
r3 = r1 x r2
t = a3/sqrt(||a1||*||a2||)
Вопрос заключается в том, что это делает не работают в большинстве случаев. Чтобы проверить мои результаты, я сравнил R и t с результатами, полученными методом solvePnP OpenCV (используя следующие трехмерные точки [0,0,0] [0,1,0] [1,0,0] [1,1 , 0]).
Поскольку я отображаю куб таким же образом, я заметил, что в каждом случае solvePnP дает правильные результаты, а поза, полученная из гомографии, в основном неправильна.
В теории, так как мои точки лежат в одной плоскости, можно вычислить позу от омографии, но я не мог найти правильный путь, чтобы вычислить позу от H.
Любые идеи о том, что я делаю неправильно ?
Edit после попытки @ метода Jav_Rock в
Привет Jav_Rock, большое спасибо за ваш ответ, я попробовал ваш подход (как и многие другие, а), который, кажется, более или менее в порядке. Тем не менее у меня все еще возникают проблемы при вычислении позы на основе 4-х компланарных точек. Чтобы проверить результаты, я сравниваю с результатами solvePnP (что будет намного лучше из-за итеративного подхода к минимизации погрешностей).
Вот пример:
- Желтый куб: Решите ПНФ
- Black Cube: Техника Jav_Rock в
- Cyan (и фиолетовый) куб (ы): некоторые другие методы, учитывая точные результаты
Как вы можете видеть, черный куб больше или менее ОК, но, похоже, не очень пропорционален, хотя векторы кажутся ортонормированными.
EDIT2: Я нормализовал v3 после его вычисления (для обеспечения ортонормальности), и, похоже, он также решает некоторые проблемы.
Так solvepnp OpenCV обеспечивает правильные результаты, а ваша реализация не так? – nav
Да solvePnP дает правильные результаты, тогда как моя реализация с использованием гомологий не дает правильных векторов поворота/трансляции. – JimN
Если вы делитесь своим кодом, мы можем пройти его и посмотреть, как он может быть исправлен. Одна вещь, которую вы, возможно, забыли, - обеспечить ортонормированность матрицы вращения. – fireant