了解如何在您自己的应用中使用增强现实人脸。
前提条件
- Xcode 13.0 或更高版本
- 如果使用 Cocoapods,则需要 Cocoapods 1.4.0 或更高版本
- 搭载 iOS 12.0 或更高版本且支持 ARKit 的 Apple 设备(部署目标必须为 iOS 12.0 或更高版本)
构建和运行示例应用
如需了解详细步骤,请参阅快速入门。
- 从 GitHub 克隆或下载 ARCore SDK for iOS,以获取示例应用代码。
- 打开一个终端窗口,然后从 Xcode 项目所在的文件夹中运行
pod install
。 - 在 Xcode 10.3 或更高版本中打开示例应用,然后通过 USB 将设备连接到开发机器。为避免构建错误,请确保您是从
.xcworkspace
文件(而非.xcodeproj
文件)进行构建。 - 按 Cmd+R 或点击 Run。请使用实体设备(而非模拟器)处理增强现实人脸。
- 点按“确定”以向示例应用授予相机使用权限。该应用应会打开前置摄像头,并立即在相机画面中跟踪您的脸部。它会在您的额头两侧放置狐狸耳朵的图片,并在您的鼻子上放置狐狸鼻子的图片。
在应用中实现增强现实人脸的概览
将 *.scn
文件导入 Xcode
如需在应用中向检测到的面部添加您自己的资源(例如纹理和 3D 模型),请将 *.scn
资源拖动到 Xcode 中。
初始化增强现实人脸会话
如需在应用中使用增强现实人脸 API,请初始化增强现实人脸会话。此会话负责以 60 fps 的帧速率拍摄相机图片,并将人脸更新异步返回给代理方法。在初始化时,只需传递捕获设备的视野范围,并确保设置委托。
// 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
的代理回调。它包含一个增强型人脸对象,可帮助您将特效附加到人脸上。它还包含您传入 update 方法的图片缓冲区和时间戳。这对于将面部特效同步到图片非常有用。此对象还会为您提供显示转换和投影矩阵,以确保您能够以便于渲染附加到检测到的人脸上的面部特效的方式设置 3D 世界和 2D 视图。
var face: GARAugmentedFace? { get }
var capturedImage: CVPixelBuffer { get }
var timestamp: TimeInterval { get }
人脸网格方向
请注意 iOS 面部网格的方向:
对脸部应用 2D 纹理
示例应用提供了一个类,用于将您的增强现实人脸转换为 SCNGeometry
对象。您可以使用此几何图形轻松附加到 SceneKit 节点,并将其放置在增强现实人脸的 Center 转换中。
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 项目中。 - 在 Xcode 中,前往 Editor > Convert to SceneKit scene file format (.scn) 将文件转换为
.scn
格式。