ดูวิธีใช้ใบหน้าที่เพิ่มประสิทธิภาพในแอปของคุณเอง
ข้อกำหนดเบื้องต้น
- Xcode เวอร์ชัน 13.0 ขึ้นไป
- CocoaPods 1.4.0 ขึ้นไปหากใช้ CocoaPods
- อุปกรณ์ Apple ที่ใช้ ARKit ได้ซึ่งใช้ iOS 12.0 ขึ้นไป (ต้องใช้เป้าหมายการติดตั้งใช้งาน iOS 12.0 ขึ้นไป)
สร้างและเรียกใช้แอปตัวอย่าง
โปรดดูขั้นตอนโดยละเอียดที่การเริ่มต้นอย่างรวดเร็ว
- โคลนหรือดาวน์โหลด ARCore SDK สําหรับ iOS จาก GitHub เพื่อรับโค้ดแอปตัวอย่าง
- เปิดหน้าต่างเทอร์มินัลและเรียกใช้
pod install
จากโฟลเดอร์ที่มีโปรเจ็กต์ Xcode อยู่ - เปิดแอปตัวอย่างใน Xcode เวอร์ชัน 10.3 ขึ้นไป และเชื่อมต่ออุปกรณ์กับเครื่องสำหรับพัฒนาซอฟต์แวร์ผ่าน USB โปรดตรวจสอบว่าคุณสร้างจากไฟล์
.xcworkspace
ไม่ใช่ไฟล์.xcodeproj
เพื่อหลีกเลี่ยงข้อผิดพลาดในการสร้าง - กด Cmd+R หรือคลิก Run ใช้อุปกรณ์จริงเพื่อทำงานกับ Augmented Faces แทนเครื่องจำลอง
- แตะ "ตกลง" เพื่อให้กล้องมีสิทธิ์เข้าถึงแอปตัวอย่าง แอปควรเปิดกล้องหน้าและติดตามใบหน้าของคุณในฟีดกล้องทันที คุณควรวางรูปหูสุนัขจิ้งจอกเหนือหน้าผากทั้ง 2 ด้าน และวางจมูกของสุนัขจิ้งจอกไว้บนจมูก
ภาพรวมของการใช้ใบหน้าที่เพิ่มประสิทธิภาพในแอป
นําเข้า *.scn
ไฟล์ไปยัง Xcode
หากต้องการเพิ่มชิ้นงานของคุณเอง เช่น พื้นผิวและโมเดล 3 มิติ ลงในใบหน้าที่ตรวจพบในแอป ให้ลากชิ้นงาน *.scn
ไปยัง Xcode
เริ่มต้นเซสชันใบหน้าที่เพิ่มประสิทธิภาพ
หากต้องการใช้ Augmented Faces API จากแอป ให้เริ่มต้นเซสชัน Augmented Faces เซสชันนี้รับหน้าที่ถ่ายภาพจากกล้องที่ 60 fps และจะแสดงการอัปเดตใบหน้าแบบไม่พร้อมกันไปยังวิธีผู้รับมอบสิทธิ์ เมื่อเริ่มต้น ให้ส่งผ่านช่องมุมมองของอุปกรณ์จับภาพ และตรวจสอบว่าได้กำหนดผู้รับมอบสิทธิ์แล้ว
// Session takes a float for field of view
let faceSession = try? GARAugmentedFaceSession(fieldOfView: cameraFieldOfView)
faceSession?.delegate = self
ส่งรูปภาพจากกล้องไปยังเซสชัน
เมื่อเริ่มต้นและกำหนดค่าเซสชันอย่างถูกต้องแล้ว แอปของคุณจะเริ่มส่งรูปภาพจากกล้องไปยังเซสชันได้ แอปตัวอย่างจะรับภาพจากกล้องโดยสร้าง AVCaptureSession
ที่มีเฟรมวิดีโอจากกล้องหน้า
ตัวอย่างโค้ดต่อไปนี้แสดงการใช้งานวิธีการมอบสิทธิ์เอาต์พุตสำหรับการจับภาพของ AVFoundation
ซึ่งจะส่งรูปภาพ การประทับเวลา และการหมุนเวียนการจดจำไปยังเซสชันใบหน้าของคุณ
func captureOutput(_ output: AVCaptureOutput,
didOutput sampleBuffer: CMSampleBuffer,
from connection: AVCaptureConnection) {
faceSession.update(with: imageBuffer,
timestamp: frameTime,
recognitionRotation: rotationDegrees)
}
หลังจากประมวลผลรูปภาพแล้ว Augmented Faces API จะส่ง Callback ที่ได้รับมอบสิทธิ์ซึ่งแสดงผล GARAugmentedFaceFrame
โดยมีวัตถุ Augmented Face ที่ช่วยให้คุณแนบเอฟเฟกต์กับใบหน้าได้ นอกจากนี้ยังมีบัฟเฟอร์รูปภาพและการประทับเวลาที่คุณส่งไปยังเมธอดการอัปเดตด้วย ซึ่งมีประโยชน์ในการซิงค์เอฟเฟ็กต์ของใบหน้ากับรูปภาพ ออบเจ็กต์นี้ยังมีการเปลี่ยนรูปแบบการแสดงผลและเมทริกซ์การฉายภาพเพื่อให้คุณตั้งค่าโลก 3 มิติและมุมมอง 2 มิติในลักษณะที่ช่วยให้เรนเดอร์เอฟเฟกต์ใบหน้าที่ปรากฏแนบกับใบหน้าที่ตรวจพบได้ง่าย
var face: GARAugmentedFace? { get }
var capturedImage: CVPixelBuffer { get }
var timestamp: TimeInterval { get }
การวางแนวเมชใบหน้า
โปรดสังเกตการวางแนวของเมชใบหน้าสำหรับ iOS
ใช้พื้นผิว 2 มิติกับด้าน
แอปตัวอย่างมีคลาสสำหรับแปลงใบหน้าที่เพิ่มประสิทธิภาพเป็นออบเจ็กต์ SCNGeometry
คุณใช้เรขาคณิตนี้เพื่อแนบกับโหนด SceneKit ได้อย่างง่ายดาย ซึ่งจะวางไว้ที่การเปลี่ยนรูปแบบของใบหน้าที่เพิ่มสมจริง
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
ระบบจะโหลดพื้นผิวของด้าน 2 มิติเป็น UIImage
และตั้งค่าเป็นวัสดุที่ยึดอยู่กับรูปทรงเรขาคณิตของโครงหน้า
faceTextureMaterial = SCNMaterial()
faceTextureMaterial.diffuse.contents = UIImage(named:@"face.png")
faceMesh?.firstMaterial = faceTextureMaterial
ติดวัตถุ 3 มิติกับใบหน้า
GARAugmentedFace
ที่ได้รับจาก Callback ที่ได้รับมอบสิทธิ์มีภูมิภาคที่แตกต่างกัน 3 ภูมิภาค หรือการเปลี่ยนรูปแบบที่คุณสามารถใช้เพื่อแนบเนื้อหากับใบหน้าได้ การเปลี่ยนรูปแบบเหล่านี้ช่วยให้คุณจับจมูก บริเวณด้านซ้ายของหน้าผาก และด้านขวาของหน้าผากในพื้นที่โลกได้ ที่นี่ใช้การเปลี่ยนรูปแบบจมูกเพื่อแนบทรงกลมกับจมูก
// 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)
นำเข้าชิ้นงานของคุณเองไปยัง Xcode
หากต้องการเพิ่มชิ้นงาน เช่น พื้นผิวและโมเดล 3 มิติให้กับใบหน้าที่ตรวจพบในแอป ให้นำเข้าเนื้อหาไปยัง Xcode ก่อน
- ส่งออกไฟล์
*.dae
(โมเดล 3 มิติ) - ลากไฟล์
*.dae
ลงในโปรเจ็กต์ Xcode - แปลงไฟล์เป็นรูปแบบ
.scn
ใน Xcode โดยไปที่ Editor > Convert to SceneKit scene file format (.scn)