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 ứng dụng của bạn.

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

  • Xcode phiên bản 13.0 trở lên
  • CocoaPs 1.4.0 trở lên nếu sử dụng CocoaPods
  • Thiết bị Apple tương thích với ARKit chạy iOS 12.0 trở lên (cần có mục tiêu triển khai 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. Nhân bản 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 nơi dự án Xcode tồn tại.
  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 xây dựng từ tệp .xcworkspace chứ không phải từ tệp .xcodeproj.
  4. Nhấn Cmd+R hoặc nhấp vào Run. Dùng một thiết bị thực, không phải trình mô phỏng, để làm việc với tính năng Khuôn mặt tăng cường.
  5. Nhấn vào "OK" để cấp cho camera quyền truy cập vào ứng dụng mẫu. Ứng dụng sẽ mở camera 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 camera. Thao tác này nên đặt hình ảnh tai cáo lên cả hai bên trán và đặt một mũi cáo trên mũi của chính bạn.

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 tệp *.scn 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 động phiên Khuôn mặt tăng cường

Để sử dụng API Khuôn mặt tăng cường từ ứ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 trên 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 tạo, bạn chỉ cần truyền trường nhìn của thiết bị chụp và đảm bảo rằng bạn đã đặt lớp 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 trên máy ảnh vào phiên

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

Mã mẫu sau đây cho thấy cách triển khai phương thức uỷ quyền đầu ra chụp ảnh 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.

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 lệnh gọi lại uỷ quyền trả về GARAugmentedFaceFrame. Ứng dụng này có một đối tượng Tăng cường cho khuôn mặt giúp bạn đính kèm hiệu ứng cho khuôn mặt. Phương thức 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. Việc này rất hữu ích trong việc đồng bộ hoá các hiệu ứng khuôn mặt với hình ảnh. Đối tượng này cũng cho bạn một biến đổi hiển thị và ma trận chiếu để đảm bảo rằng bạn có thể thiết lập thế giới 3D và chế độ xem 2D sao cho dễ dàng tạo ra các hiệu ứng khuôn mặt xuất hiện kèm theo 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 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 đối tượng SCNGeometry. Bạn có thể sử dụng hình dạng này để dễ dàng đính kèm vào một nút SceneKit. Bạn sẽ đặt nút này vào điểm biến đổi Trung tâm của khuôn mặt 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 mặt 2D được tải dưới dạng UIImage và được đặt thành vật liệu gắn liền với hình dạng của lưới mặt.

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

faceMesh?.firstMaterial = faceTextureMaterial

Đính kèm 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 vùng hoặc biến đổi mà bạn có thể sử dụng để đính kèm nội dung vào khuôn mặt. Những hành động biến đổi này giúp bạn có được mũi, bên trái trán và trán bên phải trong không gian vũ trụ. Ở đâ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 (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, trước tiên, hãy nhập 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 truy cập vào Editor > Convert to SceneKit scene file format (.scn).