2014-02-19 3 views
0

Я хотел бы получить матрицу гомографии для зрения с высоты птичьего полета, и я знаю матрицу проекции камеры. Есть ли связь между ними?OpenCV - проекция, матрица гомографии и вид с высоты птичьего полета

Спасибо.

+1

можете ли вы сформулировать немного больше? – nkint

+0

Итак, я работаю с автономным автомобилем, и я хотел бы получить матрицу гомографии для зрения с высоты птичьего полета, и есть много способов сделать это, но у меня есть матрица Projetion камеры, и я хотел бы с этим получить Гомографию Матрица, но я не знаю, как это сделать. – DualSim

ответ

0

Матрица проецирования определяется как произведение собственного (например, фокусного расстояния, главных точек и т. Д.) И внешних матриц (вращения и трансляции). Вопрос: w.r.t, что такое ваша ротация и перевод? Например, я могу представить себе другую камеру или объект в 3D, относительно которого у вас есть эти вращения и переводы. В противном случае ваша проекция - это просто внутренняя матрица.

Сначала подумайте о части информации, которую вам нужно знать, чтобы получить вид с высоты птичьего полета: вам нужно знать, по крайней мере, как ваша камера ориентирована на поверхность земли w.r.t. Если вы также знаете высоту камеры, вы можете создать метрическую реконструкцию. Но так как вы упоминали о гомографии, я предполагаю, что вы считаете, что вы смотрите на плоскую поверхность с высоты птичьего полета, так как гомография карт отображает точки на двух плоских поверхностях, в вашем случае точки на ровной поверхности в точках вашего плоского датчика.

Давайте рассмотрим уравнение камеры обскуры. В основном сказано, что [u, v, 1] T ~ A * [R | t] [x, y, z, 1] T, где A - внутренняя матрица камеры. Теперь, когда вы имеете дело с грунтом ,, вы можете выровнять с ним новую систему координат, установив z = 0; R | t - матрицы вращения и трансляции из этой системы координат в вашу систему, выровненную по камере;

Затем обратите внимание, что ваша R | t является матрицей 3x4 и она теряет одно измерение, так как z = 0; он становится 3x3 или гомографией, которая теперь равна H = A * R '| t; Хорошо, что мы только что доказали, что между землей и вашим датчиком существует гомографическое отображение;

Теперь вы хотите еще один вид гомографии, который происходит при чистых поворотах камеры и масштабирует между точками на датчике до и после поворота/увеличения; то есть вы хотите повернуть камеру вниз и, возможно, уменьшить масштаб. Опять же, подумайте в терминах уравнения камеры-обскуры: изначально у вас был H1 = A (здесь я выбросил R | T как нерелевантный на данный момент), а затем вы повернули свою камеру, и у вас есть H2 = AR; Другими словами, H1 - это то, как вы сейчас делаете свое изображение, а H2 - как вы хотите, чтобы ваше изображение выглядело.
Отношения между двумя - это то, что вы хотите найти, H12, и это также гомография, так как Homography является семейством преобразований (используйте эту простую эвристику: что происходит в семье в семье). Поскольку одна и та же поверхность может генерировать изображения либо с H1, либо H2, мы можем собрать H12, отменив H1 (назад к плоскости заземления) и применив H2 (от земли до точки зрения птичьего полета); в некотором смысле это напоминает операции с векторами, вы просто должны соблюдать порядок матрицы заявки от право на левой:
H12 = H2 * H1 -1 = A * R * A -1 = P * A -1, где мы заменили выражения для H1, H2 и, наконец, для матрицы проекции (в случае, если у вас есть)

Это ваш ответ, и если вращение R неизвестно что можно угадать с помощью ориентации камеры по земли или рассчитывается с использованием solvePnP() из библиотеки opeCV. Наконец, когда я делаю это на мобильном телефоне, я просто использую его показания акселерометра в качестве хорошего приближения, поскольку, когда сотовый телефон не ускоряется, показания представляют собой гравитационный вектор, который дает вращение w.r.t. плоская горизонтальная земля.

Когда вы рисуете вид птичьего глаза в качестве изображения, вы заметите, что его границы превратились из прямоугольной в какую-то трапецию (из-за формы усеченного фотоаппарата), и в отдаленных местах есть отверстия. недостаточная частота дискретизации). Вы можете интерполировать внутри отверстий, используя wrapPerspective()

+0

Как мне вычислить трансляционную часть? Изображение после деформирования с H12 выходит из области просмотра, мне нужно его перевести. –