ดูวิธีใช้ใบหน้าที่เพิ่มประสิทธิภาพในแอปของคุณเอง
ข้อกำหนดเบื้องต้น
- 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 ใช้อุปกรณ์จริง ไม่ใช่เครื่องจำลอง เพื่อใช้งานฟีเจอร์ใบหน้าที่เพิ่มประสิทธิภาพ
- แตะ "ตกลง" เพื่อให้สิทธิ์เข้าถึงกล้องแก่แอปตัวอย่าง แอปควรเปิดกล้องหน้าและติดตามใบหน้าของคุณในฟีดกล้องทันที โดยควรวางรูปหูหมาป่าไว้ที่หน้าผากทั้ง 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 จะส่งการเรียกกลับของตัวแทนที่แสดงผล GARAugmentedFaceFrame
ซึ่งมีออบเจ็กต์ใบหน้าที่ผ่านการเพิ่มประสิทธิภาพซึ่งจะช่วยคุณแนบเอฟเฟกต์กับใบหน้า รวมถึงมีบัฟเฟอร์รูปภาพและการประทับเวลาที่ส่งไปยังเมธอดการอัปเดตด้วย ซึ่งมีประโยชน์ในการซิงค์เอฟเฟกต์ใบหน้ากับรูปภาพ ออบเจ็กต์นี้ยังมีการเปลี่ยนรูปแบบการแสดงผลและเมทริกซ์การฉายภาพเพื่อให้คุณตั้งค่าโลก 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 ของ Delegate จะมี 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)