适用于 iOS 的增强人脸开发者指南

了解如何在您自己的应用中使用增强人脸功能。

前提条件

  • Xcode 版本 13.0 或更高版本
  • CocoaPods 1.4.0 或更高版本(如果使用 Cocoapods)
  • 运行 iOS 12.0 或更高版本且与 ARKit 兼容的 Apple 设备 (需要 iOS 12.0 或更高版本的部署目标)

构建和运行示例应用

如需了解详细步骤,请参阅快速入门

  1. 从 GitHub 克隆或下载 ARCore SDK for iOS,以获取示例应用代码。
  2. 打开终端窗口,然后从 Xcode 项目所在的文件夹运行 pod install
  3. 在 Xcode 10.3 或更高版本中打开示例应用,并通过 USB 将设备连接到开发机器。为避免构建错误,请确保从 .xcworkspace 文件(而非 .xcodeproj 文件)进行构建。
  4. 按 Cmd + R 键或点击 Run。使用实体设备(而不是模拟器)来使用 Augmented Faces。
  5. 点按“确定”以授予相机对示例应用的访问权限。应用应打开前置摄像头,并立即在摄像头画面中跟踪您的面孔。此功能应将狐狸耳朵图片置于额头两侧,并用狐狸鼻子遮住自己的鼻子。

在应用中实现 Augmented Faces 的概览

*.scn 文件导入 Xcode

如需将您自己的资源(例如纹理和 3D 模型)添加到应用中检测到的人脸,请将 *.scn 资源拖动到 Xcode 中。

初始化 Augmented Faces 会话

如需在您的应用中使用 Augmented Faces API,请初始化一个 Augmented Faces 会话。此会话负责以 60 fps 的速度接收相机图像,并将异步返回人脸更新给 delegate 方法。初始化时,只需传递拍摄设备的视野范围,并确保已设置委托。

// 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)
}

图片处理完毕后,Augmented Faces API 会发送一个返回 GARAugmentedFaceFrame 的委托回调。它包含“增强面部”对象,可帮助您为面部添加特效。它还包含图像缓冲区以及您向更新方法中传递的时间戳。这对于将人脸效果同步到图片非常有用。此对象还为您提供了显示转换和投影矩阵,以确保您能以适当的方式设置 3D 世界和 2D 视图,以便轻松渲染显示在检测到的人脸上的人脸效果。

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

人脸网格方向

请注意 iOS 人脸网格的方向:

对面应用 2D 纹理

示例应用提供了一个类,用于将增强面部转换为 SCNGeometry 对象。您可以使用此几何图形轻松附加到 SceneKit 节点,该节点将放置在 Augmented Face 的中心转换处。

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. 在 Xcode 中转到 Editor > Convert to SceneKit scene file format (.scn),将文件转换为 .scn 格式。