Глубина и обратная проекция

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

Однако что, если мы хотим сделать обратное ? То есть мы хотим восстановить и реконструировать сцену, используя только 2D-изображение. Для этого нам нужно знать глубину или Z-компонент каждого соответствующего пикселя. Глубину можно представить в виде изображения, как показано на рис. 2 (в центре). С более яркой интенсивностью, обозначающей точку дальше.

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

Сложность рассуждений в перспективе

Рассмотрим рис. 2 выше, учитывая только изображение RGB. Трудно сказать, каково абсолютное расстояние между двумя машинами на левой полосе. Кроме того, мне, безусловно, трудно понять, действительно ли деревья слева очень близко или они очень далеко от дома. Вышеупомянутый феномен является следствием перспективной проекции, которая требует от нас полагаться на различные подсказки, чтобы правильно оценить расстояние. В этом посте я обсуждал некоторые проблемы с перспективностью, которые могут вас заинтересовать :)

Однако, если бы мы перепроецировали его обратно в 3D с помощью карты глубины (рис. 2. справа), мы могли бы точно расположить деревья и почувствовать, что они фактически удалены от здания. Да, мы действительно плохо понимаем относительную глубину, когда объект скрывается за другим объектом. Главный вывод из этого - смотреть только на изображения, трудно различить глубину.

Проблема оценки глубины - это постоянное исследование, которое с годами хорошо продвигается. Было разработано много техник, и наиболее успешные методы основаны на определении глубины с помощью стереозрения [1]. А в последние годы оценка глубины с использованием глубокого обучения показала невероятную производительность [2], [3].

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

Центральная проекция модели камеры-обскуры

Прежде всего, понимание геометрической модели проекции камеры служит основной идеей. Что нас в конечном итоге интересует, так это глубина, параметр Z. Здесь мы рассматриваем простейшую модель камеры-обскуры без коэффициента перекоса или искажения.

Трехмерные точки отображаются на плоскость изображения (u, v) = f (X, Y, Z). Полная математическая модель, описывающая это преобразование, может быть записана как p = K [R | t] * P.

куда

  • p - проецируемая точка на плоскости изображения
  • K - внутренняя матрица камеры
  • [R | t] - внешние параметры, описывающие относительное преобразование точки в мировом кадре в кадр камеры.
  • P, [X, Y, Z, 1] представляет трехмерную точку, выраженную в предопределенной мировой системе координат в евклидовом пространстве.
  • Масштабирование соотношения сторон, s: управляет масштабированием пикселей по осям x и y при изменении фокусного расстояния.

Матрица внутренних параметров

Матрица K отвечает за проецирование трехмерных точек на плоскость изображения. Для этого необходимо определить следующие количества как

  • Фокусное расстояние (fx, fy): измерьте положение плоскости изображения относительно центра камеры.
  • Главная точка (u0, v0): оптический центр плоскости изображения.
  • Фактор перекоса: смещение от квадратного пикселя, если оси плоскости изображения не перпендикулярны. В нашем примере это значение равно нулю.

Наиболее распространенный способ решения всех параметров - метод шахматной доски. Когда несколько соответствий 2D-3D получают путем сопоставления и решения неизвестных параметров с помощью PnP, прямого линейного преобразования или RANSAC для повышения надежности.

Определив все неизвестные, мы можем, наконец, приступить к восстановлению трехмерных точек (X, Y, Z), применив обратное.

Обратное проецирование

Рассмотрим уравнение на рис. 4. Предположим, что (X, Y, Z, 1) находится в системе координат камеры. т.е. нам не нужно рассматривать внешнюю матрицу [R | t]. Расширение уравнения даст как

Трехмерные точки могут быть восстановлены с помощью Z, заданного картой глубины и решения для X и Y. Затем мы можем дополнительно преобразовать точки обратно в мировую рамку, если это необходимо.

Пример обратной проекции

Давайте рассмотрим простой пример, чтобы усвоить концепции. Мы будем использовать изображение RGB и глубины, как показано на рисунке 1. Изображения получены с камеры, установленной на автомобиле в симуляторе CARLA. Карта глубины хранится как float32 и кодирует максимум 1000 м для значений глубины на бесконечности.

Внутренние параметры из поля зрения

Вместо определения внутренних параметров с помощью шахматной доски можно рассчитать фокусные расстояния и оптический центр для модели камеры-обскуры. Необходимая информация - это высота и ширина датчика изображения в пикселях и эффективное поле обзора в вертикальном и горизонтальном направлениях. Обычно их предоставляет производитель камеры. В нашем примере мы будем использовать + -45 градусов как в вертикальном, так и в горизонтальном направлении. Мы установим масштабный коэффициент равным 1.

Ссылаясь на рис. 3, фокусные расстояния (fx, fy) и главная точка (u0, v0) могут быть определены с помощью простой тригонометрии. Я оставляю это на ваше усмотрение, чтобы вывести его в качестве упражнения, или вы можете найти его в коде!

Теперь мы можем вычислить обратное следующим образом

  • Получить внутренние параметры камеры, K
  • Найдите обратное к K
  • Примените уравнение на рис. 5 с Z как глубину из карты глубины.
# Using Linear Algebra
cam_coords = K_inv @ pixel_coords * depth.flatten()

Более медленный, но более интуитивно понятный способ написания шага 3 -

cam_points = np.zeros((img_h * img_w, 3))
i = 0
# Loop through each pixel in the image
for v in range(height):
    for u in range(width):
        # Apply equation in fig 5
        x = (u - u0) * depth[v, u] / fx
        y = (v - v0) * depth[v, u] / fy
        z = depth[v, u]
        cam_points[i] = (x, y, z)
        i += 1

Вы получите такие же результаты!

Заключение

Вот и все, я ознакомился с основными концепциями, необходимыми для создания обратной проекции.

Обратное проецирование в 3D формирует основу реконструкции 3D-сцены с помощью Structure form Motion, где несколько изображений захватываются с движущейся камеры, а также ее глубина известна или вычислена. После этого выполняется сопоставление и сшивание, чтобы получить полное представление о структуре сцены.



Ортогональная проекция: вид сверху (необязательно)

С точками, представленными в 3D, одно интересное приложение - проецировать их на вид сверху вниз. Обычно это удобное представление для мобильных роботов, так как расстояния между препятствиями сохраняются. Кроме того, его легко интерпретировать и использовать для выполнения задач планирования пути и навигации. Для этого нам нужно знать систему координат, в которой ссылаются точки.

Мы будем использовать правую систему координат, как определено ниже.

В этом простом примере, на какую плоскость, по вашему мнению, следует проецировать точки?

Если ваше предположение находится в плоскости y = 0, вы правы, поскольку y представляет высоту, определенную системой координат камеры. Мы просто сворачиваем компонент y в матрице проекции.

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

Ссылка

[1] Хиршмюллер, Х. (2005). Точная и эффективная стереообработка за счет полуглобального сопоставления и взаимной информации. CVPR

[2] Тинхуэй Чжоу, Мэтью Браун, Ной Снавли и Дэвид Лоу. Неконтролируемое изучение глубины и движения эго из видео. В CVPR, 2017 г.

[3] Клемент Годар, Ойсин Мак Аода и Габриэль Дж. Бростоу. Неконтролируемая оценка глубины монокуляра с последовательностью слева направо. В CVPR, 2017.