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

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