Маногаров А.И., Омельченко А.Н., к.т.н. Парфенова И.А., Хилько Е.А., Цой Д.Д., Дробязко А.Н.

Кубанский государственный университет, Россия

Разработка программного кода бесконтактного активного 3D-сканера

 

Сканирование объектов для получения их 3D-моделей становится всё более доступным. Создано множество контактных и бесконтактных 3D-сканеров, но цена этих устройств велика, а точность и скорость работы не всегда устраивает пользователя. В связи с этим возникает необходимость разработки доступных программных кодов для распространенных аппаратных средств. В Кубанском государственном университете разрабатывается бесконтактный активный 3D-сканер используемый совместно с устройством, выпущенным компанией Microsoft для игровой приставки Xbox. Kinect сенсорный игровой контроллер, первоначально представленный для консоли Xbox 360.

Kinect включает в себя: инфракрасный излучатель, инфракрасный приёмник, цветную камеру, набор из 4 микрофонов, корректировщик наклона (±27°) по вертикали. Благодаря ИК-сенсорам Kinect может получать трёхмерное изображение при любом естественном освещении. Сенсор подключается к компьютеру через USB, одновременно можно подключить до четырех сенсоров. Диапазон рабочих расстояний от 0.5 до 3 метров.

При написании программного кода нами использовалась PCL (Point Cloud Library) – открытая библиотека для обработки 3D геометрии, содержащая алгоритмы фильтрации, функции оценки, реконструкции поверхности, регистрации, подгонки моделей, сегментации. Данные от 3D-камеры образуют облако точек, т.е. структуру данных, используемых для представления набора многомерной точки (обычно используется для представления трехмерных данных).

В 3D облако точек представляют точки X, Y, Z и геометрические координаты основной поверхности. Назначив цвет для оси Z, облака точек могут быть использованы для создания изображения карты глубины. Облако точек имеет разрешение 640х480, а глубина кодируется 11-ю битами.

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

На следующем шаге определяем смещение камеры в пространстве относительно предыдущего фрейма. Для этого используем ICP – Iterative Closet Point – алгоритм, использующийся для сведения к минимуму разницы между двумя облаками точек, обрабатывая два облака точек – с текущего и предыдущего кадров глубины, а также знание о предыдущей позиции камеры в глобальном пространстве. Здесь надо принять во внимание используемое упрощение – расхождение между двумя фреймами глубины будут незначительны из-за особенностей kinect. Это позволяет использовать в ICP не облака точек, а их проективную проекцию на матрицу глубины. В качестве результата на этом шаге получаем матрицу преобразования, характеризующую положение камеры в глобальном пространстве. Эта матрица аккумулирует в себе данные полученные не только с текущей карты глубины, но и ее масштабированных вариаций, полученных на первом шаге – т.е. ICP пробегается по всем вариантам матрицы глубины и аккумулирует данные в единой матрице преобразования. Зная положение камеры в глобальном пространстве, можно перевести показания камеры с текущего кадра глубины в нашу общую «картину мира» представляемую в программе в виде функции особого вида – TSDF. Перед этим этапом производится проверка – изменила ли камера свое положение по сравнению с предыдущими замерами (небольшие сдвиги не принимаются во внимание) – на основе метода Родригеса и матриц преобразования на текущем и предыдущем шаге. В качестве результата имеем обновленное представление глобальной сцены в виде TSDF функции. Данные этой функции хранятся в виде воксельной сетки. Функция представляет физическое пространство как куб, по  умолчанию размером 3 метра, и разделяет его в воксельные сетки с определенным количеством вокселей на ось, равным в нашем случае 512. Отношение размера куба в метрах и количества вокселей на ось дают разрешение нашего куба. Качество модели пропорционально этим двум параметрам. Тем не менее, их модификации непосредственно отражаются на объеме используемой памяти. Функция TSDF имеет значение, соответствующее величине расстояния до ближайшего пересечения нулевой линии.

Результаты усреднения TSDF в нескольких 3D облаках точек выстраиваются в глобальный кадр и являются глобальным объединением. На момент извлечения данных сетка исследуется в направлении спереди назад, а значения функции TSDF проверяются для каждого вокселя. В памяти GPU функция TSDF хранится как матрица из чисел в диаппазоне от –1 до 1. Каждый элемент в матрице представляет собой воксель, а значение в нем представляет значение TSDF. Этим значение является расстояние до ближайшей изоповерхности. Функция имеет положительное значение, когда мы «снаружи» поверхности, а отрицательное значение, когда внутри. Во время использования данных, полученных функцией, мы игнорируем воксели со значением 1, так как они представляют пустое пространство, и, следовательно, не относятся к нашей модели.

Последний шаг это восстановление общей сцены. Для рендеринга используется метод бросания лучей “ray casting“. Сцена строится на основе замеров пересечения лучей с визуализируемой поверхностью. Каждый луч – направление взгляда с определенной точки на воксельный куб. Каждое ядро GPU занимается поиском вокселя, сквозь который проходит луч, в котором, при этом, значения TSDF функции меняет знак, т.е. там находится некоторая поверхность.

Разработанное программное обеспечение для контроллера Kinect позволяет использовать его как сканер 3D моделей и сцен.