Давайте воспользуемся мощными возможностями векторизации NumPy для переключения между 2D-сферическими изображениями и 3D-облаками точек.

1. Облака точек и сферические изображения

Введение

Используя двойственность между 3D-облаками точек и 2D-сферическими цветными изображениями, мы можем объединить надежные алгоритмы 3D-реконструкции с мощными методами обнаружения 2D-объектов.

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

Давайте установим точное определение объектов, о которых мы говорим:

Трехмерное облако точек

  • он обеспечивает прямое представление пространственного расположения сцены
  • каждая точка определяется своими трехмерными пространственными координатами (x, y, z)
  • дополнительные атрибуты, такие как цвет, интенсивность или другие свойства, могут быть связаны с каждой точкой

2D-сферическое изображение

  • Он обеспечивает панорамный вид сцены, охватывая широкое поле зрения во всех направлениях вокруг центральной точки обзора. Например, это могут быть две камеры рыбий глаз, расположенные спина к спине (см. мою предыдущую статью на Medium Понимание 360-градусных изображений 🌎)
  • Каждый пиксель определяется своими 2D-координатами (широта φ, долгота θ) и относится к определенному направлению взгляда, как на поверхности земли.

Скрытый потенциал 2D-алгоритмов в 3D-сфере

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

Имея это в виду, Флоран Поукс, доктор философии, недавно продемонстрировал умный маневр: использование модели Meta Segment Anything Model (SAM) для сегментации трехмерного облака точек.

В следующих разделах мы определим основные функции для облегчения двунаправленного преобразования информации между 2D- и 3D-областями.

2. От (x,y,z) до (φ,θ,r)

Сферические координаты

В этом разделе глобальные декартовы координаты (x, y, z) будут преобразованы в локальные сферические координаты (φ, θ, r).

Углы φ и θ соответствуют соответственно строкам и столбцам двумерного сферического изображения, а радиус r относится к расстоянию, с которого наблюдается точка, т. е. к ее глубине.

Примечание. Для простоты будем считать, что сферические координаты расположены в начале системы отсчета. Однако к облаку точек можно применить перемещение/поворот перед преобразованием координат для рендеринга из любой желаемой позы (см. мою предыдущую статью Преобразование поз камеры из OpenCV в OpenGL может быть простым).

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

Код Python

Начнем с того, что мы используем приведенное выше уравнение для преобразования декартовых координат в сферические. Вход, xyz, представляет собой массив numpy с плавающей запятой формы (N,3), содержащий вершины облака точек.

Затем мы преобразуем углы (φ, θ) в фактические координаты в пикселях на сферическом изображении. Высота и ширина входных параметров соответствуют форме сферического изображения и используются для масштабирования координат.

Поскольку высота изображения составляет 180°, то есть сверху вниз, а ширина изображения составляет 360°, сферическое изображение всегда имеет соотношение сторон 2, то есть width=2*height.

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

3. Раскрашиваем облако точек из сферического изображения

Код Python

Этот раздел направлен на определение цветов вершин облака точек, используя информацию о цвете, присутствующую в сферическом изображении.

Как обычно с numpy, мы должны тщательно спланировать наш подход к выборке наших массивов, чтобы обеспечить оптимальную производительность. Ниже приведены некоторые примеры концепций, выполнение которых может привести к медленным результатам:

  • Итерация по координатам (u,v) с использованием цикла for Python
  • Сохраните для каждого пикселя сферического изображения список, содержащий ids вершин, спроецированных на этот самый пиксель

Быстрый подход использует индексирование массива или нарезку массива на изображение с использованием координат (u,v) в качестве индексов.

Обратите внимание, что этот код не обрабатывает окклюзии и не окрашивает все вершины. Это можно легко исправить, сгенерировав двоичную маску, которая указывает видимость каждой вершины, тем самым предотвращая ее окрашивание, когда в этом нет необходимости. В следующем разделе объясняется процесс создания сферической карты глубины. Маска видимости может быть создана путем выборки карты глубины с использованием координат (u,v) и определения того, находятся ли значения r в допустимом диапазоне относительно этих глубин.

Примечание. Вместо округления координат (u, v) мы можем сохранить их как значения с плавающей запятой и использовать интерполяцию изображения для более точного определения цвета. Однако простая индексация массива больше не применима в этом сценарии. Чтобы решить эту проблему, мы могли бы предварительно увеличить сферическое изображение с помощью интерполяции или использовать схему интерполяции, такую ​​как scipy.interpolate.RectBivariateSplineили scipy.interpolate.RegularGridInterpolator.

Пример

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

Для этого облака точек из 250 000 точек и соответствующего ему сферического изображения размером 5 000 x 10 000 пикселей для запуска требуется около 15 мс.

(На 10 миллионов точек ушло около 750 мс).

4. Рендеринг сферического изображения из цветного облака точек

Код Python

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

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

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

Точно так же мы можем получить карту глубины без каких-либо дополнительных затрат.

Пример

В этом примере мы визуализируем сферическое цветное изображение и карту глубины цветного облака точек.

Для этого облака точек из 250 000 точек требуется около 30 мс для создания двух изображений ниже:

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

Заключение

Надеюсь, вам понравилось читать эту статью, и она дала вам больше информации о раскрашивании или рендеринге облаков точек!

Смотрите больше моего кода на GitHub.