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

瞭解如何在自有應用程式中使用擴增臉孔功能。

必要條件

  • Xcode 13.0 以上版本
  • Cocoapods 1.4.0 以上版本 (如果使用 Cocoapods)
  • 與 ARKit 相容的 Apple 裝置 (搭載 iOS 12.0 以上版本) (需要部署目標為 iOS 12.0 以上版本)
,瞭解如何調查及移除這項存取權。

建構並執行範例應用程式

如需詳細步驟,請參閱快速入門導覽課程

  1. 從 GitHub 複製或下載 iOS 版 ARCore SDK,取得範例應用程式的程式碼。
  2. 開啟「終端機」視窗,然後從 Xcode 專案所在的資料夾執行 pod install
  3. 在 Xcode 10.3 以上版本中開啟範例應用程式,並透過 USB 將裝置連接至開發機器。為避免建構錯誤,請務必使用 .xcworkspace 檔案 (而非 .xcodeproj 檔案) 進行建構。
  4. 按下 Cmd+R 鍵,或按一下 Run。如要使用擴增臉孔功能,請使用實體裝置,而非模擬器。
  5. 輕觸「確定」即可授權相機存取範例應用程式。應用程式應開啟前置鏡頭,並透過攝影機畫面立即追蹤你的臉孔。它應該將狐狸的耳朵放在額頭的兩側,並將狐狸的鼻子放在您的鼻子上。

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

*.scn 檔案匯入 Xcode

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

初始化擴增臉孔工作階段

如要從應用程式使用 Augmented Faces API,請初始化擴增 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 節點,以便放置在擴增 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. 前往 Editor > Convert to SceneKit scene file format (.scn),將檔案轉換為 Xcode 的 .scn 格式。
,瞭解如何調查及移除這項存取權。