Структура от движения (SfM) является процессом оценки 3-D структуры сцены из набора 2D изображений. SfM используется во многих приложениях, таких как 3-D сканирование и дополненная реальность.
SfM может быть вычислен многими различными способами. Путь, которым вы приближаетесь к проблеме, зависит от различных факторов, таких как номер и тип камер, используемых, и упорядочены ли изображения. Если изображения взяты с одной калиброванной камерой, то 3-D структурой и движением камеры может только быть восстановленный up to scale. up to scale означает, что можно повторно масштабировать структуру и значение движения камеры и все еще поддержать наблюдения. Например, если вы помещаете камеру близко к объекту, вы видите то же изображение как тогда, когда вы увеличиваете объект и перемещаете камеру далеко. Если вы хотите вычислить фактическую шкалу структуры и движения в мировых модулях, вам нужна дополнительная информация, такая как:
Размер объекта в сцене
Информация от другого датчика, например, одометра.
Для простого случая структуры от двух стационарных камер или одной движущейся камеры, одно представление должно быть рассмотрено камерой 1 и другой одной камерой 2. В этом сценарии алгоритм принимает, что камера 1 в начале координат, и его оптическая ось простирается вдоль z - ось.
SfM требует соответствий точки между изображениями. Найдите соответствующие точки или путем соответствия с функциями или отслеживания точек от изображения 1, чтобы отобразить 2. Покажите методы отслеживания, такие как алгоритм Kanade-Lucas-Tomasi (KLT), работайте хорошо, когда камеры будут близко друг к другу. Когда камеры перемещаются далее независимо, алгоритм KLT ломается, и функция, соответствующая, может быть использована вместо этого.
Расстояние между камерами (базовая линия) | Метод для нахождения соответствий точки | Пример |
---|---|---|
Широкий | Совпадайте с функциями с помощью matchFeatures | Найдите поворот изображения и шкалу Используя автоматизированное соответствие функции |
Узкий | Отследите функции с помощью vision.PointTracker | Столкнитесь с обнаружением и отслеживающий Используя алгоритм KLT |
Чтобы найти положение второй камеры относительно первой камеры, необходимо вычислить основную матрицу. Используйте соответствующие точки, найденные на предыдущем шаге для вычисления. Основная матрица описывает epipolar геометрию этих двух камер. Это связывает точку в одной камере к epipolar строке в другой камере. Используйте функцию estimateFundamentalMatrix
, чтобы оценить основную матрицу.
Введите основную матрицу к функции relativeCameraPose
. relativeCameraPose
возвращает ориентацию и местоположение второй камеры в системе координат первой камеры. Местоположение может только быть вычислено, чтобы масштабироваться, таким образом, расстояние между двумя камерами установлено в 1. Другими словами, расстояние между камерами задано, чтобы быть 1 модулем.
Определите 3-D местоположения совпадающих точек с помощью triangulate
. Поскольку положение предоставлено право масштабироваться, когда вы вычисляете структуру, оно имеет правильную форму, но не фактический размер.
Функция triangulate
берет две матрицы камеры, которые можно вычислить использование cameraMatrix
.
Используйте pcshow
, чтобы отобразить реконструкцию и использовать plotCamera
, чтобы визуализировать положения камеры.
Чтобы восстановить шкалу реконструкции, вам нужна дополнительная информация. Один метод, чтобы восстановить шкалу должен обнаружить объект известного размера в сцене. Структура От Движения От Двух примеров Представлений показывает, как восстановить шкалу путем обнаружения сферы известного размера в облаке точек сцены.
Для большинства приложений, таких как робототехника и автономное управление, SfM использует больше чем два представления.
Подход, используемый для SfM от двух представлений, может быть расширен для нескольких представлений. Набор нескольких представлений, используемых для SfM, может быть упорядочен или не упорядочен. Подход, проявленный здесь, принимает упорядоченную последовательность представлений. SfM от нескольких представлений требует соответствий точки через повторные изображения, названные tracks. Типичный подход должен вычислить дорожки из попарных соответствий точки. Можно использовать viewSet
, чтобы управлять попарными соответствиями и найти дорожки. Каждая дорожка соответствует 3-D точке в сцене. Чтобы вычислить 3-D точки из дорожек, используйте triangulateMultiview
.
Используя подход в SfM от двух представлений, можно найти положение камеры 2 относительно камеры 1. Чтобы расширить этот подход к нескольким просматривают случай, находят положение камеры 3 относительно камеры 2, и так далее. Относительные положения должны быть преобразованы в общую систему координат. Как правило, все положения камеры вычисляются относительно камеры 1 так, чтобы все положения были в той же системе координат. Можно использовать viewSet
, чтобы управлять положениями камеры. Объектно-ориентированная память viewSet
представления и связи между представлениями.
Каждая оценка положения камеры от одного представления до следующего содержит ошибки. Ошибки являются результатом неточной локализации точки в изображениях, и от шумных соответствий и неточной калибровки. Эти ошибки накапливаются как количество увеличений представлений, эффект, известный как drift. Один способ уменьшать дрейф, должен совершенствовать положения камеры и 3-D местоположения точки. Нелинейный алгоритм оптимизации, названный bundle adjustment, реализованным функцией bundleAdjustment
, может использоваться для улучшения.
Структура От Движения От Нескольких примера Представлений показывает, как восстановить 3-D сцену из последовательности 2D представлений. Пример использует приложение Camera Calibrator, чтобы калибровать камеру, которая получает представления. Это использует объект viewSet
сохранить и управлять данными, сопоставленными с каждым представлением.
Camera Calibrator | Stereo Camera Calibrator | bundleAdjustment
| cameraMatrix
| estimateFundamentalMatrix
| matchFeatures
| pointTrack
| relativeCameraPose
| triangulateMultiview
| viewSet
| vision.PointTracker