Заархивировано - Наложение изображения отсканированного лица на трехмерную модель в Intel® RealSense™ SDK

Выпуск комплекта Intel® RealSense™ SDK прекращен. Его поддержка и обновления более недоступны.

Загружайте примеры кода

В этом примере используется Intel® RealSense™ SDK для сканирования лица пользователя и наложения изображения лица на существующую трехмерную модель персонажа. Код написан на C++ и использует DirectX *. Для этого образца требуется пакет Intel® RealSense™ SDK R5 или более поздней версии, который можно загрузить здесь.

Сканирование

В SDK WM5 модуль сканирования лиц значительно улучшен. В частности, усовершенствовано следующее.

  • Улучшенные данные цвета.
  • Повышена однородность сканирования за счет предоставления подсказок, помогающих идеально сориентировать лицо пользователя в начальном положении.
  • Данные реперных точек на лице, указывающие на расположение основных черт лица.

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

Реализация сканирования в этом образце помогает пользователю сориентировать лицо в правильное положение с помощью подсказок Intel® RealSense™ SDK. После выполнения требований по правильному расположению лица в программе становится активной кнопка запуска сканирования.

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

Выходные данные сканирования — это OBJ-файл модели и связанная с ним текстура, которая будет использована на этапе наложения лица в этой программе.


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

Рисунок 2. Трехмерное изображение, полученное при сканировании. На изображении справа показаны реперные точки. Обратите внимание, что сканируется только лицо, а не вся голова. Данные цвета берутся из первого кадра сканирования и затем проецируются на трехмерную модель лица. При таком подходе обеспечивается высокое качество цветопередачи, но текстура растягивается по боковым сторонам головы

Наложение изображения лица на трехмерную модель

Вторая часть программы использует данные цвета отсканированного лица пользователя и данные геометрии и накладывает их на существующую модель головы. Задача состоит в том, чтобы создать полную модель головы, используя отсканированное изображение лица. При этом вместо «склейки» отсканированной модели лица с моделью головы выполняется изменение (смещение) геометрии существующей модели головы. Шейдер выполняет смещение вертексов и смешение цветов между моделями головы и лица. Такое смешение можно выполнять либо каждый раз при рендеринге модели головы, либо однократно, с кэшированием результатов. В этом примере программы поддерживаются оба этих подхода.

Описываемая процедура наложения модели лица на модель головы включает следующие основные этапы.

  1. Рендеринг отсканированной модели лица с помощью матрицы ортогональной проекции для создания карты смещения и цветовой карты.
  2. Создание матрицы для проецирования определенной модели головы на полученные карты смещения и цветов. Эта проекционная матрица учитывает масштабирование и преобразования, заданные с помощью данных реперных точек на лице.
  3. Рендеринг модели головы с помощью проекционной матрицы для сопоставления положений вертексов с координатами текстуры на картах смещения и цветов.
  4. Применение полученных карт для деформации вершин и раскрашивания пикселей. Смешение между цветовой картой и изначальной текстурой контролируется с помощью карты управления, создаваемой пользователем.
  5. (Необязательно.) Можно использовать эти же алгоритмы смещения и смешения для создания модели со смещением и единой полной цветовой текстуры, содержащей все эффекты смешения.

Ресурсы

В этом примере используются следующие графические ресурсы.

Модель головы. Модель головы, на которую накладывается лицо. В области лица, где происходит смещение вершин, модель имеет более высокое разрешение.

Карта черт лица. Текстура, наложенная на двухмерную UV-развертку модели головы, влияющую на яркость головы.

Карта деталей. Повторяющаяся текстура, накладывающая дополнительную детализацию на карту черт лица.

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

Карта управления. Управляет смешением между картой смещения, картой цветов и существующими данными модели головы. Каждый канал карты управления служит собственной цели.

  • Канал красного цвета — величина смещения вертексов по оси Z. Если это значение равно нулю, вертекс располагается на модели головы. Если это значение равно единице, то положение вертекса по оси Z изменяется на основе полученной карты смещения. При промежуточных значениях положение изменяется на промежуточную величину.
  • Канал зеленого цвета — величина смешения между цветом общей текстуры головы и цветом на полученной цветовой карте. Значение 0 — используется только цвет общей текстуры головы, значение 1 — только цвет лица.
  • Канал синего цвета — дополнительный канал для челюстной кости. Его можно использовать вместе с каналом зеленого цвета, чтобы применять к челюстной области лица отдельный цвет вместо цвета общей текстуры головы. Это может быть полезно, если пользователь носит бороду.

Все карты создаются в двухмерном UV-пространстве модели головы.


Рисунок 3. Модель головы, лицо с высокой плотностью мозаичной сетки («тесселяции»). Отсканированное лицо будет извлечено из области высокого разрешения.


