Стереоизображение/построение карты глубины

Содержание лекции:

1. Физиология бинокулярного зрения

2. Стереоизображение

3. Определение расстояния до объектов

4. Готовый алгоритм на OpenCV


1. Физиология бинокулярного зрения

 Бинокулярное зрение - это способность человека видеть один предмет одновременно двумя глазами.

При этом изображение данного предмета воспринимается как объёмное.

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

Что помогает видеть объёмное изображение?

Что же помогает человеческому мозгу, обрабатывая изображения с обоих глаз, понимать, что изображение объёмное?

  1. Первое - это разница в углах обзора. Смотря на определённый объект, человек видит его разными глазами с разных сторон.
  2. Эффект параллакса - эффект, при котором объект будто перемещается, в зависимости от того, каким глазом мы на него смотрим, а также в зависимоти от расстояния до глаза. Этот эффект можно увидеть, проезжая на транспорте - объекты вдали движутся медленнее, чем объекты в близи. Также этот эффект можно увидеть, если закрыть один глаз, вторым посмотреть на объект, затем закрыть объект пальцем, закрыть глаз и открыть другой глаз: будет ощущение, будто объект выезжает из-за пальца.
  3. Изменение перспективы во время движения - когда мы меняем своё положение относительно объекта, то начинаем видеть объект с другой стороны.
  4. Относительное расположение объектов:
  • Перекрытие объектов - более близкие к нам объекты перекрывают более отдалённые.
  • Тени - объекты отбрасывают тени, при этом тени как помогают лучше понять форму объекта, так и определить положение одних объектов относительно других, а также определить расположение источника света и соотв. расположение объекта относительно источника света.

2. Стереоизображение

Что такое стереоизображение?

Ощутить объём в цифровом его представлении помогают стереоизображения, то есть изображения вызывающие иллюзию объёма.

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



Виды стереоизображений

1. Голографическое изображение - кто встречал голографические изображения, ставьте плюс в чат. Это изображение, которое создаётся с помощью специального оборудования, использующего метод регистрации информации, основанный на интерференции волн или проще говоря - лазера. Такое изображение наносится на специальный материал и позволяет сохранить информацию об объёме с разных ракурсов.

2. Стереопары - скорее всего этот тот вид стереоизображений, с которым многие знакомы, так как используется для 3D-фильмов. Выделяют 3 вида сетеропар:

  • Параллельная - изображения располагаются горизонтально друг относительно друга, при этом левое изображение соответствует левому глазу, а правое - правому. Вы можете увидеть эффект 3D, если попробуете посмотреть сквозь изображение.
  • Перекрёстная - изображение также располагаются горизонтально, но правое соответствует левому глазу и наоборот. Здесь нужно скосить глаза, посмотреть на нос, чтобы увидеть объёмное изображение.
  • Вертикальная - изображения располагаются вертикально друг относительно друга.
  • Стереопары - это скорее способ хранения стереоизображений, так как при просмотре фильмов изображения накладываются друг на друга и для получения эффекта объёма используется напр. поляризация.

3. Анаглифное изображение - другой популярный вид стереоизображений - анаглифные изображения, знакомые скорее более старшему поколению. Здесь объёмное изображение представлено одним изображением. С помощью оттенков синего и красного задаётся объём и для просмотра объёмного изображения используются специальные очки с цветными стёклами. Цвета могут использоваться и другие. При использовании такого вида стереоизображений сложнее передать цвет объектов, т. к. разные цветные стёкла фильтруют разные цвета.

4. Автостереограмма - следующий популярный вид стереоизображений. Когда я говорил выше о том, что нужно посмотреть сквозь картинку, чтобы увидеть объёмное изображение для параллельной стереопары, возможно кто-то подумал об автостереограмме. Автостереограмма - это способ кодирования объёмных изображений. Автостереограммы проще просматривать без специального оборудования, пытаясь вглядеться сквозь изображение, т. к. расстояние м/у кодирующими полосами меньше. Попробую рассмотреть эту стереограмму и скажите, что на ней изображено?

5. Псевдостереоскопия - следующий интересный вид стереоизображений - это псевдостереоскопия. Объём можно показать с помощью анимации, быстро перемещая ракурс на небольшое расстояние и обратно.

3. Определение расстояния до объектов

Что такое карта глубины/Depth Map?

Двумерная матрица, соответствующая изображению, значения которой показывают расстояние от камеры до объекта. Обычно, размер карты глубины, также соответствует размеру изображения.

Как построить карту глубины?

  1. Снять два изображения с двух заданных ракурсов съёмки.
  2. Создать модель стереоизображения на основе параметров заданных ракурсов.
  3. Найти ключевые точки на изображениях.
  4. Сопоставить ключевые точки.
  5. Вычислять расстояние на основе модели стереоизображения.

Готовые устройства

1. Откалиброванные камеры.

2. Structured Light Sensor.

3. ИК:

  • Time-of-flight - времяпролётная.
  • Lidar - стандарт для беспилотных автомобилей:
  • Несканирующий.
  • Сканирующий.

4. Пленоптические камеры.

Применение карты глубины

1. Обнаружение контуров объектов.

2. 3D-реконструкция сцены.

3. Навигация для умных автомобилей.

4. Распознавание лиц - карта глубины для распознавания лиц может использоваться, так позволяет получить более точную геометрию, которая меньше зависит от особенностей освещения.

5. Распознавание позы.

4. Готовый алгоритм на OpenCV

Вычисление карты смещений

Вычисление карты смещений по стереоизображению с помощью метода compute класса cv2.StereoBM.

Disparity Map - карта смещений.

Вычисление карты смещений по стереоизображению с помощью метода compute класса cv2.StereoBM:

stereo = cv2.StereoBM_create(numDisparities=16, blockSize=15)

disparity_map = stereo.compute(image_left, image_right)

image_left и image_right - параллельная стереопара.

Спецификация cv2.StereoBM_create

StereoBM_create([, numDisparities[, blockSize]]) -> stereo

numDisparities - кол-во искомых несоответствий, должно делиться на 16.

blockSize - размер блока, нечётное число.

stereo - объект класса cv2.StereoBM.

Зависимость от количества смещений

От количества смещений изменяется количество слоёв. Количество несоответствий меняется незначительно при увеличении количества слоёв. Выделяются отдельные мелкие детали, то есть многие объекты остаются на одном слое, но для мелких деталей появляются отдельные слои.

Зависимость от размера блока

В зависимости от размера блока меняется плавность получающихся несоответствий. При малом размере блоков становится заметна зернистость, при этом становится сложно определить отдельные объекты.

При большом размере блока зернистость пропадает, объекты выделяются плавно, при этом в отдельное несоответствие могут попадать мелкие детали от других объектов, то есть точность результата падает.

Размер блока влияет на получаемую карту смещений:

  1. Размер больше - смещения получаются более плавными, но менее точными.
  2. Размер меньше - результат получается более детальным, но могут быть ложные обнаружения смещений.

Вычисление карты глубины

Карта глубины зависит от расстояния м/у камерами - B и фокусного расстояния - f:

depth_map[y, x] = B * f / disparity_map[y, x].

Практическое задание:
Построить карту высот для двух предложенных изображений из методических материалов лекции
Домашнее задание:
Построить карту высот для двух фотографий, снятых на одну камеру. Фотографии необходимо снять самостоятельно.

Завершить и продолжить  
Обсуждение

1 Комментарии