iOS 適用的擴增臉部開發人員指南

瞭解如何在自家應用程式中使用擴增人物。

必要條件

  • Xcode 13.0 以上版本
  • 如果使用 Cocoapods,請使用 1.4.0 以上版本
  • 搭載 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。請使用實體裝置 (而非模擬器) 操作擴增實境臉孔功能。
  5. 輕觸「OK」授予示範應用程式攝影機存取權。應用程式應會開啟前置鏡頭,並立即在攝影機影像中追蹤你的臉。這項效果會在你的額頭兩側放置狐狸耳朵圖片,並在你的鼻子上放置狐狸鼻子圖片。

在應用程式中導入擴增實境臉孔功能的總覽

*.scn 檔案匯入 Xcode

如要在應用程式中為偵測到的臉部新增您自己的紋理和 3D 模型等素材資源,請將 *.scn 素材資源拖曳至 Xcode。

初始化擴增臉孔工作階段

如要在應用程式中使用 Augmented Faces API,請初始化 Augmented Faces 工作階段。這個工作階段會負責以 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 的委派回呼。其中包含擴增臉部物件,可協助您將特效套用至臉部。它還包含您傳入更新方法的圖片緩衝區和時間戳記。這項功能可用於將臉部特效同步至圖片。這個物件也會提供顯示轉換和投影矩陣,確保您能以簡單的方式設定 3D 世界和 2D 檢視畫面,以便將臉部特效附加至偵測到的臉部。

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

臉部網格方向

請注意 iOS 臉部網格的位置:

將 2D 紋理套用至臉部

範例應用程式提供可將擴增臉孔轉換為 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. 前往 Editor > Convert to SceneKit scene file format (.scn),將檔案轉換為 Xcode 中的 .scn 格式。