В настоящее время у меня возникла проблема с моей программой Structure from Motion, основанной на OpenCv.
Я постараюсь изобразить вам, что он делает, и что он должен делать.
Эта программа основана на классическом методе «структура из движения».
Основная идея состоит в том, чтобы взять пару изображений, определить их ключевые точки и вычислить дескрипторы этих ключевых точек. Затем выполняется сопоставление ключевых точек с определенным количеством тестов, чтобы убедиться, что результат хороший. Эта часть работает отлично.
После того, как это сделано, выполняются следующие вычисления: фундаментальная матрица, существенная матрица, SVD-разложение существенной матрицы, вычисление матрицы камеры и, наконец, триангуляция.
Результатом для пары изображений является набор трехмерных координат, дающий нам точки, которые нужно нарисовать в 3D-вьюере. Это отлично работает для пары.
Действительно, вот моя проблема: для пары изображений трехмерные координаты точек вычисляются в системе координат первого изображения пары изображений, в качестве эталонного изображения. При работе с более чем двумя изображениями, что является целью моей программы, Я должен перепроектировать трехмерные точки, вычисленные в системе координат самого первого изображения, для того, чтобы получить последовательный результат.
Мой вопрос: Как мне перепроецировать координату 3D-точек, заданную в системе, связанной с камерой, в другую систему, связанную с камерой? С матрицами камеры?
Моя идея состояла в том, чтобы взять трехмерные координаты точки и умножить их на число, обратное каждой матрице камеры.
Я уточняю:
Предположим, я работаю над третьим и четвертым изображением (следовательно, с третьей парой изображений, потому что я работаю как 1-2 / 2-3 / 3-4 и так далее).
Я получаю свои точечные 3D-координаты в системе координат третьего изображения. Как мне правильно их перепроецировать в самой первой системе координат изображения?
Я бы сделал следующее:
Получите матрицу координат трехмерных точек, примените обратную матрицу камеры для изображения 2–3, а затем примените обратную матрицу камеры для изображения 1–2.
Это даже правильно?
Потому что эти матрицы камер не квадратные, и я не могу их инвертировать.
Я, конечно, где-то ошибаюсь, и я был бы признателен, если бы кто-то мог просветить меня, я почти уверен, что это относительно легко, но я явно что-то упускаю …
Большое спасибо за чтение 🙂
Допустим, у вас есть матрица внешних параметров 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
,
Других решений пока нет …