คู่มือนักพัฒนาซอฟต์แวร์ใบหน้า Augmented Faces สำหรับ iOS

ดูวิธีใช้ Augmented Faces ในแอปของคุณเอง

ข้อกำหนดเบื้องต้น

  • Xcode เวอร์ชัน 13.0 ขึ้นไป
  • CocoaPods 1.4.0 ขึ้นไปหากใช้ CocoaPods
  • อุปกรณ์ Apple ที่เข้ากันได้กับ ARKit ซึ่งใช้ iOS 12.0 ขึ้นไป (ต้องมีเป้าหมายการทำให้ iOS 12.0 ขึ้นไปใช้งานได้)

สร้างและเรียกใช้แอปตัวอย่าง

โปรดดูขั้นตอนโดยละเอียดที่การเริ่มต้นอย่างรวดเร็ว

  1. โคลนหรือดาวน์โหลด ARCore SDK สำหรับ iOS จาก GitHub เพื่อรับโค้ดแอปตัวอย่าง
  2. เปิดหน้าต่างเทอร์มินัลและเรียกใช้ pod install จากโฟลเดอร์ที่มีโปรเจ็กต์ Xcode อยู่
  3. เปิดแอปตัวอย่างใน Xcode เวอร์ชัน 10.3 หรือใหม่กว่า แล้วเชื่อมต่ออุปกรณ์กับเครื่องสำหรับการพัฒนาผ่าน USB โปรดตรวจสอบว่าคุณสร้างจากไฟล์ .xcworkspace ไม่ใช่ไฟล์ .xcodeproj เพื่อหลีกเลี่ยงข้อผิดพลาดในการสร้าง
  4. กด Cmd+R หรือคลิก Run ใช้อุปกรณ์จริงเพื่อทำงานกับ Augmented Faces แทนเครื่องจำลอง
  5. แตะ "ตกลง" เพื่อให้กล้องมีสิทธิ์เข้าถึงแอปตัวอย่าง แอปควรเปิดกล้องหน้าและติดตามใบหน้าของคุณในฟีดกล้องทันที คุณควรวางรูปหูสุนัขจิ้งจอกเหนือหน้าผากทั้ง 2 ด้าน และวางจมูกของสุนัขจิ้งจอกไว้บนจมูก

ภาพรวมของการใช้งาน Augmented Faces ในแอป

นําเข้า *.scn ไฟล์ไปยัง Xcode

หากต้องการเพิ่มเนื้อหาของคุณเอง เช่น พื้นผิวและโมเดล 3 มิติไปยังใบหน้าที่ตรวจพบในแอป ให้ลากเนื้อหา *.scn ไปยัง Xcode

เริ่มต้นเซสชัน Augmented Faces

หากต้องการใช้ 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 }

การวางแนวตาข่ายของใบหน้า

โปรดสังเกตการวางแนวของ Face Mesh สำหรับ iOS ดังนี้

วางพื้นผิวแบบ 2 มิติกับด้าน

แอปตัวอย่างมีคลาสสำหรับแปลงใบหน้าเสริมเป็นออบเจ็กต์ SCNGeometry คุณสามารถใช้รูปเรขาคณิตนี้เพื่อยึดติดกับโหนด SceneKit ได้อย่างง่ายดาย ซึ่งจะนำไปวางที่การเปลี่ยนจุดศูนย์กลางของ Augmented Face

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 ก่อน

  1. ส่งออกไฟล์ *.dae (โมเดล 3 มิติ)
  2. ลากไฟล์ *.dae ลงในโปรเจ็กต์ Xcode
  3. แปลงไฟล์เป็นรูปแบบ .scn ใน Xcode โดยไปที่ Editor > Convert to SceneKit scene file format (.scn)