Руководство разработчика Augmented Faces для iOS

Узнайте, как использовать дополненные лица в своих приложениях.

Предварительные условия

  • Xcode версии 13.0 или новее
  • Cocoapods 1.4.0 или новее, если вы используете Cocoapods
  • ARKit-совместимое устройство Apple под управлением iOS 12.0 или более поздней версии (требуется цель развертывания iOS 12.0 или более поздней версии)

Создайте и запустите пример приложения.

Подробные инструкции см. в кратком руководстве .

  1. Клонируйте или загрузите ARCore SDK для iOS с GitHub, чтобы получить пример кода приложения.
  2. Откройте окно терминала и запустите pod install из папки, где существует проект Xcode.
  3. Откройте пример приложения в Xcode версии 10.3 или новее и подключите устройство к компьютеру разработки через USB. Чтобы избежать ошибок сборки, убедитесь, что вы выполняете сборку из файла .xcworkspace , а не из файла .xcodeproj .
  4. Нажмите Cmd+R или нажмите Run . Для работы с дополненными лицами используйте физическое устройство, а не симулятор.
  5. Нажмите «ОК», чтобы предоставить камере доступ к примеру приложения. Приложение должно открыть переднюю камеру и сразу же отследить ваше лицо в кадре камеры. На обе стороны лба следует разместить изображения лисьих ушей, а на собственный нос — лисьий нос.

Обзор реализации дополненных лиц в вашем приложении

Импортируйте файлы *.scn в Xcode.

Чтобы добавить свои собственные ресурсы, такие как текстуры и 3D-модели, к обнаруженному лицу в вашем приложении, перетащите ресурс *.scn в Xcode.

Инициализация сеанса дополненных лиц

Чтобы использовать API Augmented Faces из вашего приложения, инициализируйте сеанс Augmented Faces. Этот сеанс отвечает за съемку изображений с камеры со скоростью 60 кадров в секунду и асинхронно возвращает обновления лиц методу делегата. При инициализации просто передайте поле зрения устройства захвата и убедитесь, что вы установили делегата.

// Session takes a float for field of view
let faceSession = try? GARAugmentedFaceSession(fieldOfView: cameraFieldOfView)
faceSession?.delegate = self

Передача изображений с камеры в сеанс

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

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

func captureOutput(_ output: AVCaptureOutput,
                     didOutput sampleBuffer: CMSampleBuffer,
                     from connection: AVCaptureConnection) {

     faceSession.update(with: imageBuffer,
                        timestamp: frameTime,
                        recognitionRotation: rotationDegrees)
}

После обработки изображения API Augmented Faces отправляет обратный вызов делегата, который возвращает GARAugmentedFaceFrame . Он содержит объект Augmented Face, который помогает добавлять эффекты к лицу. Он также содержит буфер изображения и метку времени, которую вы передали в метод обновления. Это полезно для синхронизации эффектов лица с изображениями. Этот объект также предоставляет вам преобразование отображения и матрицу проекции, чтобы вы могли настроить трехмерный мир и двухмерные представления таким образом, чтобы можно было легко визуализировать эффекты вашего лица, которые кажутся прикрепленными к обнаруженному лицу.

var face: GARAugmentedFace? { get }
var capturedImage: CVPixelBuffer { get }
var timestamp: TimeInterval { get }

Ориентация сетки лица

Обратите внимание на ориентацию сетки лица для iOS:

Примените 2D-текстуру к лицу

Приложение Sample предоставляет класс для преобразования вашего дополненного лица в объект SCNGeometry . Вы можете использовать эту геометрию, чтобы легко прикрепить к узлу SceneKit, который вы поместите в преобразование «Центр дополненного лица».

let faceNode = SCNNode()

// Gets the most recent frame's face
let face = faceSession.currentFrame?.face

// This is instantiated once, not with every frame
let faceGeometryConverter = FaceMeshGeometryConverter()

// Converts Augmented Face to SCNGeometry object
let faceMesh = faceGeometryConverter.geometryFromFace(face)

// Assigns geometry to node and sets the pose
faceNode.geometry = faceMesh
faceNode.simdTransform = face.centerTransform

2D-текстура лица загружается как UIImage и задается материалом, прикрепленным к геометрии сетки лица.

faceTextureMaterial = SCNMaterial()
faceTextureMaterial.diffuse.contents = UIImage(named:@"face.png")

faceMesh?.firstMaterial = faceTextureMaterial

Прикрепите 3D-объекты к лицу

GARAugmentedFace полученный от обратного вызова делегата, предоставляет 3 различных региона или преобразования, которые вы можете использовать для прикрепления контента к лицу. Эти преобразования позволяют вам получить нос, левую и правую часть лба в мировом пространстве. Здесь преобразование носа используется для прикрепления сферы к носу.

// Create node and add to scene
let node = SCNNode(geometry: SCNSphere(radius: .02))
sceneView.rootNode.addChild(node)

// Every frame updates the node's position
node.simdWorldTransform = session.currentFrame.face.transform(for: .nose)

Импортируйте свои собственные ресурсы в Xcode.

Чтобы добавить такие ресурсы , как текстуры и 3D-модели, к обнаруженному лицу в вашем приложении, сначала импортируйте ресурсы в Xcode.

  1. Экспортируйте файл *.dae (3D-модель).
  2. Перетащите файл *.dae в проект Xcode.
  3. Преобразуйте файл в формат .scn в Xcode, выбрав Editor > Convert to SceneKit scene file format (.scn) .