2012-07-02 3 views
3

У меня есть одна калиброванная камера (известны известные внутренние параметры, то есть матрица камеры K, а также коэффициенты искажения).реконструкция движения с одной камеры

Я хотел бы восстановить 3d-траекторию камеры. Нет никаких априорных знаний о сцене.

Упрощение проблемы путем представления двух изображений, которые выглядят на одной и той же сцене, и извлечения из них двух наборов соответствующих совпадающих точек функции (SIFT, SURF, ORB и т. Д.) Моя проблема заключается в том, как вычислить внешние параметры камеры (т. е. матрицу поворота R и вектор трансляции t) между точками зрения?

Мне удалось вычислить фундаментальную матрицу, и так как K знает, то и основную матрицу. с помощью David Nister's efficient solution to the Five-Point Relative Pose Problem мне удалось получить 4 возможное решение, но:

  1. ограничение на существенной матрицы E ~ U * диаг (s, s, 0) * V»не всегда применяется - вызывает неправильные результаты , [РЕДАКТИРОВАТЬ]: получение среднего сингулярного значения, похоже, исправить результаты :) один вниз

  2. Как я могу определить, какой из четырех является правильным?

Благодаря

ответ

2

Ваше решение пункта 1 верное: diag ((s1 + s2)/2, (s1 + s2)/2, 0).

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

Код для проверки, какое решение является правильным, можно найти здесь: http://cs.gmu.edu/%7Ekosecka/examples-code/essentialDiscrete.m от http://cs.gmu.edu/%7Ekosecka/bookcode.html Они используют детерминанты U и V, чтобы определить решение с правильной ориентацией. Ищите комментарий «тогда четыре возможности». Поскольку вы только оцениваете существенную матрицу, она подвержена шуму и не ведет себя хорошо, если все точки являются копланарными.

Кроме того, перевод восстанавливается только с постоянным коэффициентом масштабирования, поэтому тот факт, что вы видите нормализованный вектор трансляции единицы измерения, является точно правильным. Причина в том, что глубина неизвестна и оценивается как 1. Вам нужно будет найти какой-то способ восстановить глубину, как в коде для восьмиточечного алгоритма + 3d реконструкции (Алгоритм 5.1 в ссылке книжного кода.)

Книга, взятая из приведенного выше примера, также является очень хорошей ссылкой. http://vision.ucla.edu/MASKS/ Глава 5, интересующая вас, доступна на ссылке Sample Chapters.

+0

Это именно то, что я пытаюсь понять. для каждой комбинации R/R 'и t/-t я триангулирует точки и получаю набор трехмерных точек. Я рисую камеру таким образом, что их фокус находится в точке t и смотрит в направлении оси Z, повернутой R. Я ожидал, что в правильной комбинации все точки будут лежать перед двумя камерами - и в некоторых случаях это никогда не бывает. Я думаю, что мой заговор ошибочен. И еще один вопрос, если можно: в результатах я всегда получаю, что | t | (норма t) всегда 1, нежелательное ограничение, так как расстояние между камерами может быть различным, чем 1 ... – Mercury

+0

Я обновил свой ответ, чтобы ответить на ваши вопросы, так как я не думал, что смогу получить все это в комментарий. Дайте мне знать, если это не имеет смысла. – beaker

+0

Отлично! :))) спасибо! – Mercury

0

Поздравляю Вас с тяжелой работы, звучит, как вы старались, чтобы изучить эти методы. Для фактического кода производственной силы я бы посоветовал загрузить libmv и ceres и переконфигурировать ваше решение, используя их.

Ваши два вопроса на самом деле одно: неверные решения отклоняются на основе собранных вами данных. В частности, алгоритм Нистера (а также Stewenius's) обычно используется во внутреннем цикле RANSAC-подобного решателя, который выбирает решение с наилучшим количеством фиктивных/максимальных значений.

+0

Привет, Франко, и благодарю вас за ответ.Я пытаюсь сделать как можно меньше использования стороннего кода. Создание решения с помощью Matlab/opencv не должно занимать более двух строк (если вы знаете, что писать), и я хотел бы попытаться решить его сам. :) – Mercury

Смежные вопросы