Как сделать 3D модель из AVDepthData?

Меня интересует вопрос обработки данных с камеры TrueDepth. Необходимо получить данные лица человека, построить 3D-модель лица и сохранить эту модель в файле .obj.

Поскольку в 3D-модели необходимо присутствие глаз и зубов человека, то ARKit / SceneKit не подходит, потому что ARKit / SceneKit не заполняет эти области данными.

Но с помощью библиотеки SceneKit.ModelIO мне удалось экспортировать ARSCNView.scene (тип SCNScene) в формате .obj. Я попытался взять за основу этот проект: https://developer.apple.com/documentation/avfoundation/cameras_and_media_capture/streaming_depth_data_from_the_truedepth_camera

В этом проекте работа с TrueDepth Camera осуществляется с использованием Metal, но, если я не ошибаюсь, MTKView, отрендеренный с помощью Metal, не является 3D-моделью и не может быть экспортирован как .obj.

Скажите, пожалуйста, есть ли способ экспортировать MTKView в SCNScene или напрямую в .obj? Если такого метода нет, то как сделать 3D модель из AVDepthData?

Спасибо.


person K. Orlov    schedule 23.10.2018    source источник
comment
@ Орлову повезло?   -  person Mayank Jain    schedule 14.09.2020


Ответы (1)


Можно сделать 3D-модель из AVDepthData, но, вероятно, это не то, что вам нужно. Один буфер глубины - это просто двумерный массив значений пиксельного расстояния от камеры. Итак, единственная «модель», из которой вы получаете, не очень трехмерна; это просто карта высот. Это означает, что вы не можете смотреть на него сбоку и видеть контуры, которые вы не могли бы увидеть спереди. (Пример кода «Использование данных глубины», приложенный к докладу WWDC 2017 о глубинной фотографии показывает пример этого.)

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


можно получить экспортируемую модель из ARKit, используя ввод-вывод модели. Схема необходимого кода выглядит примерно так:

  1. Получите ARFaceGeometry из сеанса отслеживания лиц.

  2. Создайте MDLMeshBuffers из массивов геометрии лица vertices, textureCoordinates и triangleIndices. (Apple отмечает, что массивы координат текстуры и индексов треугольников никогда не меняются, поэтому вам нужно создать их только один раз - вершины, которые вы должны обновлять каждый раз, когда получаете новый кадр.)

  3. Создайте MDLSubmesh из индексного буфера и MDLMesh из под-сетки плюс буферы координат вершин и текстуры. (При желании можно использовать MDLMesh функции для создания буфера нормалей вершин после создания сетки.)

  4. Создайте пустой MDLAsset и добавьте к нему сетку.

  5. Экспортируйте MDLAsset в URL-адрес (указав URL-адрес с расширением файла .obj, чтобы он предполагал формат, который вы хотите экспортировать).

Эта последовательность вообще не требует SceneKit (или Metal, или какой-либо способности отображать сетку), что может оказаться полезным в зависимости от ваших потребностей. Если вы действительно хотите задействовать SceneKit и Metal, вы, вероятно, можете пропустить несколько шагов:

  1. Создайте ARSCNFaceGeometry на своем устройстве Metal и передайте ему ARFaceGeometry из сеанса отслеживания лица.

  2. Используйте MDLMesh(scnGeometry:), чтобы получить представление модели ввода-вывода этой геометрии, затем выполните шаги 4–5 выше, чтобы экспортировать ее в файл .obj.


Как бы то ни было ... если моделирование глаз и зубов является строгим требованием, ни один из вариантов, предоставляемых Apple, вам не поможет, потому что ни один из них этого не делает. Итак, немного пищи для размышлений:

  • Подумайте, является ли это строгим требованием?
  • Воспроизвести всю работу Apple, чтобы сделать собственный вывод модели лица из последовательностей цветных + глубинных изображений?
  • Чит на моделирование глаз с использованием сфер с центром в соответствии с _17 _ / _ 18_, сообщенным ARKit?
  • Обмануть моделирование зубов с помощью pre- сделали модель зубов, составленную для отображения с геометрией лица, предоставленной ARKit? (Составьте свою модель внутренней челюсти с помощью одного открытого-закрытого сустава и используйте ARKit blendShapes[.jawOpen], чтобы оживить ее рядом с лицом.)
person rickster    schedule 24.10.2018