Как сделать 3D модель из AVDepthData? - PullRequest
0 голосов
/ 23 октября 2018

Меня интересует вопрос обработки данных с камеры 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?

Спасибо.

1 Ответ

0 голосов
/ 25 октября 2018

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

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


Это * можно получить экспортируемую модель из ARKit, используя Model I / O.Схема кода, который вам нужен, выглядит примерно так:

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

  2. Создание MDLMeshBuffer s из массивов 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, чтобы сделать свой собственный вывод модели лица из последовательностей изображений цвет + глубина?
  • Обман на моделировании глаз с использованием сфер, центрированных в соответствии с leftEyeTransform / rightEyeTransform, сообщенным ARKit?
  • Обман на моделировании зубов с использованием готовой модели зубов , составленный с помощью предоставленной ARKit геометрии лица для отображения?(Сформулируйте модель внутренней челюсти с помощью одного открытого затвора и используйте ARKit blendShapes[.jawOpen], чтобы оживить ее вдоль лица.)
...