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

var face: GARAugmentedFace? { get }
var capturedImage: CVPixelBuffer { get }
var timestamp: TimeInterval { get }

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

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

ใช้พื้นผิว 2 มิติกับใบหน้า

แอปตัวอย่างมีคลาสสำหรับแปลง Augmented Face เป็นออบเจ็กต์ 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 ที่ได้รับจากโค้ดเรียกกลับที่ได้รับมอบสิทธิ์มี 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)