Структура от движения (SfM) является процессом оценки 3-D структуры сцены из набора 2-D изображений. SfM используется во многих приложениях, таких как сканирование 3-D, дополненная реальность и визуальная одновременная локализация и картография (vSLAM).
SfM может быть вычислен многими различными способами. Способ, которым вы подходите к проблеме, зависит от различных факторов, таких как количество и тип используемых камер, и от того, упорядочены ли изображения. Если изображения сделаны с помощью одной калиброванной камеры, то 3-D структура и движение камеры могут быть восстановлены только up to scale. up to scale означает, что вы можете изменить структуру и величину движения камеры и все еще поддерживать наблюдения. Например, если поместить камеру рядом с объектом, можно увидеть то же изображение, что и когда вы увеличиваете объект и уводите камеру далеко. Если вы хотите вычислить фактическую шкалу структуры и движения в мировых единицах измерения, вам нужна дополнительная информация, такая как:
Размер объекта в сцене
Информация с другого датчика, например, одометра.
Для простого случая конструкции от двух стационарных камер или одной движущейся камеры один вид должен считаться камерой 1, а другой - камерой 2. В этом сценарии алгоритм принимает, что камера 1 находится в источнике, и ее оптическая ось лежит вдоль оси z .
SfM требует соответствия точек между изображениями. Найдите соответствующие точки либо путем соответствия функций, либо путем отслеживания точек от изображения 1 до изображения 2. Методов отслеживания функций, такие как алгоритм Канаде-Лукаса-Томази (KLT), хорошо работают, когда камеры близки друг к другу. Когда камеры перемещаются дальше, алгоритм KLT ломается, и вместо этого можно использовать соответствие функций.
Расстояние между камерами (базовая линия) | Метод нахождения соответствия точек | Пример |
---|---|---|
Широкий | Сопоставление функций с помощью matchFeatures | Поиск поворота и шкалы изображения с помощью автоматического соответствия функций |
Узкий | Отслеживайте функции, используя vision.PointTracker | Обнаружение и отслеживание лиц с помощью алгоритма KLT |
Чтобы найти положение второй камеры относительно первой, необходимо вычислить фундаментальную матрицу. Используйте соответствующие точки, найденные на предыдущем шаге для расчета. Фундаментальная матрица описывает эпиполярную геометрию двух камер. Он связывает точку в одной камере с эпиполярной линией в другой камере. Используйте estimateFundamentalMatrix
функция для оценки основной матрицы.
Введите фундаментальную матрицу в relativeCameraPose
функция. relativeCameraPose
возвращает ориентацию и расположение второй камеры в системе координат первой камеры. Расположение можно вычислить только до масштаба, поэтому расстояние между двумя камерами установлено равным 1. Другими словами, расстояние между камерами определяется как 1 модуль.
Определите 3-D местоположения совпадающих точек используя triangulate
. Поскольку положение соответствует масштабу, когда вы вычисляете структуру, она имеет правильную форму, но не фактический размер.
triangulate
функция принимает две матрицы камер, которые можно вычислить используя cameraMatrix
.
Использовать pcshow
или pcplayer
для отображения реконструкции. Использовать plotCamera
чтобы визуализировать положения камеры.
Чтобы восстановить шкалу реконструкции, нужна дополнительная информация. Одним из способов восстановления шкалы является обнаружение объекта известного размера в сцене. Пример Structure From Motion From Two Views показывает, как восстановить шкалу путем обнаружения сферы известного размера в облаке точек сцены.
Для большинства приложений, таких как робототехника и автономное управление автомобилем, SfM использует более двух представлений.
Подход, используемый для SfM из двух представлений, может быть расширен для нескольких представлений. Набор нескольких представлений, используемых для SfM, может быть упорядочен или неупорядочен. Принятый здесь подход принимает упорядоченную последовательность представлений. SfM из нескольких представлений требует соответствия точек между несколькими изображениями, называемым tracks. Типичным подходом является вычисление дорожек из парного соответствия точек. Можно использовать imageviewset
управлять попарными соответствиями и находить дорожки. Каждая дорожка соответствует 3-D точке в сцене. Чтобы вычислить 3-D точки из треков, используйте triangulateMultiview
. Точка 3-D может храниться в worldpointset
объект. The worldpointset
объект также сохраняет соответствие между точками 3-D и 2-D точками изображения между полями зрения камеры.
Используя подход в SfM из двух представлений, можно найти положение камеры 2 относительно камеры 1. Чтобы расширить этот подход к нескольким видовым корпусам, найдите положение камеры 3 относительно камеры 2 и так далее. Относительные положения должны быть преобразованы в общую систему координат. Обычно все положения камеры вычисляются относительно камеры 1 так, чтобы все положения находились в одной системе координат. Можно использовать imageviewset
для управления положениями фотоаппарата. The imageviewset
объект хранит представления и связи между видами.
Каждая оценка положения камеры от одного представления до следующего содержит ошибки. Ошибки возникают из-за неточной локализации точек в изображениях, и из-за шумных соответствий и неточной калибровки. Эти ошибки накапливаются, когда количество представлений увеличивается, эффект, известный как drift. Один из способов уменьшить дрейф - уточнить положения фотоаппарата и 3-D местоположения точек. Нелинейный алгоритм оптимизации, называемый bundle adjustment, реализован bundleAdjustment
функция, может использоваться для уточнения. Можно исправить положения камеры и уточнить только 3-D местоположения точек, используя bundleAdjustmentMotion
. Можно также исправить положения камеры и уточнить только местоположения 3-D, используя bundleAdjustmentStructure
.
Другой способ уменьшения дрейфа - это использование pose graph optimization по imageviewset
объект. После обнаружения замыкания цикла добавьте новое соединение к imageviewset
и использовать optimizePoses
функция для уточнения положений камеры, ограниченных относительными позами.
В примере «Структура из движения из двух видов» показано, как восстановить 3-D сцену из последовательности 2-D видов. Пример использует приложение Camera Calibrator, чтобы калибровать камеру, которая принимает представления. Он использует imageviewset
объект для хранения данных, связанных с каждым видом, и управления ими.
Пример Monocular Visual Simultaneous Localization and Mapping показывает, как обработать данные изображения с монокулярной камеры, чтобы создать карту комнатного окружения и оценить движение камеры.
bundleAdjustment
| bundleAdjustmentMotion
| bundleAdjustmentStructure
| cameraMatrix
| estimateFundamentalMatrix
| matchFeatures
| pointTrack
| relativeCameraPose
| triangulateMultiview