Hướng dẫn dành cho nhà phát triển tính năng Khuôn mặt tăng cường dành cho iOS

Tìm hiểu cách sử dụng tính năng Khuôn mặt tăng cường trong các ứng dụng của riêng bạn.

Điều kiện tiên quyết

  • Xcode phiên bản 13.0 trở lên
  • Cocoapods 1.4.0 trở lên nếu sử dụng Cocoapods
  • Một thiết bị Apple tương thích với ARKit chạy iOS 12.0 trở lên (mục tiêu triển khai bắt buộc đối với iOS 12.0 trở lên)

Xây dựng và chạy ứng dụng mẫu

Hãy xem phần Bắt đầu nhanh để biết các bước chi tiết.

  1. Sao chép hoặc tải SDK ARCore dành cho iOS xuống từ GitHub để lấy mã ứng dụng mẫu.
  2. Mở cửa sổ dòng lệnh rồi chạy pod install từ thư mục có dự án Xcode.
  3. Mở ứng dụng mẫu trong Xcode phiên bản 10.3 trở lên và kết nối thiết bị với máy phát triển của bạn qua USB. Để tránh lỗi bản dựng, hãy đảm bảo bạn đang tạo từ tệp .xcworkspace chứ không phải từ tệp .xcodeproj.
  4. Nhấn tổ hợp phím Cmd+R hoặc nhấp vào Run. Sử dụng một thiết bị thực, chứ không phải trình mô phỏng, để hoạt động với tính năng Khuôn mặt tăng cường.
  5. Nhấn vào "OK" để cấp cho máy ảnh quyền truy cập vào ứng dụng mẫu. Ứng dụng phải mở máy ảnh trước và ngay lập tức theo dõi khuôn mặt của bạn trong nguồn cấp dữ liệu máy ảnh. Bạn nên đặt hình ảnh tai cáo ở cả hai bên trán và đặt mũi cáo lên mũi của mình.

Tổng quan về cách triển khai tính năng Khuôn mặt tăng cường trong ứng dụng

Nhập *.scn tệp vào Xcode

Để thêm các thành phần của riêng bạn (chẳng hạn như hoạ tiết và mô hình 3D) vào một khuôn mặt được phát hiện trong ứng dụng, hãy kéo thành phần *.scn vào Xcode.

Khởi chạy một phiên Dùng khuôn mặt tăng cường

Để sử dụng API Khuôn mặt tăng cường trong ứng dụng, hãy khởi động phiên Khuôn mặt tăng cường. Phiên này chịu trách nhiệm chụp ảnh camera ở tốc độ 60 khung hình/giây và sẽ trả về không đồng bộ các bản cập nhật khuôn mặt cho phương thức uỷ quyền. Khi khởi chạy, bạn chỉ cần truyền trường nhìn của thiết bị chụp và nhớ đặt uỷ quyền.

// Session takes a float for field of view
let faceSession = try? GARAugmentedFaceSession(fieldOfView: cameraFieldOfView)
faceSession?.delegate = self

Truyền hình ảnh của camera đến phiên đào tạo này

Giờ đây, phiên của bạn đã được khởi chạy và định cấu hình đúng cách, nên ứng dụng của bạn có thể bắt đầu gửi hình ảnh camera đến phiên này. Ứng dụng mẫu nhận hình ảnh của camera bằng cách tạo một AVCaptureSession có các khung hình video từ camera trước.

Mã mẫu sau đây cho thấy cách triển khai phương thức uỷ quyền thu thập dữ liệu đầu ra của AVFoundation. Phương thức này truyền hình ảnh, dấu thời gian và chế độ xoay nhận dạng sang phiên khuôn mặt của bạn.

func captureOutput(_ output: AVCaptureOutput,
                     didOutput sampleBuffer: CMSampleBuffer,
                     from connection: AVCaptureConnection) {

     faceSession.update(with: imageBuffer,
                        timestamp: frameTime,
                        recognitionRotation: rotationDegrees)
}

Sau khi hình ảnh được xử lý, API Khuôn mặt tăng cường sẽ gửi một lệnh gọi lại uỷ quyền trả về GARAugmentedFaceFrame. Ứng dụng này có một đối tượng Khuôn mặt tăng cường giúp bạn đính kèm hiệu ứng cho khuôn mặt. Tệp này cũng chứa vùng đệm hình ảnh và dấu thời gian mà bạn đã chuyển vào phương thức cập nhật. Điều này rất hữu ích khi đồng bộ hoá hiệu ứng khuôn mặt với hình ảnh. Đối tượng này cũng cung cấp cho bạn hiệu ứng biến đổi màn hình và ma trận chiếu để đảm bảo bạn có thể thiết lập thế giới 3D và chế độ xem 2D theo cách dễ dàng kết xuất hiệu ứng khuôn mặt xuất hiện được gắn với khuôn mặt được phát hiện.

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

Hướng lưới của mặt

Lưu ý hướng của lưới khuôn mặt đối với iOS:

Áp dụng hoạ tiết 2D cho khuôn mặt

Ứng dụng mẫu cung cấp một lớp để chuyển đổi Khuôn mặt tăng cường thành một đối tượng SCNGeometry. Bạn có thể sử dụng hình học này để dễ dàng đính kèm vào nút SceneKit. Nút này sẽ được đặt khi biến đổi Trung tâm của khuôn mặt được tăng cường.

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

Hoạ tiết khuôn mặt 2D được tải dưới dạng UIImage và được đặt thành một chất liệu được đính kèm vào hình học của lưới mặt.

faceTextureMaterial = SCNMaterial()
faceTextureMaterial.diffuse.contents = UIImage(named:@"face.png")

faceMesh?.firstMaterial = faceTextureMaterial

Gắn vật thể 3D vào khuôn mặt

GARAugmentedFace nhận được từ lệnh gọi lại uỷ quyền, cung cấp 3 khu vực hoặc phép biến đổi mà bạn có thể dùng để đính kèm nội dung vào một khuôn mặt. Những biến đổi này giúp bạn chụp được phần mũi, bên trái trán và bên phải trán trong không gian toàn cầu. Ở đây, biến đổi mũi được dùng để gắn một hình cầu vào mũi.

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

Nhập nội dung của riêng bạn vào Xcode

Để thêm thành phần như hoạ tiết và mô hình 3D vào khuôn mặt được phát hiện trong ứng dụng, trước tiên, hãy nhập các thành phần đó vào Xcode.

  1. Xuất tệp *.dae (mô hình 3D).
  2. Kéo tệp *.dae vào dự án Xcode.
  3. Chuyển đổi tệp sang định dạng .scn trong Xcode bằng cách chuyển đến Editor > Convert to SceneKit scene file format (.scn).