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

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

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

Để sử dụng tính năng Khuôn mặt tăng cường, bạn cần:

  • Xcode phiên bản 10.3 trở lên

  • Cocoapods

  • Thiết bị Apple tương thích với ARKit chạy iOS 11.0 trở lên (yêu cầu triển khai iOS 10.0 trở lên)

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

Hãy xem Hướng dẫn nhanh để biết các bước chi tiết.

  1. Sao chép hoặc tải SDK ARCore cho iOS xuống từ GitHub để lấy mã ứng dụng mẫu.
  2. Mở cửa sổ Thiết bị đầu cuối và 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 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ệ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ị vật lý, chứ không phải trình mô phỏng, để làm việc với các 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 sẽ 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. Hình ảnh này phải đặt hình ảnh tai cáo ở cả hai bên trán và đặt mũi cáo trên mũi của chính bạn.

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

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

Để thêm tài sản của riêng bạn như họa 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 tài sản *.scn vào Xcode.

Khởi tạo phiên sử dụng tính năng Khuôn mặt tăng cường

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

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

Chuyển hình ảnh trong máy ảnh đến phiên hoạt động

Bây giờ, phiên của bạn đã được khởi tạo 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 bằng máy ảnh đến phiên hoạt động. Ứng dụng mẫu lấy ảnh máy ảnh bằng cách tạo AVCaptureSession với các khung video của máy ảnh trước.

Mẫu mã sau đây cho thấy cách triển khai phương thức uỷ quyền đầu ra thu thập của AVFoundation. Phương thức này sẽ chuyển hình ảnh, dấu thời gian và xoay vòng nhận dạng đến 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 Augmented Faces sẽ gửi một lệnh gọi lại ủy quyền để trả về GARAugmentedFaceFrame. Đối tượng này chứa một đối tượng Augmented Face giúp bạn gắn các hiệu ứng vào khuôn mặt. Thẻ này cũng chứa bộ đệ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 bạn đồng bộ hóa 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 tính nă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 chế độ xem 3D và chế độ xem 2D theo cách giúp bạn dễ dàng hiển thị các hiệu ứng khuôn mặt xuất hiện đính kèm 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 khuôn mặt

Xin lưu ý hướng của lưới mặt khuôn mặt cho iOS:

Áp dụng họa 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ể dùng hình học này để dễ dàng đính kèm vào một nút "KitKit" mà bạn sẽ đặt trong phép biến đổi Trung tâm 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

Cấu trúc 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 gắn vào hình dạng của lưới mặt.

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

faceMesh?.firstMaterial = faceTextureMaterial

Gắn đối tượng 3D vào mặt

GARAugmentedFace nhận được từ lệnh gọi lại ủy quyền, cung cấp 3 khu vực khác nhau hoặc 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 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, phép 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 tài sản của riêng bạn vào Xcode

Để thêm tài sản như hoa văn 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 các tài sả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).