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 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 bạn sử dụng Cocoapods
- 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.
- 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.
- Mở cửa sổ Dòng lệnh và chạy
pod install
từ thư mục chứa dự án Xcode. - 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 tạo bản dựng từ tệp
.xcworkspace
chứ không phải tệp.xcodeproj
. - 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.
- Nhấn vào "OK" để cấp quyền truy cập vào máy ảnh cho ứng dụng mẫu. Ứng dụng sẽ mở máy ảnh mặt 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. Phần này sẽ đặ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 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 chạy phiên Augmented Faces
Để 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 chạy, bạn chỉ cần truyền trường nhìn của thiết bị chụp và đảm bảo bạn đã đặt người được 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 máy ảnh đến phiên
Giờ đây, 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 máy ảnh đế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 đầu ra chụp của AVFoundation
. Phương thức này sẽ truyền hình ảnh, dấu thời gian và góc xoay nhận dạng đến phiên nhận dạng khuôn mặt.
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 Augmented Faces sẽ gửi một lệnh gọi lại uỷ quyền trả về GARAugmentedFaceFrame
. Tệp này chứa một đối tượng Augmented Face (Khuôn mặt tăng cường) giúp bạn đính kèm hiệu ứng vào 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 khuôn mặt
Lưu ý hướng của lưới khuôn mặt cho 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. Bạn sẽ đặt nút này tại phép 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
Kết cấu 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ới 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 của người được uỷ quyền cung cấp 3 vùng hoặc phép biến đổi khác nhau mà bạn có thể sử dụng để đính kèm nội dung vào mặt đồng hồ. 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, phép biến đổi mũi được dùng để đính 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 (chẳng hạ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.
- Xuất tệp
*.dae
(mô hình 3D). - Kéo tệp
*.dae
vào dự án Xcode. - 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).