3D-зрение: стерео, depth-камеры, SLAM и 3D-реконструкция
В предыдущих статьях курса мы разобрали, как качество данных зависит от камеры и пайплайна (калибровка, синхронизация, поток), а также как решаются базовые 2D-задачи (детекция, сегментация, трекинг). Теперь делаем следующий шаг: переходим от картинок к геометрии.
3D-зрение отвечает на вопросы, которые 2D-методы не закрывают напрямую:
где объект находится в метрах, а не в пикселях;
как устроена сцена целиком;
как перемещалась камера в пространстве.Эта статья вводит практический минимум по стерео, depth-камерам, SLAM и 3D-реконструкции. Позже эти знания понадобятся и для блока про диффузионные модели: синтетика часто генерируется в 3D-движке, а затем рендерится под конкретную камеру, и без понимания геометрии сложно контролировать реализм и перенос в реальный мир.
От 2D к 3D: какие данные бывают и что из них можно восстановить
В 3D-пайплайнах чаще всего встречаются три типа входных данных:
стереопара (две RGB-камеры с известным взаимным положением);
RGB-D (RGB + карта глубины от depth-сенсора);
монокулярное видео (одна камера, глубину и движение нужно оценивать косвенно).Главная идея: 3D получается только если у вас есть геометрическое ограничение.
В стерео геометрия появляется из-за двух точек зрения.
В depth-камере глубина измеряется сенсором.
В монокулярном видео геометрия появляется из движения камеры и устойчивых визуальных признаков.!Сравнение источников 3D-информации и откуда берётся геометрия
Базовая геометрия камеры: из пикселя в луч и обратно
Чтобы работать с 3D, нужно уметь переходить между 2D и 3D. Это опирается на калибровку из статьи про девайсы.
Проекция 3D-точки в пиксель
Для калиброванной камеры 3D-точка в координатах камеры проецируется в пиксель так:
Пояснение всех частей формулы:
это координаты точки в системе координат камеры.
это глубина: расстояние вдоль оптической оси камеры.
Деление и означает перспективу: дальние объекты выглядят меньше.
это координаты точки на изображении в пикселях.
это матрица внутренних параметров (intrinsics), которая переводит нормированные координаты в пиксели.
Символ означает равенство с точностью до масштаба в однородных координатах.Практический вывод: без вы не получите метры из пикселей.
Обратная задача: из пикселя в 3D-точку
Один пиксель задаёт луч в 3D, но не задаёт конкретную точку на луче. Чтобы получить точку, нужна глубина.
Если у нас есть глубина для пикселя , то 3D-точка в координатах камеры вычисляется так:
Пояснение:
это фокусные расстояния в пикселях.
это координаты оптического центра.
и это сдвиг относительно центра.
это глубина (в метрах или миллиметрах, зависит от сенсора и формата).Это базовая операция для построения point cloud из RGB-D.
Стереозрение: диспаратность и триангуляция
Стерео использует два изображения одной сцены, снятые с небольшим смещением (базой). После стереокалибровки и ректификации соответствующие точки на левом и правом кадре лежат на одной строке, и задача упрощается до поиска горизонтального смещения.
Диспаратность
Диспаратность это сдвиг одной и той же точки между левым и правым изображением (в пикселях). Если точка на левом изображении имеет координату , а на правом , то:
Интуиция:
ближние точки имеют большой сдвиг, значит большой ;
дальние точки имеют маленький сдвиг, значит маленький .Глубина из диспаратности
Для ректифицированного стерео глубина считается так:
Пояснение:
это глубина до точки.
это фокусное расстояние в пикселях (часто используют ).
это база стереопары (расстояние между центрами камер) в метрах.
это диспаратность в пикселях.Практические следствия (важны для инженерии):
при маленьком (дальние объекты) ошибка глубины резко растёт;
увеличение базы улучшает точность вдали, но ухудшает работу на близких расстояниях и усложняет поиск соответствий;
ошибки ректификации и синхронизации прямо превращаются в ошибку , а значит и .!Интуитивная схема, откуда берётся глубина в стерео
Поиск соответствий: что реально ломает стерео
Стерео требует, чтобы алгоритм нашёл соответствующие пиксели на двух изображениях. Это плохо работает в случаях:
однотонные поверхности без текстуры;
повторяющиеся паттерны (решётки, окна, плитка);
бликующие и прозрачные объекты;
движение объектов и рассинхронизация камер;
сильная компрессия видео.Если вы делаете систему “на девайсе”, возвращайтесь к статье про поток и синхронизацию: стерео почти всегда требует строгих таймстемпов и минимального джиттера.
Практические инструменты
Для стереокалибровки, ректификации и базовых алгоритмов диспаратности: OpenCV calib3dDepth-камеры и RGB-D: чем отличаются и где ловушки
Depth-камера даёт карту глубины напрямую: значение в пикселе это расстояние до поверхности.
Основные семейства depth-сенсоров:
stereo-based (активное стерео, иногда с подсветкой);
structured light (проекция паттерна и анализ деформации);
ToF (time-of-flight, измерение времени пролёта света).Для практики важно не “как это устроено физически”, а какие ошибки это даёт в данных.
Типичные артефакты depth
дыры (missing depth) на глянцевых, чёрных, прозрачных поверхностях;
шум, растущий с расстоянием;
смещение границ из-за разной оптики RGB и depth;
мультипути (особенно в ToF) в узких пространствах и около отражающих поверхностей.Совмещение RGB и depth
Почти всегда RGB-камера и depth-камера физически разнесены, поэтому нужно приводить данные к общей системе координат.
На практике у вас есть два корректных подхода:
Проецировать depth в систему RGB, чтобы получить RGB-D в координатах RGB.
Проецировать RGB в систему depth, если дальнейшая обработка идёт в depth-разрешении.Ключевой момент из статьи про девайсы: без extrinsics между RGB и depth выравнивание будет неверным.
Инструменты и SDK:
Для примера реального RGB-D устройства и типовой модели данных: Intel RealSense SDK3D-представления: point cloud, mesh, voxel
3D-данные можно хранить по-разному. Выбор представления влияет на скорость, качество и дальнейшие алгоритмы.
Point cloud
Point cloud это набор 3D-точек, иногда с цветом.
Плюсы: простой, естественный формат для RGB-D и LiDAR.
Минусы: нет явных поверхностей, сложнее получать “целостные” модели.Mesh
Mesh это вершины + полигоны (обычно треугольники), образующие поверхность.
Плюсы: удобен для визуализации, симуляции, 3D-печати.
Минусы: построение из шумных данных нетривиально.Voxel и TSDF
Voxel grid дискретизирует пространство на кубики.
Практически важный вариант: TSDF (truncated signed distance function), где в каждом вокселе хранится приближённое расстояние до поверхности. На TSDF удобно делать слияние множества depth-кадров в единую модель.
!Как одно и то же 3D можно представлять разными способами
Практический инструмент для работы с этими форматами:
Библиотека для point cloud и 3D-геометрии: Open3DОценка позы камеры: что такое R и t на практике
Почти в любой 3D-задаче нужно знать, где находилась камера при съёмке. Поза камеры обычно записывается как поворот и сдвиг .
отвечает за ориентацию камеры.
отвечает за положение камеры.Они используются, чтобы переводить точки между системами координат:
Пояснение:
это 3D-точка в координатах мира.
это та же точка в координатах камеры.
это матрица поворота.
это вектор сдвига.Эта формула лежит в основе реконструкции, SLAM и совмещения нескольких сенсоров.
SLAM: одновременная локализация и построение карты
SLAM (simultaneous localization and mapping) это класс методов, которые одновременно:
оценивают траекторию камеры;
строят карту среды.Зачем это нужно:
роботы и дроны (навигация);
AR (привязка виртуальных объектов к миру);
3D-сканирование;
стабилизация и метрическая аналитика в видео.Из чего состоит типичный визуальный SLAM
Почти любой практический SLAM содержит следующие компоненты:
визуальные признаки (ключевые точки и дескрипторы) или прямые методы по яркостям пикселей;
сопоставление наблюдений между кадрами;
оценка движения камеры между кадрами;
оптимизация (сглаживание ошибок по множеству кадров);
замыкание циклов (loop closure), чтобы исправлять накопившийся дрейф.!Высокоуровневая структура SLAM и где появляется карта
Дрейф и замыкание циклов
Если камера долго движется, маленькие ошибки в оценке движения накапливаются, и траектория “уплывает”. Это дрейф.
Loop closure пытается распознать, что камера вернулась в уже виденное место, и использовать это как сильное ограничение, чтобы подтянуть всю траекторию и карту.
Visual SLAM vs Visual-Inertial SLAM
Если у вас есть IMU (гироскоп и акселерометр), вы можете стабилизировать оценку движения.
Visual SLAM хорошо работает при достаточном количестве текстуры и не слишком резких движениях.
Visual-Inertial SLAM устойчивее к быстрому вращению и временному ухудшению визуального сигнала.Это напрямую связано со статьёй про синхронизацию: камера и IMU требуют точного сопоставления по времени.
Практические реализации
Современная реализация визуального и визуально-инерциального SLAM: ORB-SLAM33D-реконструкция: от набора кадров к модели сцены
3D-реконструкция это построение 3D-модели сцены по множеству изображений.
Есть два распространённых сценария:
offline-реконструкция по набору фото (часто это SfM + MVS);
online-реконструкция по RGB-D/стерео в реальном времени (часто это SLAM + fusion).SfM и MVS: классический offline-пайплайн
SfM (structure-from-motion) и MVS (multi-view stereo) часто идут вместе:
SfM оценивает позы камер и разреженную структуру.
MVS уплотняет реконструкцию до плотной поверхности.Практический инструмент, который часто используется в индустрии и исследованиях:
Полный пайплайн реконструкции: COLMAPЧто важно для данных (связь с первой статьёй про датасеты):
не должно быть сильного motion blur;
должны быть перекрытия между кадрами;
желательно фиксировать экспозицию/баланс белого, чтобы упростить сопоставление;
избегайте “идеально одинаковых” кадров: они не добавляют геометрии, но увеличивают объём.Online-fusion для RGB-D
Если у вас RGB-D поток и поза камеры (из SLAM или внешней системы), вы можете сливать глубины в единый объём (например, TSDF), а затем извлекать поверхность.
Типовые проблемы на практике:
ошибка позы даёт “двойные стены” и раздвоение поверхности;
depth-артефакты дают дыры и шум;
неправильные intrinsics/extrinsics ломают геометрию по краям.Как 2D-детекция и сегментация помогают 3D
Связь с предыдущей статьёй (детекция/сегментация/трекинг) очень практическая: 3D-пайплайны часто используют 2D-модели как подсказки.
Примеры:
маски позволяют строить 3D только по нужным объектам и не засорять карту фоном;
детекции помогают искать соответствия только в области объекта;
трекинг ID помогает поддерживать “объектную карту”, а не просто геометрию.В то же время есть риск: если 2D-модель ошибается систематически, 3D-часть начнёт “цементировать” эти ошибки в карте.
Мини-чеклист качества для 3D-проектов
Перед тем как “чинить алгоритм”, проверьте фундамент:
калибровка выполнена на том же разрешении и с теми же настройками фокуса;
выравнивание RGB-depth проверено визуально на границах объектов;
синхронизация подтверждена таймстемпами и тестом на быстрых движениях;
логирование сохраняет intrinsics/extrinsics, FPS, timestamp, пропуски кадров;
данные содержат достаточный параллакс (иначе реконструкция вырождена).Что дальше по курсу
Следующий логический шаг после 3D-зрения это переход к генеративным моделям, которые помогают в CV не только “рисовать картинки”, но и закрывать дефицит данных:
как диффузионные модели генерируют реалистичные изображения и разметку;
как делать синтетические датасеты под конкретную камеру, включая дисторсию, шум, компрессию и даже domain shift;
как проверять, что синтетика действительно улучшает 2D и 3D метрики, а не создаёт иллюзию качества.