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

ดูวิธีใช้ใบหน้าที่เพิ่มประสิทธิภาพในแอปของคุณเอง

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

  • 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 ด้าน และวางจมูกของสุนัขจิ้งจอกไว้บนจมูก

ภาพรวมของการใช้ใบหน้าที่เพิ่มประสิทธิภาพในแอป

นําเข้า *.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 ก่อน

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