Правительство Российской Федерации Федеральное государственное автономное образовательное учреждение высшего профессионального образования "Национальный исследовательский университет "Высшая школа экономики" Факультет Компьютерных наук Департамент программной инженерии ВЫПУСКНАЯ КВАЛИФИКАЦИОННАЯ РАБОТА по направлению 09.03.04 «Программная инженерия» подготовки бакалавра Программа трёхмерной реконструкции сцены по изображениям и данным сканирования глубины Студента группы №401ПИ ______________ Подпись Отменникова Льва Андреевича (Ф.И.О.) ________________ (Дата) Научный руководитель доцент департамента ПИ, к.т.н. (должность, ученая степень) _____________ Подпись Ахметсафина Римма Закиевна ( Ф.И.О.) ________________ (Дата) Москва, 2015 Аннотация Выпускная квалификационная работа – 31 страница, 3 главы, 7 рисунков, 5 приложений, 13 источников. Ключевые слова: 3D реконструкция, RGB-D камера, карта глубины, KinectFusion, Point Cloud Library. Широкое распространение и совершенствование устройств для трёхмерного сканирования сделало трёхмерную реконструкцию одной из самых актуальных задач компьютерной графики и компьютерного зрения. Распространение устройств, совмещающих в себе инфракрасный сенсор глубины и цветную камеру, таких как Microsoft Kinect, сделало трёхмерную реконструкцию доступным для большого числа пользователей. В данной работе рассматривается задача трёхмерной реконструкции с помощью таких устройств. Целью данной работы является создание приложения, позволяющего проводить трёхмерную реконструкцию сцены или объекта ограниченного объёма, включая реконструкцию поверхности и цвета. В данной работе рассмотрен и реализован представленный в 2014 году на конференции SIGGRAPH алгоритм Q.-Y. Zhou и V.Koltun, позволяющий существенно улучшить качество реконструкции цвета. Разработанное приложение может применяться пользователями OpenNI-совместимых камер с сенсором глубины для проведения трёхмерной реконструкции различных сцен, объектов, небольших помещений. Полученную цветную полигональную модель можно использовать или просматривать в других 3D приложениях. 2 Abstract Spreading of 3D scanning equipment has made three-dimensional reconstruction one of the most topical areas of computer graphics and computer vision. Devices similar to Microsoft Kinect made 3D reconstruction affordable for many users. This work considers the issue of 3D reconstruction using these devices. The objective of this work is to develop a program, which allows user to create a 3D reconstruction of scene or object of the restricted volume. The main feature of this work is the implementation of the novel color map optimization algorithm which has been presented at SIGGRAPH’14 by Qian-Yi Zhou and Vladlen Koltun. The application can be used for 3D reconstruction of scenes, objects and small indoor spaces with OpenNI compatible RGB-D cameras. The resulting reconstruction - polygonal 3D model - can be used in 3D modelers and other 3D applications. 3 Основные определения, термины и сокращения Трёхмерная (3D) реконструкция – реконструкция поверхности и внешнего вида некоторого объекта или сцены. В данной работе под трёхмерной реконструкцией понимается трёхмерная полигональная модель, задаваемая списком вершин и списком треугольных полигонов, где для каждой вершины определены координаты в трёхмерном пространстве и RGB цвет. RGB-D камера (Red-Green-Blue-Depth) – устройство, совмещающее в себе цветную (RGB) камеру и сенсор глубины (Depth). OpenNI (Open Natural Interaction) – Framework для взаимодействия с RGB-D камерами. Microsoft Kinect – сенсор движения, изначально разработанный как часть игровой консоли Xbox 360, ставший самостоятельным устройством – RGB-D камерой. KinectFusion – алгоритм трёхмерной геометрической реконструкции с помощью Kinect, разработан Microsoft Research. PCL (Point Cloud Library) – многофункциональная кроссплатформенная open-source библиотека для работы с облаками точек. KinFu – реализация алгоритма KinectFusion в библиотеке PCL. GPU (Graphics Processing Unit) –графический процессор. CPU (Central Processing Unit) – центральный процессор. TSDF (Truncated Signed Distance Function) – функция, значение которой обозначает расстояние от центра вокселя до предполагаемой поверхности, применяется в алгоритме KinectFusion. ICP (Iterative Closest Points) – итеративный алгоритм совмещения двух облаков точек, применяется в алгоритма KinectFusion. 4 Содержание Аннотация ........................................................................................................................................... 2 Abstract ................................................................................................................................................. 3 Основные определения, термины и сокращения............................................................................. 4 Введение .............................................................................................................................................. 7 1. Трёхмерная реконструкция сцены с использованием RGB-D камеры ................................. 9 1.1. RGB-D камера ...................................................................................................................... 9 1.2. KinectFusion ........................................................................................................................ 10 1.3. Программные продукты для трёхмерной реконструкции ............................................. 12 1.4. Проблемы при вычислении цвета вершин ...................................................................... 12 1.5. Выбор алгоритмов для реализации .................................................................................. 13 2. Алгоритмы трёхмерной реконструкции ..................................................................................... 14 2.1. Создание полигональной модели алгоритмом KinFu .................................................... 14 2.2. Вычисление цвета вершин полигональной модели ........................................................ 15 2.3. Алгоритм Q.-Y. Zhou и V.Koltun для вычисления цвета вершин модели .................... 16 2.3.1. Коррекция положения камеры .................................................................................. 17 2.3.2. Коррекция наложения изображения ......................................................................... 19 2.3.3. Преобразование изображений ................................................................................... 20 2.3.4. Псевдокод алгоритма вычисления цвета вершин ................................................... 21 2.4. 3. Отбор изображений ........................................................................................................... 22 Архитектура программы и особенности реализации ............................................................ 23 3.1. Выбранные инструменты .................................................................................................. 23 3.2. Архитектура приложения.................................................................................................. 23 3.3. Процесс реконструкции .................................................................................................... 25 3.3.1. Инициализация и геометрическая реконструкция .................................................. 25 3.3.2. Вычисление цвета вершин ......................................................................................... 27 5 3.4. Пример реконструкции ..................................................................................................... 27 Заключение........................................................................................................................................ 29 Список использованных источников.............................................................................................. 30 Приложения – том 2 6 Введение Трёхмерная реконструкция и трёхмерное сканирование в настоящее время быстро развиваются и находят широкое применение в робототехнике, медицине, производстве, 3D печати и 3D моделировании. Распространению применения трёхмерных реконструкций способствует повышение доступности устройств, пригодных для трёхмерного сканирования и печати, и применение новых алгоритмов трёхмерной реконструкции. Существует множество различных технологий, применяемых для трёхмерного сканирования. В основном применяются лазерные сканеры, позволяющие проводить реконструкцию с высокой точностью. Но лазерные сканеры являются дорогими устройствами, пока недоступными для обычных пользователей. Появление Microsoft Kinect – устройства, совмещающего в себе обычную RGB (Red-Green-Blue) камеру и сенсор глубины (Depth), использующий инфракрасный свет для получения информации о расстоянии до поверхности объекта – существенно расширило круг пользователей, имеющих возможности для трёхмерного сканирования. Распространение устройств, подобных Kinect, привело к повышению интереса к трёхмерному сканированию и к развитию новых алгоритм трёхмерной реконструкции. Несмотря на многочисленные недостатки сенсора, такие как невозможность его использования вне помещений, ограниченная дистанция применения, высокая погрешность измерений, невысокая стоимость привела к его широкому распространению. В связи с более высокой доступностью данных камер появились приложения, позволяющие использовать их для трёхмерной реконструкции. Несмотря на простоту пользовательского интерфейса и быстроту работы, эти приложения имеют ряд общих недостатков. Будучи сфокусированными главным образом на геометрической реконструкции, они уделяют меньше внимания точности передачи цвета сцены или объекта. Такие факторы как неточность наложения изображений на трёхмерную модель, искажения и размытия изображения отражаются на визуальном качестве реконструкции. Целью данной работы является разработка приложения для трёхмерной реконструкции сцены с помощью RGB-D камеры. Приложение должно использовать поток снимков глубины для построения полигональной модели сцены и поток цветных RGB снимков для реконструкции цвета вершин полигональной модели. В программе будет 7 применён недавно опубликованный алгоритм Q.-Y. Zhou и V. Koltun [13], позволяющий получить более качественную реконструкцию цвета по сравнению с существующими аналогами. Задачи данной работы: Изучение существующих решений, программных продуктов, применяющихся для трёхмерной реконструкции с помощью RGB-D камеры; Выбор технических средств, алгоритмов и инструментов разработки программы; Реализация программы для трёхмерной реконструкции сцены: o Реализация взаимодействия с RGB-D камерой; o Реализация геометрической реконструкции сцены; o Реализация алгоритма для вычисления цвета вершин модели; o Реализация пользовательского интерфейса; Разработка технической документации к программе. В первой главе данной работы описан процесс трёхмерной реконструкции с помощью RGB-D камер, рассмотрены программные продукты и алгоритмы, применяемые для трёхмерной реконструкции с помощью таких устройств. Во второй главе описаны алгоритмы, применяемые в разрабатываемом приложении: алгоритм KinectFusion и алгоритм Zhou&Koltun. В третьей главе дано описание реализации – использованные инструменты, архитектура и описание приложения и процесса трёхмерного сканирования с его помощью. 8 1. Трёхмерная реконструкция сцены с использованием RGB-D камеры 1.1. RGB-D камера А B C Рисунок 1. RGB-D камера Asus Xtion Pro Live. A- IR–прожектор, B - RGB–камера, C - IRкамера [5] Реконструкция сцены с использованием Red-Green-Blue-Depth (RGB-D) камер производится путём обработки данных поступающих с сенсора глубины и цветной камеры. Сенсор глубины работает следующим образом: прожектор излучает шаблон из инфракрасных точек на поверхность объекта. Инфракрасная камера создаёт снимок и преобразует его в карту глубины, в которой яркость каждого пиксела показывает расстояние от камеры до поверхности объекта. Рисунок 2. Инфракрасный шаблон точек, излучаемый прожектором камеры [5]. 9 С использованием внутренних параметров камеры (фокусного расстояния) снимок глубины преобразуется в облако точек, в котором каждой точке соответствуют координаты в 3D пространстве. Путём триангуляции облако точек преобразуется в полигональную модель. После наложения цветных изображений на полигональную модель получается трёхмерная реконструкция сцены. Данная технология не лишена недостатков. Во-первых, сенсор глубины работает на ограниченном диапазоне от 0,5 м до 3,5-4 м. Во-вторых, погрешность измерения растёт по мере удалённости от камеры и составляет около 3 см на расстоянии 4 м [5]. Эти факторы сильно ограничивают применимость алгоритмов реконструкции, основанных на использовании небольшого количества снимков. Для реконструкции с использованием таких устройств применяются алгоритмы, обрабатывающие последовательный поток снимков глубины, что позволяет компенсировать погрешность измерения большим количеством данных. 1.2. KinectFusion Алгоритм KinectFusion разработан Microsoft Research и опубликован в 2011 году, вскоре после появления Kinect [4]. В опубликованной статье описан алгоритм для трёхмерной реконструкции сцены по потоку снимков глубины и использовании реконструкции для проектирования взаимодействия модели с пользователем. Алгоритм представляет сканируемое пространство как воксельный объём, внутри которого проводится реконструкция. Качество геометрической реконструкции зависит от разрешения воксельной сетки, разбивающей объём на отдельные воксели. После инициализации на первом снимке глубины проводится отслеживание смещения камеры относительно реконструируемой модели. KinectFusion не использует для геометрической реконструкции цветные снимки и обрабатывает только данные глубины. Алгоритм обновляет реконструируемую модель по потоку снимков глубины в реальном времени с помощью параллельных вычислений на графическом процессоре (GPU). KinectFusion реализован в составе Kinect SDK и несовместим с другими RGB-D камерами. После публикации алгоритма появилось несколько отдельных реализаций, наиболее известной из которых является KinFu. KinFu [8] входит в состав Point Cloud Library – многофункциональной кроссплатформенной библиотеки для работы с облаками точек. 10 KinFu позволяет использовать для реконструкции сцены другие устройства, такие как Asus Xtion Pro Live и PrimeSense Carmine. Данная реализация алгоритма используется в различных исследованиях и проектах, например в HouseScan [3] – полуавтоматической системе сканирования многокомнатных помещений. В PCL имеется пользовательский интерфейс для KinFu (рис.3), но он обладает множеством недостатков. Во-первых, интерфейс разделён на 4 окна, которые могут перекрываться, если разрешение экрана недостаточно высокое. Во-вторых, управлять можно только вводом с клавиатуры, который действует не во всех окнах. В-третьих, в получаемой полигональной модели вершины дублируются для каждого полигона, что приводит к увеличению списка вершин в 3-4 раза. Пользователь также не может поменять в интерфейсе разрешение камеры или отключить автоматическое изменение баланса белого и экспозиции, из-за которых возникает дополнительная разница между изображениями. И, наконец, параметры запуска, такие как размер пространства, интеграция цвета, необходимо указывать при запуске в командной строке. Рисунок 3. Интерфейс PCL KinFu. В PCL есть расширение KinFu – KinFu Large Scale, которое позволяет расширить область сканирования путём сдвига воксельного объёма. Но дополнительные вычисления замедляют 11 скорость обработки снимков глубины, а для получения полигональной модели и её текстурирования необходимо запускать две дополнительные программы kinfu_largeScale_mesh_output и kinfu_largeScale_texture_output. 1.3. Программные продукты для трёхмерной реконструкции Программные продукты, разработанные для трёхмерного сканирования c использованием RGB-D камер, имеют много сходств в организации процесса сканирования и построении пользовательского интерфейса, поскольку основаны на алгоритме KinectFusion. В качестве примера таких продуктов будут рассмотрены Scanect [11] и RecFusion [10]. Процесс сканирования проходит следующим образом: после первоначальной настройки параметров (объём сканируемого пространства, детализация) производится процесс сканирования: камера плавно перемещается пользователем, охватывая поверхность сканируемого объекта. Полигональная модель строится в режиме реального времени, используя поступающие с камеры снимки глубины для обновления. В программе визуализируется текущая карта глубины и реконструируемая модель. Отслеживается смещения камеры относительно предыдущего положения. После геометрической реконструкции производится вычисление цвета вершин модели. Пользователю предлагается экспорт полученной модели в файл. Дополнительно есть функции для заполнения дыр в полигональной модели, обрезки, сглаживания и подготовки к 3D печати. Программные продукты являются платными (стоимость лицензии на одного пользователя Scanect или RecFusion - 99€), но обладают широкой функциональностью и удобным пользовательским интерфейсом. Программы также позволяют выполнять вычисления как на GPU, так и на CPU. 1.4. Проблемы при вычислении цвета вершин У рассмотренных ранее программ для трёхмерной реконструкции имеются несколько недостатков при вычислении цвета модели. Выражаются они в том, что цвет реконструируемой модели становится сильно смазанным, а части изображений одних объектов накладываются на поверхность других объектов. Возникают они по следующим причинам: Во-первых, цветное изображение и карта глубины не делаются одновременно, а производятся с разницей в 10-100 миллисекунд, поэтому точку съёмки цветного изображения 12 нужно корректировать для корректного наложения. Во-вторых, неточности реконструкции, неизбежно возникающие из-за погрешности измерений и алгоритмических преобразований, также ухудшает качество наложения. В-третьих, при сканировании возможно получение смазанных или искажённых изображений, которые, если их не отбросить, перенесут искажения на реконструкцию. И, наконец, в программах нет прямой регулировки разрешения снимков камеры. Программы настроены на работу с разрешением QVGA (320х240) или VGA(640x480), а, например, максимально возможное разрешение цветного снимка для камеры Asus Xtion Pro Live (1280х1024)[5] не используется, что приводит к меньшей детализации. 1.5. Выбор алгоритмов для реализации Приложение, которое необходимо разработать, должно производить геометрическую реконструкцию сцены и вычисление цвета вершин модели. Для геометрической реконструкции будет использована реализация алгоритма KinectFusion в библиотеке PCL – KinFu [8] (без модификации largeScale), так как он позволяет использовать для сканирования различные RGB-D камеры, совместимые с OpenNI [7]. Для вычисления цвета вершин модели будет использован алгоритм Q.-Y.Zhou и V.Koltun [13], который устраняет недостатки реконструкции цвета, характерные для аналогичных приложений, путём проведения коррекции положения камеры при съёмке изображения и коррекции наложения изображения на полигональную модель Выбранные алгоритмы и средства будут использованы для реализации приложения, обладающего следующей функциональностью: Первичная настройка (выбор разрешения съёмки, размера сцены); Получение данных с RGB-D камеры – снимка глубины и цветного изображения; Последовательная трёхмерная реконструкция сцены по потоку изображений с камеры с контролем перемещения камеры относительно сцены; Вычисление цвета вершин полигональной модели на основе набора цветных снимков, полученных в процессе сканирования; Визуализация полученной модели; Сохранение модели в файл формата PLY [9]. 13 2. Алгоритмы трёхмерной реконструкции Для создания трёхмерной реконструкции сцены или объекта необходимо создать его трёхмерную модель и вычислить цвет её вершин. Для геометрической реконструкции будет использоваться алгоритм KinectFusion, реализованный в библиотеке PCL как KinFu. 2.1. Создание полигональной модели алгоритмом KinFu Алгоритм KinFu производит постепенную геометрическую реконструкцию сцены по потоку снимков глубины. Алгоритм состоит из следующих основных шагов: 1. Получение снимка глубины с RGB-D камеры и его конвертация в облако точек. Для конвертации используются параметры камеры: 𝑓𝑥 , 𝑓𝑦 – фокусные расстояния камеры; 𝑐𝑥 , 𝑐𝑦 – координаты центра изображения. Координаты каждой точки из облака рассчитываются по формуле: 𝑝(𝑢𝑥 , 𝑢𝑦 , 𝑢𝑧 ) = ( (𝑢𝑥 − 𝑐𝑥 ) ∗ 𝑢𝑧 ∗ 0.001 (𝑢𝑦 − 𝑐𝑦 ) ∗ 𝑢𝑧 ∗ 0.001 , , 𝑢𝑧 ∗ 0.001) 𝑓𝑥 𝑓𝑦 где 𝑢𝑥 , 𝑢𝑦 – координаты на снимке глубины, 𝑢𝑧 – глубина в миллиметрах (в KinFu – 16битное число). Нормалью для каждой вершины в облаке является векторное произведение двух векторов: вектора, соединяющего текущую вершину с вершиной, расположенной над ней на снимке глубины, и вектора, соединяющего текущую вершину с вершиной, расположенной справа на снимке глубины. 2. Отслеживание перемещения камеры относительно реконструируемой модели. На этом шаге необходимо новое облако точек A совместить с текущей реконструкцией. Для этого текущая реконструкция переводится в формат облака точек 𝐶. С помощью алгоритма Iterative-Closest-Points (ICP) итеративно вычисляется матрица преобразования 𝑇 (размерность 4 × 4), минимизирующая квадрат расстояний между вершинами преобразованного облака 𝑇 ∗ 𝐴 и 𝐶 (𝐴 и 𝐶 представлены как матрицы 4 × 𝑛, где 𝑛 – количество вершин). В KinFu применяется модификация алгоритма ICP, устойчивая к погрешностям и делающая предположение, что углы поворота камеры являются небольшими, позволяя принять 𝑠𝑖𝑛 𝑥 ≈ 𝑥 и 𝑐𝑜𝑠 𝑥 ≈ 1 [8]. Упрощенный 14 алгоритм позволяет ускорить вычисления, но не находит решения при больших углах поворота. Полученная матрица используется для определения текущего положения камеры. 3. Интеграция нового облака точек в текущую реконструкцию. Текущая реконструкция представлена в виде трёхмерного равномерного воксельного пространства ограниченного объёма. В каждом вокселе хранится значение, называемое Truncated Signed Distance Function (TSDF). Это значение показывает скользящее среднее расстояния от центра вокселя до предполагаемой поверхности объекта. Значение функции отрицательное, когда воксель находится за поверхностью сцены, и положительное, когда воксель находится перед поверхностью. Через те воксели, в которых функция меняет знак, проходит поверхность реконструируемой сцены. Преобразованное новое облако точек, полученное на предыдущем шаге, используется для обновления значений TSDF. 4. Визуализация текущей реконструкции. Визуализация используется для контроля над процессом реконструкции и для получения текущей карты глубины, которая используется алгоритмом ICP для оценки смещения камеры. Визуализация представляется в виде двумерного изображения, каждый пиксель которого вычисляется путём прохождения луча через воксельный объём до ближайшего вокселя (raycasting), в котором функция TSDF меняет знак. В этой точке вычисляются координаты и нормаль, по которым генерируется трёхмерное изображение. 5. Получение готовой реконструкции. Воксельный объём преобразуется в облако точек с нормалями и триангулируется для получения полигональной модели. Для триангуляции в KinFu применяется алгоритм Marching Cubes [6]. В реализации KinFu в PCL все шаги алгоритма выполняются параллельно на графическом процессоре, что позволяет достичь скорости, приемлемой для реконструкции в реальном времени. Результатом работы данного алгоритма является трёхмерная полигональная модель, состоящая из списка вершин и списка полигонов, задаваемых тремя точками. 2.2. Вычисление цвета вершин полигональной модели Для вычисления цвета могут быть использованы различные подходы. Вычисление цвета может проводиться одновременно с геометрической реконструкцией, интегрируя цвет в 15 каждом вокселе. Другой подход использует сохранённые при сканировании снимки и соответствующие им положения камеры для последующего их наложения на готовую полигональную модель. В PCL реализованы и первый, и второй подход. Но во втором случае вычисляются текстурные координаты, а не сам цвет, следовательно, на каждый полигон накладывается только часть одного из изображений, и реализован второй подход только в KinFu LargeScale. Алгоритм Zhou&Koltun [13], описанный далее, использует второй подход, но вычисляет именно цвет вершин, а не текстурные координаты. 2.3. Алгоритм Q.-Y. Zhou и V.Koltun для вычисления цвета вершин модели Алгоритм Zhou и Koltun наложения цветных изображений, сделанных в процессе сканирования, на полигональную модель с вычислением цвета для каждой вершины подробно изложен в статье [13]. Целью алгоритма является повышение точности наложения изображения на модель. Для этого применяется два подхода, выполняемых одновременно: коррекция положения камеры (Camera pose optimization) и коррекция изображения (Non-rigid correction). На вход алгоритма подаётся полученная в результате сканирования полигональная модель и набор цветных изображений. Для каждого изображения в процессе сканирования записываются следующие параметры: вектор смещения камеры в системе координат модели 𝑡, матрица поворота камеры 𝑅 (размерность – 3 × 3), фокусное расстояние камеры. Далее используются следующие обозначения: 𝑀 – исходная полигональная модель, задаваемая списком 3D вершин и списком полигонов. 𝑃 – множество вершин полигональной модели 𝑀. 𝐼 – набор цветных снимков, 𝐼𝑖 – отдельное изображение. |𝐼| = 𝑛. 𝑇𝑖 – матрица преобразования вершин модели для изображения 𝐼𝑖 . Матрица состоит из вектора смещения 𝑡 и матрицы поворота 𝑅 камеры 𝑖, размерность матрицы – 4 × 4: 𝑅 𝑇𝑖 = [ 𝑖 0 𝑡𝑖 ] 1 𝑇𝑖0 – исходная матрица преобразования, 𝑇𝑖 изменяется в процессе работы алгоритма. 16 𝑝 ∈ 𝑃 – вершина полигональной модели 𝑀, задаваемая координатами в 3D пространстве. 𝑇 𝑝 = (𝑝𝑥 , 𝑝𝑦 , 𝑝𝑧 , 1) . 𝑃𝑖 ⊂ 𝑃 – набор вершин, спроецированный на изображение 𝐼𝑖 . 𝐼𝑝 ⊂ 𝐼 – набор изображений, на который проецируется вершина 𝑝. 𝐶(𝑝) – цвет вершины p, полученный путём усреднения цвета проекций вершины на все изображения. В алгоритме для расчёта отклонений используются только градации серого, для чего все изображения преобразовываются в grayscale формат. 𝛤𝑖 (𝑝, 𝑇𝑖 ) – цвет проекции (оттенок серого) вершины 𝑝 на изображение 𝐼𝑖 с использованием матрицы преобразования 𝑇𝑖 . 2.3.1. Коррекция положения камеры Задачей данной части алгоритма является коррекция матрицы 𝑇𝑖 для каждого изображения 𝐼𝑖 из набора 𝐼. Задача формулируется как задача наименьших квадратов для каждого изображения: 2 𝐸(𝑇) = ∑𝑖 ∑𝑝 ∈𝑃𝑖 𝑟𝑖,𝑝 (1) 𝑟𝑖,𝑝 = 𝐶(𝑝) − 𝛤𝑖 (𝑝, 𝑇𝑖 ) (2) где 𝛤𝑖 (𝑝, 𝑇𝑖 ) подробнее представляется как 𝛤𝑖 (𝑢(𝑔(𝑝, 𝑇𝑖 ))), где функция 𝑔 – преобразование вершины 𝑝 матрицей 𝑇𝑖 , а функция 𝑢 – проекция вершины на изображение 𝐼𝑖 : 𝑔(𝑝, 𝑇𝑖 ) = 𝑇𝑖 ∗ 𝑝 𝑔𝑥 ∗ 𝑓𝑥 𝑢(𝑔𝑥 , 𝑔𝑦 , 𝑔𝑧 , 𝑔𝑤 ) = ( + 𝑐𝑥 , 𝑔𝑧 𝑇 𝑔𝑦 ∗ 𝑓𝑦 + 𝑐𝑦 ) 𝑔𝑧 𝑓𝑥 , 𝑓𝑦 - фокусные расстояния камеры, 𝑐𝑥 , 𝑐𝑦 – координаты центра изображения. Для решения задачи применяется метод Гаусса-Ньютона. Для каждой матрицы 𝑇𝑖 производится итерационное вычисление вектора 𝜉 = (𝛼𝑖 , 𝛽𝑖 , 𝛾𝑖 , 𝑎𝑖 , 𝑏𝑖 , 𝑐𝑖 )𝑇 , выражающего 17 частичное изменение матрицы. Параметры (𝑎𝑖 , 𝑏𝑖 , 𝑐𝑖 ) определяют смещение, а параметры (𝛼𝑖 , 𝛽𝑖 , 𝛾𝑖 ) – поворот. Требуемая коррекция матрицы рассчитывается по формуле (3): 1 𝛾 𝑇𝑖 = ( 𝑖 −𝛽𝑖 0 −𝛾𝑖 1 𝛼𝑖 0 𝛽𝑖 −𝛼𝑖 1 0 𝑎𝑖 𝑏𝑖 ) 𝑇𝑖0 𝑐𝑖 1 (3) Шесть первых значений вектора 𝑥 образуют вектор 𝜉. Вектор 𝑥 вычисляется следующим образом: 𝑥0 – вектор из 6 элементов, все элементы которого равны нулю. Обновление 𝑥 происходит на каждой итерации: 𝑥𝑘 = 𝑥𝑘−1 + ∆𝑥 (4) где 𝑥𝑘−1 - вектор на предыдущей итерации, ∆𝑥 является решением уравнения: 𝐽𝑟𝑇 𝐽𝑟 ∆𝑥 = −𝐽𝑟𝑇 𝑟𝑖 (5) где 𝑟𝑖 – вектор-столбец отклонений, 𝑟𝑖 = [ 𝑟𝑖,𝑝 (𝜉𝑖 )|𝑥 = 𝑥 𝑘−1 ]. 𝐽𝑟 – матрица Якоби для функции r, вычисляемая по следующей формуле: 𝐽𝑟 = [− ∇𝛤𝑖 (𝑢) 𝐽𝑢 (𝑔) 𝐽𝑔 (𝜉𝑖 )|𝑥 = 𝑥𝑘−1 ] (6) 𝐽𝑟𝑇 – транспонированная матрица 𝐽𝑟 . 𝛻𝛤(𝑢) – градиент функции 𝛤(𝑝, 𝑇𝑖 ), вычисляемый путём применения нормализованного фильтра Щара к изображению 𝐼𝑖 (см. 3.3.3). 𝐽𝑢 (𝑔) – матрица Якоби функции 𝑢(𝑔). Размерность матрицы - 2 × 4. 𝐽𝑔 (𝜉𝑖 ) – матрица Якоби функции 𝑔. Размерность матрицы - 4 × 6. Размерность матрицы 𝐽𝑟 – 𝑚 × 6 (𝑚 - количество вершин в 𝑃𝑖 ) 𝐶(𝑝) вычисляется перед каждой итерацией по формуле: 𝐶(𝑝) = 1 𝑛𝑝 ∑𝐼𝑖 ∈ 𝐼𝑝 𝛤𝑖 (𝑢(𝑔(𝑝, 𝑇𝑖 ))) 18 (7) Где 𝑛𝑝 = |𝐼𝑝 |. После вычисления ∆𝑥 вектор х обновляется. На основе обновлённого вектора 𝜉𝑖 рассчитывается новая матрица 𝑇𝑖 по формуле (3), которая используется на следующей итерации алгоритма. На каждой итерации выполняется решение 𝑛 систем линейных уравнений с 6-ю переменными (n - количество изображений, 6 – количество параметров в векторе 𝑥). 2.3.2. Коррекция наложения изображения В данной части алгоритма производится коррекция наложения изображения. Коррекция представляют собой деформацию сетки изображения 𝑉𝑖 . 𝑉𝑖 – прямоугольная равномерная сетка, наложенная на изображение 𝐼𝑖 (размер сетки в данной реализации 10 × 8 ячеек - 99 вершин). Для каждой вершины 𝑣𝑖,𝑙 сетки функция деформации определяется как 𝐹𝑖 (𝑣𝑖,𝑙 ) = 𝑣𝑖,𝑙 + 𝑓𝑖,𝑙 (8) где 𝑓𝑖,𝑙 – двумерный вектор. Для всех значений функции u F(u) определяется как 𝐹(𝑢) = 𝑢 + ∑𝑙 𝜃𝑙 𝑓𝑙,𝑖 (9) Где 𝜃𝑙 – коэффициент билинейной интерполяции 𝑢 по сетке 𝑉 для 𝑣𝑖,𝑙 . Для любого 𝑢 ненулевыми могут быть не более четырёх коэффициентов. Задача наименьших квадратов при добавлении деформации изображения переформулирована следующим образом: 𝐸(𝑇, 𝐹) = 𝐸𝑐 (𝑇, 𝐹) + 𝜆𝐸𝑟 (𝐹) Где 𝐸𝑐 - основная задача, а 𝐸𝑟 – 𝐿2 регуляризатор. Параметр регуляризации 𝜆 = 0.1. 𝐸𝑟 (𝐹) = ∑ ∑ 𝑓𝑖,𝑙𝑇 𝑓𝑖,𝑙 𝑖 𝑙 К вектору 𝑥 добавляются дополнительные параметры (𝑓𝑖,𝑙,𝑥 , 𝑓𝑖,𝑙,𝑦 ) для всех 𝑓𝑖,𝑙 . Новое уравнение выглядит следующим образом: 19 (10) (𝐽𝑟𝑇 𝐽𝑟 + 𝜆𝐼𝐹 ) ∆𝑥 = −𝐽𝑟𝑇 𝑟 (11) где 𝐼𝐹 - единичная матрица размерности (6 + 2 𝑙) × (6 + 2 𝑙), в которой первые 6 единиц заменены на 0; 𝐽𝑟 рассчитывается как объединение в каждой строке ∇𝑟𝑖 𝑝 (𝜉𝑖 ) и ∇𝑟𝑖 𝑝 (𝑓𝑖,𝑙 ) для всех 𝑓𝑖,𝑙 . Обновлённая формула ∇𝑟𝑖 𝑝 (𝜉𝑖 ): ∇𝑟𝑖 𝑝 (𝜉𝑖 ) = −∇𝛤(𝐹𝑖 ) 𝐽𝐹𝑖 (𝑢) 𝐽𝑢 (𝑔) 𝐽𝑔 (𝜉𝑖 ) 𝐽𝐹𝑖 (𝑢) = 𝐼 + ∑ 𝑓𝑖,𝑙 ∗ ∇𝜃𝑙 (𝑢) 𝑙 Формула ∇𝑟𝑖,𝑝 (𝑓𝑖,𝑙 ): ∇𝑟𝑖,𝑝 (𝑓𝑖,𝑙 ) = − 𝜃𝑙 (𝑢)∇𝛤(𝐹𝑖 ) Матрица 𝐽𝑟 является разреженной, так как в каждой строке ненулевыми могут быть не более 14 элементов (6 в ∇𝑟𝑖 𝑝 (𝜉𝑖 ) и 8 в ∇𝑟𝑖 𝑝 (𝑓𝑖 𝑙 ), так как для любых (𝑢𝑥 , 𝑢𝑦 ) количество ненулевых коэффициентов 𝜃𝑙 не превышает 4). Поэтому возможно использование алгоритмов, учитывающих разреженность матриц, что позволит ускорить вычисления. При совместной оптимизации положения камеры и коррекции изображения на каждой итерации производится решение 𝑛 систем линейных уравнений с (6 + 2 𝑙) неизвестными. В данной реализации будет проводиться 50 итераций метода Гаусса-Ньютона 2.3.3. Преобразование изображений В алгоритме Zhou&Koltun при вычислении отклонений цвета используется изображение, переведённое в градации серого. В данной реализации используется следующая формула для перевода RGB-значения пикселей в градации серого: 𝑏𝑤 = 0.3𝑅 + 0.5𝐺 + 0.2𝐵 20 Для вычисления градиента функции 𝛤(𝑝, 𝑇𝑖 ) к grayscale изображению применяется фильтр Щара (Scharr filter [12]). Для расчёта градиента по X и по Y для каждого пикселя применяется следующие ядра: −3 0 3 𝐺𝑥 = [−10 0 10] ; −3 0 3 −3 𝐺𝑦 = [ 0 3 −10 −3 0 0] 10 3 2.3.4. Псевдокод алгоритма вычисления цвета вершин Вход: Полигональная модель 𝑀, набор изображений 𝐼 = { 𝐼𝑖 }, матрицы преобразования 𝑇𝑖 . Фокусные расстояния 𝑓𝑥 , 𝑓𝑦 , координаты центра изображения 𝑐𝑥 , 𝑐𝑦 . Выход: RGB значения цвета для каждой вершины 𝑝. 1. определить видимые вершины 𝑃𝑖 для каждого изображения 𝐼𝑖 ; 2. преобразовать изображения в градации серого, вычислить градиенты по 𝑥 и 𝑦; 3. 𝑥𝑖,0 – нулевой вектор для всех 𝑖, где 𝑖 – номер камеры (изображения); 4. for k from 1 to <количество итераций> do Вычислить 𝐶(𝑝) для каждой вершины 𝑝; for each 𝐼𝑖 ∈ 𝐼 do for each 𝑝 in 𝑃𝑖 do Вычислить: 𝛻𝑟𝑖,𝑝 (𝜉𝑖 ), ∇𝑟𝑖,𝑝 (𝑓𝑖,𝑙 ); Добавить строку в матрицу 𝐽𝑟 ; Транспонировать матрицу 𝐽𝑟 . A = (𝐽𝑟𝑇 𝐽𝑟 + 𝜆𝐼𝐹 ); 𝐵 = −𝐽𝑟𝑇 𝑟; Найти решение уравнения 𝐴 ∗ ∆𝑥 = 𝐵; Обновить вектор 𝑥 для камеры 𝑖: 𝑥𝑖,𝑘 = 𝑥𝑖,𝑘−1 + ∆𝑥; Обновить матрицы 𝑇𝑖 и функции деформации. 5. Для каждой вершины 𝑝 ∈ 𝑃 вычислить значения RGB, используя скорректированные матрицы 𝑇𝑖 и деформации изображения. Цвет проекции вершины вычисляется по координатам (𝑢𝑥 , 𝑢𝑦 ) с использованием билинейной интерполяции по ближайшим пикселям изображения. Окончательный цвет вершин рассчитывается как средний по всем проекциям на изображения 𝐼. 21 2.4. Отбор изображений Для отбора цветных снимков в процессе сканирования применяется алгоритм Crete [1] определения размытия изображения. На каждом временном интервале (𝑡а , 𝑡𝑏 ) процесса сканирования из всех цветных изображений 𝐼𝑡 отбирается одно изображение 𝐼𝑖 , для которого значение 𝑏𝑙𝑢𝑟𝑖 наименьшее. Значение рассчитывается по алгоритму: Вход: Изображение F- переведённое в градации серого изображение 𝐼𝑖 . Размер изображения 𝑛 × 𝑚. Выход: значение 𝑏𝑙𝑢𝑟𝑖 𝜖 [0.0, 1.0]. 1. Вычисление изображения размытого по 𝑥 и 𝑦: 𝐵ℎ𝑜𝑟 = ℎ𝑣 ∗ 𝐹, 𝐵𝑣𝑒𝑟 = ℎ𝑣 𝑇 ∗ 𝐹, где ℎ𝑣 – фильтр: 1 ℎ𝑣 = [1 9 1 1 1 1 1 1 1 1] 2. Вычисление 𝐷𝐹 𝑣𝑒𝑟 , 𝐷𝐹 ℎ𝑜𝑟 , 𝐷𝐵 𝑣𝑒𝑟 , 𝐷𝐵 ℎ𝑜𝑟 : 𝐷𝐹 ℎ𝑜𝑟 (𝑥, 𝑦) = 𝐴𝑏𝑠(𝐹(𝑥, 𝑦) − 𝐹(𝑥 − 1, 𝑦) ) 𝐷𝐹 𝑣𝑒𝑟 (𝑥, 𝑦) = 𝐴𝑏𝑠(𝐹(𝑥, 𝑦) − 𝐹(𝑥, 𝑦 − 1) ) 𝐷𝐵 ℎ𝑜𝑟 (𝑥, 𝑦) = 𝐴𝑏𝑠(𝐵ℎ𝑜𝑟 (𝑥, 𝑦) − 𝐵ℎ𝑜𝑟 (𝑥 − 1, 𝑦) ) 𝐷𝐵 𝑣𝑒𝑟 (𝑥, 𝑦) = 𝐴𝑏𝑠(𝐵𝑣𝑒𝑟 (𝑥, 𝑦) − 𝐵𝑣𝑒𝑟 (𝑥, 𝑦 − 1) ) 3. Вычисление 𝑉𝑣𝑒𝑟 , 𝑉ℎ𝑜𝑟 : 𝑉𝑣𝑒𝑟 (𝑥, 𝑦) = max(0.0, 𝐷𝐹 𝑣𝑒𝑟 (𝑥, 𝑦) − 𝐷𝐵 𝑣𝑒𝑟 (𝑥, 𝑦)) 𝑉ℎ𝑜𝑟 (𝑥, 𝑦) = max(0.0, 𝐷𝐹 ℎ𝑜𝑟 (𝑥, 𝑦) − 𝐷𝐵 ℎ𝑜𝑟 (𝑥, 𝑦)) 4. Суммирование: 𝑠𝐹𝑣𝑒𝑟 = ∑𝑛𝑥=0 ∑𝑚 𝑦=1 𝐹𝑣𝑒𝑟 (𝑥, 𝑦) 𝑠𝐹ℎ𝑜𝑟 = ∑𝑛𝑥=1 ∑𝑚 𝑦=0 𝐹ℎ𝑜𝑟 (𝑥, 𝑦) 𝑠𝑉𝑣𝑒𝑟 = ∑𝑛𝑥=0 ∑𝑚 𝑦=1 𝑉𝑣𝑒𝑟 (𝑥, 𝑦) 𝑠𝑉ℎ𝑜𝑟 = ∑𝑛𝑥=1 ∑𝑚 𝑦=0 𝑉ℎ𝑜𝑟 (𝑥, 𝑦) 5. Вычисление 𝑏𝑙𝑢𝑟𝑒𝑛𝑒𝑠𝑠𝑖 𝑏𝑙𝑢𝑟𝑖 = max( 𝑠𝐹𝑣𝑒𝑟 − 𝑠𝐵𝑣𝑒𝑟 𝑠𝐹ℎ𝑜𝑟 − 𝑠𝐵ℎ𝑜𝑟 , ) 𝑠𝐹𝑣𝑒𝑟 𝑠𝐹ℎ𝑜𝑟 В данной реализации интервал (𝑡а , 𝑡𝑏 ) – 2 секунды. 22 3. Архитектура программы и особенности реализации 3.1. Выбранные инструменты Для реализации программы были использованы следующие инструменты и программные средства: Для взаимодействия с RGB-D камерой используется OpenNI Framework 2. Для геометрической реконструкции сцены используется KinFu – реализация алгоритма KinectFusion в библиотеке PCL. Для построения пользовательского интерфейса используется Qt Framework 5.1 и OpenGL. Для операций с матрицами и решения систем уравнений в алгоритме вычисления цвета вершин, включая операции с разреженными матрицами, используется библиотека Eigen [2]. Приложение написано на языке программирования C++ в среде разработки Microsoft Visual Studio 2012. 3.2. Архитектура приложения Рисунок 4. Диаграмма классов приложения Приложение состоит из трёх основных компонентов: 1. Интерфейс приложения, представленный классами Scanelium и glWidget: Scanelium – интерфейс приложения. Содержит обработчики событий и обеспечивает взаимодействие с пользователем. 23 glWidget – интерфейсный объект для отображения 3D графики в интерфейсе. Отображает облако точек с камеры на этапе инициализации, текущее состояние модели на этапе сканирования, полученную трёхмерную модель после сканирования и расцвеченную трёхмерную модель после выполнения алгоритма вычисления цвета вершин. 2. Компонент геометрической реконструкции, состоящий из классов KinfuController, ONICapture и ImageProcessThread: KinfuController предназначен для управления процессом трёхмерного сканирования, проводит инициализацию, запуск и получение реконструкции. KinfuController использует компонент KinfuTracker, который является реализацией алгоритма KinectFusion. Класс запускается в отдельном потоке от интерфейса. ONICapture предназначен для взаимодействия с RGB-D камерой. Проводит инициализацию OpenNI и получает снимки глубины и цветные изображения с камеры. ImageProcessThread проводит отбор цветных снимков в отдельном потоке. Отбор производится путём выбора изображений с наименьшим уровнем размытия (см. 2.4). Запускается в отдельном от KinfuController потоке, чтобы не влиять на скорость геометрической реконструкции. 3. Компонент вычисления цвета вершин полигональной модели, представленный классами ColorMapper и CameraThread: ColorMapper содержит реализацию алгоритма Zhou&Koltun. Так как на каждой итерации алгоритма системы уравнений для каждого изображения вычисляются независимо, вычисления распределяются по нескольким потокам с помощью класса CameraThread. CameraThread проводит вычисление матриц и решение уравнений для одного изображения. Используются компоненты библиотеки Eigen SparseMatrix для представления матрицы 𝐽𝑟 и SimplicialCholesky для решения уравнения (11). Режимы работы программы (ProgramState): 1. INIT – выбор параметров сканирования сцены, отображение текущего облака точек с устройства для выбора необходимого расположения камеры. 24 2. KINFU – выполнение сканирования сцены по заданным параметрам. Процесс сканирования можно завершить или начать заново. Результатом сканирования является трёхмерная модель и набор цветных изображений с информацией о положении камеры для каждого снимка. 3. COLOR – просмотр полученной на предыдущей стадии модели и запуск алгоритма вычисления цвета вершин. 4. FINAL – просмотр итоговой полигональной модели. Сохранение итоговой модели в файл формата PLY. 3.3. Процесс реконструкции 3.3.1. Инициализация и геометрическая реконструкция Процесс реконструкции сцены с помощью данного приложения производится следующим образом: подключив RGB-D камеру к компьютеру, пользователь запускает приложение. На первоначальном этапе пользователь имеет возможность настроить параметры реконструкции, такие как размер сцены, точность сканирования, разрешение снимков глубины и цветных изображений. Также пользователь может указать, как расположена камера относительно сцены в момент начала сканирования, например, можно указать её начальное расположение в центре сканируемой сцены, либо на боковой грани. Во втором случае камера будет направлена на сцену с центра задней грани. Далее пользователь запускает процесс сканирования. На этой стадии компонент KinfuController выполняет следующие действия: Загрузка в KinFu нового снимка глубины; Получение от KinFu визуализации текущей трёхмерной реконструкции; Сохранение цветных снимков. Во время сканирования пользователь видит визуализацию и использует её для слежения за процессом реконструкции, чтобы проконтролировать охват сцены. На визуализацию дополнительно наложена карта глубины и красноватым цветом подсвечены участки, которые не могут быть просканированы при текущем положении камеры (рис. 5) (поверхность слишком далеко, слишком близко, поверхность обрывается, либо присутствуют другие помехи). 25 Рисунок 5. Процесс реконструкции При сканировании следует соблюдать следующие правила: 1. Перемещать камеру необходимо плавно, без рывков, так как алгоритм ICP, используемый в KinFu, не рассчитан на быстрое перемещение. Плавное перемещение также помогает избежать размытия цветных изображений, получаемых параллельно с реконструкцией. 2. Необходимо избегать ситуаций, когда в кадр попадает только плоская стена, так как это может привести к неверному определению смещения; Когда пользователь охватил все интересующие его области сцены, он может прервать сканирование. На этом этапе он получает трёхмерную полигональную модель и набор цветных снимков, для которых известно приблизительное положение камеры. Модель можно осмотреть перед переходом к следующему шагу. 26 3.3.2. Вычисление цвета вершин Для полученной на предыдущем шаге модели, на данном этапе производится вычисление цвета вершин. Пользователь может указать количество итераций алгоритма Zhou&Koltun и запустить вычисление. Вычисление цвета происходит в отдельном от интерфейса потоке, поэтому пользователь может осматривать предварительную бесцветную модель, пока выполняется алгоритм. Внизу интерфейса показан статус выполнения алгоритма, что позволяет следить за выполнением. Начало алгоритма (определение видимых вершин для каждого изображения) и начало итерации (вычисление 𝐶(𝑝) по формуле (7)) не выполняется параллельно. Вычисление матриц и решение уравнения для одного изображения выполняются в отдельных потоках (максимально 8 одновременных потоков – одновременно обрабатываемых изображений). Цветную полигональную модель, полученную после выполнения алгоритма, пользователь может осмотреть и сохранить в файл формата PLY, содержащий данные о координатах и цвете вершин и список полигонов. 3.4. Пример реконструкции Рисунок 6. Реконструкция сцены разработанной программой. Параметры реконструкции: В реконструируемой сцене содержится несколько объектов, в том числе с глянцевыми поверхностями. Длительность сканирования - 34-35 секунд. Объём сканируемого пространства – 1 м3 . 27 RGB-D камера Asus Xtion Pro Live. Разрешение цветного изображения 1280х1024, разрешение снимка глубины – 640х480. Количество вершин – 469982, количество полигонов – 923122, количество цветных изображений – 17, количество итераций алгоритма Zhou&Koltun – 50. Рисунок 7. Сравнение модели до и после работы алгоритма Zhou&Koltun. Слева – 0 итераций, в центре – 25 итераций, справа – 50 итераций. Сравнение визуального качества трёхмерной реконструкции разработанной программы и реконструкций Scanect и RecFusion приведено в приложении Д. 28 Заключение В работе приведён обзор алгоритмов и технологий трёхмерной реконструкции с помощью RGB-D камер, программных продуктов для трёхмерного сканирования и нового алгоритма повышающего качество реконструкции. Результатом работы является программа, позволяющая проводить трёхмерную реконструкцию сцены по снимкам глубины и изображениям, поступающим с RGB-D камеры. Создан пользовательский интерфейс, упрощающий проведение геометрической реконструкции с помощью KinFu, полностью реализован недавно опубликованный алгоритм вычисления цвета вершин Zhou&Koltun, позволяющий улучшить визуальное качество трёхмерной модели, разработана техническая документация к программе. Программа обладает большим потенциалом расширения функциональности. Добавление дополнительных функций, таких как коррекция модели, обрезка, подготовка модели к 3D печати, экспорт модели в дополнительные форматы файлов, существенно расширит применимость приложения к современным задачам трёхмерной реконструкции. Среди первоочередных задач по улучшению программы - оптимизация работы KinFu , достижение максимального распараллеливания алгоритма Zhou&Koltun с использованием вычислений на GPU, повышение устойчивости применяемого в KinFu алгоритма ICP и улучшение интерфейса. Эти улучшения позволят сделать процесс создания трёхмерной реконструкции более быстрым и удобным. 29 Список использованных источников 1. Crete, F. The Blur Effect: Perception and Estimation with a New No-Reference Perceptual Blur Metric // SPIE Electronic Imaging Symposium Conf Human Vision and Electronic Imaging, Jan 2007, San Jose, United States. XII, pp.EI 6492-16. 2. Eigen - C++ template library for linear algebra [Электронный ресурс] URL: http://eigen.tuxfamily.org/index.php?title=Main_Page Дата обращения: 20.05.15. 3. Hambuchen, N. HouseScan: Building-scale interior 3D reconstruction with Kinect Fusion. Master's Thesis, 2014. [Электронный ресурс]. URL: http://www.doc.ic.ac.uk/teaching/distinguished-projects/2014/n.hambuechen.pdf Дата обращения: 1.02.2015. 4. Izadi, S., Newcombe, R. KinectFusion: real-time 3D reconstruction and interaction using a moving depth camera // UIST'11, 2011. 5. Litomisky, K. Consumer RGB-D Cameras and their applications, 2012. [Электронный ресурс]. URL : http://alumni.cs.ucr.edu/~klitomis/files/RGBD-intro.pdf Дата обращения: 1.02.15. 6. Lorensen, W., Cline, H. Marching cubes: A high resolution 3D surface construction algorithm // ACM Siggraph Computer Graphics, 1987, vol. 21. 7. OpenNI [Электронный ресурс] URL: https://en.wikipedia.org/wiki/OpenNI Дата обращения: 20.04.15. 8. Pirovano, M. Kinfu - an open source implementation of Kinect Fusion + case study: implementing a 3D scanner with PCL, 2012. [Электронный ресурс]. URL: http://homes.di.unimi.it/~pirovano/pdf/3d-scanning-pcl.pdf Дата обращения: 1.02.15. 9. PLY – Polygon File Format [Электронный ресурс] URL: https://en.wikipedia.org/wiki/PLY_(file_format) Дата обращения: 20.04.15 10. RecFusion: Real-Time 3D Reconstruction [Электронный ресурс]. URL: http://www.recfusion.net/ Дата обращения: 1.02.15. 11. Scanect 3D Scanning Software by Occupital [Электронный ресурс]. URL: http://skanect.occipital.com/ Дата обращения: 1.02.15. 30 12. Sobel operator - Scharr operator [Электронный ресурс] URL: http://en.wikipedia.org/wiki/Sobel_operator#Alternative_operators Дата обращения: 20.05.15. 13. Zhou, Q.-Y., Koltun, V. Color map optimization for 3D reconstruction with consumer depth cameras // SIGGRAPH’14. 31