จะสร้างโมเดล 3 มิติจาก AVDepthData ได้อย่างไร

ฉันสนใจในเรื่องการประมวลผลข้อมูลจาก TrueDepth Camera จำเป็นต้องได้รับข้อมูลใบหน้าของบุคคล สร้างแบบจำลอง 3 มิติของใบหน้า และบันทึกแบบจำลองนี้ในไฟล์ .obj

เนื่องจากในโมเดล 3 มิติจำเป็นต้องมีตาและฟันของบุคคล ดังนั้น ARKit / SceneKit จึงไม่เหมาะ เนื่องจาก ARKit / SceneKit ไม่ได้เติมข้อมูลในพื้นที่เหล่านี้

แต่ด้วยความช่วยเหลือของไลบรารี SceneKit.ModelIO ฉันสามารถส่งออก ARSCNView.scene (ประเภท SCNScene) ในรูปแบบ .obj ได้ ฉันพยายามใช้โปรเจ็กต์นี้เป็นพื้นฐาน: https://developer.apple.com/documentation/avfoundation/cameras_and_media_capture/streaming_allowance_data_from_the_trueallowance_camera

ในโปรเจ็กต์นี้ การทำงานกับ TrueDepth Camera ทำได้โดยใช้ Metal แต่ถ้าจำไม่ผิด MTKView ซึ่งเรนเดอร์โดยใช้ Metal ไม่ใช่โมเดล 3 มิติ และไม่สามารถส่งออกเป็น .obj ได้

โปรดบอกฉันว่ามีวิธีส่งออก MTKView ไปยัง SCNScene หรือโดยตรงไปยัง .obj หรือไม่ หากไม่มีวิธีการดังกล่าว จะสร้างโมเดล 3 มิติจาก AVDepthData ได้อย่างไร

ขอบคุณ.


person K. Orlov    schedule 23.10.2018    source แหล่งที่มา
comment
@Orlov โชคดีไหม?   -  person Mayank Jain    schedule 14.09.2020


คำตอบ (1)


คุณสามารถสร้างโมเดล 3 มิติจาก AVDepthData ได้ แต่นั่นอาจไม่ใช่สิ่งที่คุณต้องการ บัฟเฟอร์เชิงลึกอันหนึ่งก็เป็นเช่นนั้น — อาร์เรย์ 2 มิติของค่าระยะห่างพิกเซลจากกล้อง ดังนั้น "โมเดล" เดียวที่คุณได้รับจากสิ่งนั้นไม่ใช่สามมิติมากนัก มันเป็นเพียงแผนที่ความสูง นั่นหมายความว่าคุณไม่สามารถมองจากด้านข้างและมองเห็นรูปทรงที่คุณไม่สามารถมองเห็นได้จากด้านหน้าได้ (โค้ดตัวอย่าง "การใช้ข้อมูลความลึก" ที่แนบมากับ WWDC 2017 พูดคุยเรื่องการถ่ายภาพเชิงลึก แสดงตัวอย่างสิ่งนี้)

หากคุณต้องการ "โมเดล" ที่เป็น 3 มิติอย่างแท้จริงมากขึ้น เช่นเดียวกับที่ ARKit นำเสนอ คุณจะต้องทำงานแบบที่ ARKit ทำ โดยใช้สีและเฟรมความลึกหลายสีเมื่อเวลาผ่านไป พร้อมด้วยระบบการเรียนรู้ของเครื่องจักรที่ได้รับการฝึกฝนให้เข้าใจใบหน้าของมนุษย์ (และฮาร์ดแวร์ที่ได้รับการปรับให้เหมาะสมสำหรับการรันระบบนั้นอย่างรวดเร็ว) คุณอาจไม่พบว่าการทำเช่นนั้นเป็นตัวเลือกที่ใช้การได้...


