#computer-vision #homography #projective-geometry
Вопрос:
У меня есть откалиброванная (виртуальная) камера в Blender, которая просматривает примерно плоский объект. Я делаю изображение из первой позы камеры P0 и перемещаю камеру в новую позу P1. Таким образом, у меня есть матрица камеры 4×4 для обоих видов, из которой я могу рассчитать преобразование между камерами, как показано ниже. Я также знаю внутреннюю матрицу К. Используя их, я хочу сопоставить точки с изображения для P0 с новым изображением, видимым с P1 (конечно, у меня есть основная истина для сравнения, потому что я могу визуализировать в Блендере после того, как камера переместится на P1). Если я только поверну камеру между P0 и P1, я смогу идеально рассчитать гомографию. Но если есть перевод, вычисленная матрица гомографии не учитывает это. Теория гласит, что после вычисления M10 последняя строка и столбец должны быть удалены для плоской сцены. Однако, когда я проверяю M10, я вижу, что значения перевода находятся в крайнем правом столбце, который я отбрасываю, чтобы получить матрицу гомографии 3×3 H10. Тогда, если вращения нет, H10 равно матрице идентичности. Что здесь происходит не так?
Редактировать: Я знаю, что изображения связаны гомографией, потому что, учитывая два изображения с P0 и P1, я могу найти гомографию (путем сопоставления функций), которая идеально отображает изображение с P0 на изображение с P1, даже при наличии поступательного движения камеры.
Комментарии:
1. вся эта математика часто преподносится небрежно. этой страницы будет недостаточно. не просто предполагайте, что вы можете уменьшить размер 4×4 до 3×3 независимо от этого. могут быть условия. не думайте, что объяснение правильное или что вы его правильно поняли. ищите вывод/доказательство этого шага. проверьте это. — Я не могу погрузиться в это. это не тривиальные вещи. требуется время, чтобы понять. — несколько лет назад я попытался получить омографию для изображения с камеры самолета, расположенного в пространстве… все пошло плохо. совсем недавно, с меньшим количеством степеней свободы, все прошло довольно гладко… уменьшите проблему
2. Матрица H10 зависит от выбора плоскости
n0 . p c0 = 0
. МатрицаM10
, кодирующая вращение и перемещение между двумя позициями, может быть фиксированной, то есть две позиции 0 и 1 могут быть фиксированы относительно мировой системы координат, но если вы изменитеn0 . p c0 = 0
матрицуH10
, она тоже должна измениться. ТакH10
что все зависитM10
и зависитn0 . p c0 = 0
.3. Итак, если мы установим
d0=0
, как сказано в книге, означает ли это, что перевода нет? Мне кажется, что только тогда можно отбросить последнюю строку и столбецM10
, чтобы получитьH10
.4. Определенно, в общем случае вы не можете устанавливать
d0=0
. В случае чистого вращения, когда центр камеры не меняется, мне кажется, что вы можете отбросить координату d0, так как тогда гомография имеет чисто 2D-проективную природу. В противном случае, когда сетнер камеры перемещается, гомография не является чисто 2D-проективной, но является ограничением 3D-проективной карты.5. Я думаю, вопрос в следующем: знаете ли вы положение самолета
n0 . p c0
в 3D? Поскольку у вас этого нет, то я не думаю, что вы сможете найти H10 в общем случае, когда есть перевод центра камеры. Если только у вас нет множества совпадающих точек на двух изображениях., что позволит вам построитьH10
и реконструировать плоскость .
Ответ №1:
Теория стала для меня более ясной после прочтения двух других книг: «Геометрия множественных представлений» Хартли и Зиссермана (Пример 13.2) и, в частности, «Приглашение к трехмерному видению: от изображений к геометрическим моделям» (Раздел 5.3.1, Планарная омография). Ниже приведен план, пожалуйста, проверьте вышеупомянутые источники для подробного объяснения.
Рассмотрим два изображения точек p
на 2D-плоскости P
в 3D-пространстве, преобразование между двумя кадрами камеры может быть записано следующим образом: X2 = R*X1 T
(1) где X1
и X2
являются координатами мировой точки p
в кадрах камеры 1 и 2, соответственно, R
вращение и T
перемещение между двумя кадрами камеры. Обозначая единичный вектор нормали плоскости P
к первому кадру камеры как N
и расстояние от плоскости P
до первой камеры как d
, мы можем использовать уравнение плоскости для записи N.T*X1=d
( .T
означает транспонирование) или, что эквивалентно (1/d)*N.T*X1=1
(2) для всех X1
на плоскости P
. Подстановка (2) в (1) дает X2 = R*X1 T*(1/d)*N.T*X1 = (R (1/d)*T*N.T)*X1
. Следовательно, матрица плоской гомографии (3×3) может быть извлечена как H=R (1/d)*T*N.T
, то есть X2 = H*X1
. Это линейное преобразование от X1
до X2
.
Расстояние d
может быть вычислено как произведение точек между нормалью плоскости и точкой на плоскости. Затем K
для расчета проективной гомографии следует использовать внутреннюю матрицу камеры G = K * R (1/d)*T*N.T * inv(K)
. Если вы используете программное обеспечение, такое как Blender или Unity, вы можете самостоятельно настроить встроенные функции камеры и таким образом получить K
. Для Blender в этом отличном ответе приведен хороший фрагмент кода.
В этом руководстве OpenCV есть хороший пример кода; см. «Демонстрация 3: Омография по смещению камеры».