Рисунок 4. Карта черт лица (слева) и карта деталей (справа). Карта деталей накладывается на двухмерную UV-развертку модели головы. Наложение повторяется несколько раз для повышения детализации


Рисунок 5. Карта передачи цветов (слева) и карта передачи цветов, наложенная на модель головы (справа). Эта карта определяет интенсивность двух выбранных пользователем цветов кожи

Рисунок 6. Карта управления (слева) и карта управления, наложенная на модель головы (справа). Канал красного цвета — область, которая будет затронута картой смещения. Канал зеленого цвета — область, к которой будет применена отсканированная цветовая карта. Канал синего цвета — челюстная область лица. Использование цветовой карты в челюстной области поможет лучше отобразить отличительные черты этой части лица, например бороду

Карты смещения и цветов

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

Рисунок 7. Карты смещения и цветов, созданные из отсканированной модели лица

Матрица проецирования карт

Теперь мы используем данные реперных точек с отсканированной модели лица и модели головы для создания матрицы преобразования. Цель этого шага — преобразование координат вертексов модели головы (в пространстве модели) в координаты текстуры (в пространстве карты смещения и цветовой карты). Этот шаг мы называем матрицей проецирования карт, поскольку здесь, по сути, карты смещения проецируются на модель головы.

Матрица проецирования карт включает перенос и масштабирование.

  • Масштабирование. Коэффициент масштабирования вычисляется на основе соотношения расстояния между глазами на отсканированной модели лица (по координатам на проецируемой карте) и на модели головы.
  • Перенос. Перенос вертексов вычисляется с помощью данных реперных точек на модели лица и на отсканированной модели лица. При переносе точка, находящаяся ровно посередине между глазами на модели головы, выравнивается с соответствующей точкой на карте смещения. Для вычисления этой средней точки мы используем реперные точки глаз, получаем среднюю точку между ними, а затем преобразуем ее с помощью матрицы ортогональной проекции, которую мы использовали при получении карты смещения и цветовой карты.
  • Поворот. В этом примере предполагается, что отсканированная модель лица уже выровнена по осям, ее не требуется поворачивать. Тем не менее в графическом пользовательском интерфейсе предусмотрены элементы управления поворотом для удобства пользователей.
  •  

Рисунок 8. Полученная цветовая карта (слева) ортогонально проецируется на модель головы. Карта преобразуется и масштабируется таким образом, чтобы совпали желтые точки привязки между глазами

Рендеринг

В этом примере карта смещения и цветовая карта применяются во время рендеринга в вертексном шейдере и в пиксельном шейдере.

Вертексный шейдер

Вертексный шейдер смещает вдоль оси Z координаты вертексов модели на основе карты смещения. Координаты текстуры карты смещения передаются в пиксельный шейдер, где они используются для получения цветовой карты для смешения цветов.

Этапы работы вертексного шейдера

  1. Преобразование положения вертексов матрицей проецирования карт для получения координат текстур на цветовой карте и карте смещения.
  2. Получение текстуры карты смещения по вычисленным координатам.
  3. Преобразование значения на карте смещения в значение по оси Z в пространстве модели. Диапазон и масштаб карты смещения проходят через постоянный буфер.
  4. Смешение между значением смещения по оси Z и исходным значением по оси Z на основе канала красного цвета в карте управления. Карта управления позволяет пользователю выбирать, какие вершины будут смещены, и позволяет применять постепенный плавный переход к смещенному положению.
  5. Передача двухмерных UV-координат карты смещения в пиксельный шейдер, где они используются для получения цветовой карты.

Пиксельный шейдер

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


Рисунок 9. Демонстрация смешения на модели головы без применения карты смещения и цветовой карты

Рисунок 10. Конечный результат, полученный в реальном времени с помощью описываемого примера

Экспорт

Используемая методика применяет несколько уровней смешения в пиксельном шейдере, а также изменяет положение вертексов в вертексном шейдере каждый раз при рендеринге модели. В примере также можно экспортировать полученную текстуру и деформированную модель в OBJ-файл.

Весь процесс получения текстуры и деформации модели по-прежнему происходит в ГП с использованием разновидности исходных шейдеров. Новый вертексный шейдер использует поддержку поточного вывода в Direct3D * для записи вершин после деформации. Вертексный шейдер также использует входные координаты текстуры в качестве выходного положения. Благодаря этому отрисовывается новая наложенная двухмерная текстура.

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


 

Рисунок 11. Экспортированная модель в формате OBJ (слева), составная двухмерная UV-текстура лица, наложенная на двухмерную UV-развертку модели головы

Дополнительные сведения об оптимизации компиляторов см. в уведомлении об оптимизации.

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