เป็นไปได้ ที่จะรับโมเดลที่ส่งออกได้จาก ARKit โดยใช้โมเดล I/O โครงร่างของโค้ดที่คุณต้องการจะเป็นดังนี้:

  1. รับ ARFaceGeometry จากเซสชันการติดตามใบหน้า

  2. สร้าง MDLMeshBuffers จากอาร์เรย์ vertices, textureCoordinates และ triangleIndices ของเรขาคณิตใบหน้า (Apple ตั้งข้อสังเกตว่าพิกัดพื้นผิวและอาร์เรย์ดัชนีสามเหลี่ยมไม่เคยเปลี่ยนแปลง ดังนั้นคุณจึงต้องสร้างสิ่งเหล่านี้เพียงครั้งเดียวเท่านั้น จุดยอดที่คุณต้องอัปเดตทุกครั้งที่คุณได้รับเฟรมใหม่)

  3. สร้าง MDLSubmesh จากบัฟเฟอร์ดัชนี และ MDLMesh จากซับเมชบวกกับบัฟเฟอร์พิกัดจุดยอดและพื้นผิว (หรืออีกทางหนึ่ง ให้ใช้ฟังก์ชัน MDLMesh เพื่อสร้างบัฟเฟอร์จุดยอดปกติหลังจากสร้าง mesh)

  4. สร้าง MDLAsset ว่างๆ และเพิ่ม mesh ลงไป

  5. ส่งออก MDLAsset ไปยัง URL (ระบุ URL ที่มีนามสกุลไฟล์ .obj เพื่อให้อนุมานรูปแบบที่คุณต้องการส่งออก)

ลำดับดังกล่าวไม่จำเป็นต้องใช้ SceneKit (หรือ Metal หรือความสามารถใดๆ ในการ แสดง mesh) เลย ซึ่งอาจเป็นประโยชน์ได้ขึ้นอยู่กับความต้องการของคุณ หากคุณต้องการเกี่ยวข้องกับ SceneKit และ Metal คุณสามารถข้ามขั้นตอนเหล่านี้ไปได้:

  1. สร้าง ARSCNFaceGeometry บนอุปกรณ์ Metal ของคุณและส่ง ARFaceGeometry จากเซสชันการติดตามใบหน้า

  2. ใช้ MDLMesh(scnGeometry:) เพื่อรับการแสดงโมเดล I/O ของเรขาคณิตนั้น จากนั้นทำตามขั้นตอนที่ 4-5 ด้านบนเพื่อส่งออกเป็นไฟล์ .obj


ไม่ว่าคุณจะเฉือนมันด้วยวิธีใดก็ตาม... หากจำเป็นอย่างมากในการสร้างแบบจำลองดวงตาและฟัน ไม่มีตัวเลือกใดที่ Apple ให้มาจะช่วยคุณได้ เพราะไม่มีตัวเลือกใดที่ทำเช่นนั้นได้ ดังนั้นอาหารสำหรับความคิด:

  • พิจารณาว่านั่นเป็นข้อกำหนดที่เข้มงวดหรือไม่?
  • จำลองงานทั้งหมดของ Apple เพื่อทำการอนุมานโมเดลใบหน้าของคุณเองจากลำดับภาพสี + ความลึกหรือไม่
  • โกงการสร้างแบบจำลองดวงตาโดยใช้ทรงกลมที่อยู่กึ่งกลางตาม leftEyeTransform/rightEyeTransform ที่รายงานโดย ARKit หรือไม่
  • โกงการสร้างแบบจำลองฟันโดยใช้ pre- สร้างแบบจำลองของฟัน ซึ่งประกอบด้วยรูปทรงใบหน้าที่ ARKit ให้ไว้เพื่อการแสดงผล (เชื่อมต่อโมเดลกรามด้านในของคุณด้วยข้อต่อแบบเปิด-ปิดเพียงจุดเดียว และใช้ blendShapes[.jawOpen] ของ ARKit เพื่อสร้างภาพเคลื่อนไหวควบคู่ไปกับใบหน้า)
person rickster    schedule 24.10.2018