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ụngCocoapods
  • Thiết bị Apple tương thích với ARKit chạy iOS 12.0 trở lên (bắt buộc phải 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. 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 và chạy pod install từ thư mục chứa 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 thiết bị thực, chứ 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 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. Ứng dụng này sẽ đặt hình ảnh tai cáo trên cả hai bên trán và đặt mũi cáo lên mũi của 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 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 từ ứng dụng, hãy khởi chạy một phiên Khuôn mặt tăng cường. Phiên này chịu trách nhiệm chụp ảnh bằng máy ảnh ở tốc độ 60 khung hình/giây và sẽ trả về nội dung cập nhật về khuôn mặt cho một phương thức uỷ quyền theo cách không đồng bộ. Khi khởi tạo, 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 đó. Ứng dụng mẫu nhận hình ảnh từ máy ảnh bằng cách tạo AVCaptureSession có cá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 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 xử lý hình ảnh, 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 đã truyề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 một phép biến đổi hiển thị và một 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 các hiệu ứng khuôn mặt xuất hiện gắn liề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 đố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 các đối tượng 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. Các phép biến đổi này cho phép bạn lấy mũi, bên trái trán và bên phải trán trong không gian thế giới. Ở đâ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 thành phần của riêng bạn vào Xcode

Để thêm thành phần (asset) 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 thành định dạng .scn trong Xcode bằng cách chuyển đến Editor > Convert to SceneKit scene file format (.scn).