ใช้ความลึกแบบ Raw ในแอป AR Foundation สำหรับ Android

Raw Depth API ให้ข้อมูลความลึกสำหรับรูปภาพจากกล้องที่มีความแม่นยำสูงกว่าข้อมูล Depth API แบบเต็ม แต่อาจไม่ครอบคลุมทุกพิกเซลเสมอไป รูปภาพความชัดลึกดิบพร้อมกับรูปภาพความเชื่อมั่นที่ตรงกันยังประมวลผลเพิ่มเติมได้ด้วย ซึ่งช่วยให้แอปใช้เฉพาะข้อมูลความชัดลึกที่มีความแม่นยำเพียงพอสำหรับกรณีการใช้งานแต่ละรายการได้

ความเข้ากันได้ของอุปกรณ์

ข้อมูลความลึกแบบ RAW พร้อมใช้งานในอุปกรณ์ทั้งหมดที่รองรับ Depth API Raw Depth API เช่นเดียวกับ Depth API แบบสมบูรณ์ ไม่จำเป็นต้องใช้เซ็นเซอร์ความลึกของฮาร์ดแวร์ที่รองรับ เช่น เซ็นเซอร์ Time-of-Flight (ToF) อย่างไรก็ตาม ทั้ง Raw Depth API และ Depth API แบบเต็มจะใช้เซ็นเซอร์ฮาร์ดแวร์ที่รองรับซึ่งอุปกรณ์อาจมี

Raw Depth API กับ Full Depth API

Raw Depth API ให้ค่าประมาณความลึกที่แม่นยำกว่า แต่ภาพความลึกแบบ RAW อาจไม่มีค่าประมาณความลึกสำหรับพิกเซลทั้งหมดในรูปภาพจากกล้อง ในทางตรงกันข้าม Depth API แบบสมบูรณ์จะให้ค่าความลึกโดยประมาณสำหรับทุกพิกเซล แต่ข้อมูลความลึกต่อพิกเซลอาจมีความแม่นยำน้อยกว่าเนื่องจากการปรับให้เรียบและการหาค่าประมาณความลึก รูปแบบและขนาดของรูปภาพความลึกจะเหมือนกันในทั้ง 2 API มีเพียงเนื้อหาเท่านั้นที่แตกต่างกัน

ตารางต่อไปนี้แสดงความแตกต่างระหว่าง Raw Depth API กับ Full Depth API โดยใช้รูปภาพเก้าอี้และโต๊ะในห้องครัว

API การคืนสินค้า รูปภาพจากกล้อง รูปภาพแบบความลึก รูปภาพความเชื่อมั่น
Raw Depth API
  • รูปภาพความลึกแบบ RAW ที่มีค่าประมาณความลึกที่แม่นยำมากสำหรับพิกเซลบางพิกเซลในรูปภาพจากกล้อง
  • รูปภาพความเชื่อมั่นที่แสดงระดับความเชื่อมั่นของพิกเซลภาพความลึกแบบ RAW ทุกพิกเซล พิกเซลรูปภาพจากกล้องที่ไม่มีค่าประมาณความลึกจะมีค่าความเชื่อมั่นเป็น 0
Full Depth API
  • รูปภาพความลึกที่ "ปรับให้เรียบ" รูปเดียวซึ่งมีค่าความลึกโดยประมาณสำหรับทุกพิกเซล
  • API นี้ไม่มีรูปภาพความเชื่อมั่น
ไม่มี

รูปภาพความเชื่อมั่น

ในรูปภาพความเชื่อมั่นที่ Raw Depth API แสดงผล พิกเซลที่สว่างกว่าจะมีค่าความเชื่อมั่นสูงกว่า โดยพิกเซลสีขาวแสดงถึงความเชื่อมั่นเต็มรูปแบบ และพิกเซลสีดําแสดงถึงความไม่เชื่อมั่น โดยทั่วไปแล้ว บริเวณในรูปภาพจากกล้องที่มีพื้นผิวมากกว่า เช่น ต้นไม้ จะมีความเชื่อมั่นของข้อมูลเชิงลึกแบบดิบสูงกว่าบริเวณที่ไม่มีพื้นผิว เช่น ผนังเปล่า พื้นผิวที่ไม่มีพื้นผิวมักจะให้ค่าความเชื่อมั่นเป็น 0

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

ต้นทุนของ Compute

ค่าใช้จ่ายในการประมวลผลของ Raw Depth API อยู่ที่ประมาณครึ่งหนึ่งของค่าใช้จ่ายในการประมวลผลสำหรับ Depth API แบบเต็ม

กรณีการใช้งาน

Raw Depth API ช่วยให้คุณได้รับภาพความลึกที่แสดงเรขาคณิตของวัตถุในฉากอย่างละเอียดยิ่งขึ้น ข้อมูลความลึกดิบจะมีประโยชน์เมื่อสร้างประสบการณ์ AR ที่ต้องการความแม่นยำและความซับซ้อนของรายละเอียดความลึกมากขึ้นสำหรับงานการทำความเข้าใจเรขาคณิต กรณีการใช้งานบางส่วนมีดังนี้

  • การสร้างภาพ 3 มิติ
  • การวัดผล
  • การตรวจจับรูปร่าง

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

โปรดทำความเข้าใจแนวคิดพื้นฐานเกี่ยวกับ AR และวิธีกำหนดค่าเซสชัน ARCore ก่อนดำเนินการต่อ

เปิดใช้ความลึก

ในเซสชัน ARCore ใหม่ ให้ตรวจสอบว่าอุปกรณ์ของผู้ใช้รองรับฟีเจอร์ความลึกหรือไม่ อุปกรณ์ที่เข้ากันได้กับ ARCore บางรุ่นไม่รองรับ Depth API เนื่องจากข้อจำกัดด้านกำลังการประมวลผล ระบบจะปิดใช้ความลึกใน ARCore โดยค่าเริ่มต้นเพื่อประหยัดทรัพยากร เปิดใช้โหมดความลึกเพื่อให้แอปใช้ Depth API

var occlusionManager = // Typically acquired from the Camera game object.

// Check whether the user's device supports the Depth API.
if (occlusionManager.descriptor?.supportsEnvironmentDepthImage)
{
    // If depth mode is available on the user's device, perform
    // the steps you want here.
}

รับภาพความลึกแบบ RAW ล่าสุด

เรียกใช้ AROcclusionManager.TryAcquireEnvironmentDepthCpuImage() และใช้ AROcclusionManager.environmentDepthTemporalSmoothingRequested เพื่อรับภาพความลึกแบบ RAW ล่าสุดใน CPU

รับภาพความเชื่อมั่นเกี่ยวกับความลึกแบบ RAW ล่าสุด

เรียกใช้ AROcclusionManager.TryAcquireEnvironmentDepthConfidenceCpuImage() และใช้ AROcclusionManager.environmentDepthTemporalSmoothingRequested เพื่อรับรูปภาพความเชื่อมั่นใน CPU

// Attempt to get the latest environment depth image.
if (occlusionManager && occlusionManager.TryAcquireEnvironmentDepthConfidenceCpuImage(out XRCpuImage image))
{
    using (image)
    {
        UpdateRawImage(m_RawEnvironmentDepthConfidenceImage, image);
    }
}
else
{
    m_RawEnvironmentDepthConfidenceImage.enabled = false;
}