Структура OpenCV из проблемы перепроектирования движения

В настоящее время у меня возникла проблема с моей программой Structure from Motion, основанной на OpenCv.
Я постараюсь изобразить вам, что он делает, и что он должен делать.

Эта программа основана на классическом методе «структура из движения».

Основная идея состоит в том, чтобы взять пару изображений, определить их ключевые точки и вычислить дескрипторы этих ключевых точек. Затем выполняется сопоставление ключевых точек с определенным количеством тестов, чтобы убедиться, что результат хороший. Эта часть работает отлично.

После того, как это сделано, выполняются следующие вычисления: фундаментальная матрица, существенная матрица, SVD-разложение существенной матрицы, вычисление матрицы камеры и, наконец, триангуляция.

Результатом для пары изображений является набор трехмерных координат, дающий нам точки, которые нужно нарисовать в 3D-вьюере. Это отлично работает для пары.

Действительно, вот моя проблема: для пары изображений трехмерные координаты точек вычисляются в системе координат первого изображения пары изображений, в качестве эталонного изображения. При работе с более чем двумя изображениями, что является целью моей программы, Я должен перепроектировать трехмерные точки, вычисленные в системе координат самого первого изображения, для того, чтобы получить последовательный результат.

Мой вопрос: Как мне перепроецировать координату 3D-точек, заданную в системе, связанной с камерой, в другую систему, связанную с камерой? С матрицами камеры?

Моя идея состояла в том, чтобы взять трехмерные координаты точки и умножить их на число, обратное каждой матрице камеры.

Я уточняю:

Предположим, я работаю над третьим и четвертым изображением (следовательно, с третьей парой изображений, потому что я работаю как 1-2 / 2-3 / 3-4 и так далее).

Я получаю свои точечные 3D-координаты в системе координат третьего изображения. Как мне правильно их перепроецировать в самой первой системе координат изображения?

Я бы сделал следующее:

Получите матрицу координат трехмерных точек, примените обратную матрицу камеры для изображения 2–3, а затем примените обратную матрицу камеры для изображения 1–2.
Это даже правильно?

Потому что эти матрицы камер не квадратные, и я не могу их инвертировать.

Я, конечно, где-то ошибаюсь, и я был бы признателен, если бы кто-то мог просветить меня, я почти уверен, что это относительно легко, но я явно что-то упускаю …

Большое спасибо за чтение 🙂

0

Решение

Допустим, у вас есть матрица внешних параметров 3 * 4, называемая P, Чтобы соответствовать обозначениям Документация OpenCV, это [R|t],

Эта матрица P описывает проекцию от координат мирового пространства до координат камеры. Цитировать документацию:

[R | t] переводит координаты точки (X, Y, Z) в систему координат, фиксированную относительно камеры.

Вы задаетесь вопросом, почему эта матрица не квадратная. Это потому, что в обычном контексте OpenCV вы не ожидаете однородные координаты в качестве вывода. Поэтому, чтобы сделать его квадратным, просто добавьте четвертую строку, содержащую (0,0,0,1), Давайте назовем эту новую квадратную матрицу Q,

У вас есть одна такая матрица для каждой пары камер, то есть у вас есть одна Qk матрица для каждой пары изображений {k,k+1} который описывает проекцию из координатного пространства камеры k к камере k+1, Эти матрицы являются обратимыми, потому что они описывают изометрии в однородных координатах.

Чтобы перейти от координатного пространства камеры 3 к координатному пространству камеры 1, просто примените к своим точкам обратную величину Q2 а также затем обратная сторона Q1,

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]