Узнайте, как использовать дополненные лица в своих приложениях.
Предварительные условия
- Xcode версии 13.0 или новее
- Cocoapods 1.4.0 или новее, если вы используете Cocoapods
- ARKit-совместимое устройство Apple под управлением iOS 12.0 или более поздней версии (требуется цель развертывания iOS 12.0 или более поздней версии)
Создайте и запустите пример приложения.
Подробные инструкции см. в кратком руководстве .
- Клонируйте или загрузите ARCore SDK для iOS с GitHub, чтобы получить пример кода приложения.
- Откройте окно терминала и запустите
pod install
из папки, где существует проект Xcode. - Откройте пример приложения в Xcode версии 10.3 или новее и подключите устройство к компьютеру разработки через USB. Чтобы избежать ошибок сборки, убедитесь, что вы выполняете сборку из файла
.xcworkspace
, а не из файла.xcodeproj
. - Нажмите Cmd+R или нажмите Run . Для работы с дополненными лицами используйте физическое устройство, а не симулятор.
- Нажмите «ОК», чтобы предоставить камере доступ к примеру приложения. Приложение должно открыть переднюю камеру и сразу же отследить ваше лицо в кадре камеры. На обе стороны лба следует разместить изображения лисьих ушей, а на собственный нос — лисьий нос.
Обзор реализации дополненных лиц в вашем приложении
Импортируйте файлы *.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.
- Экспортируйте файл
*.dae
(3D-модель). - Перетащите файл
*.dae
в проект Xcode. - Преобразуйте файл в формат
.scn
в Xcode, выбрав Editor > Convert to SceneKit scene file format (.scn) .