ใช้ความลึกของไฟล์ข้อมูลในแอป NDK ของ Android

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

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

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

Raw Depth API เทียบกับ Depth API แบบเต็ม

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

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

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

รูปภาพแสดงความมั่นใจ

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

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

ต้นทุนการประมวลผล

ต้นทุนการประมวลผลของ Raw Depth API คิดเป็นประมาณครึ่งหนึ่งของต้นทุนการประมวลผลสำหรับ Depth API ทั้งหมด

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

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

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

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

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

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

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

int32_t is_depth_supported = 0;

// Check whether the user's device supports the Depth API.
ArSession_isDepthModeSupported(ar_session, AR_DEPTH_MODE_AUTOMATIC,
                               &is_depth_supported);
ArConfig* ar_config = NULL;
ArConfig_create(ar_session, &ar_config);
if (is_depth_supported) {
  ArConfig_setDepthMode(ar_session, ar_config, AR_DEPTH_MODE_AUTOMATIC);
}
CHECK(ArSession_configure(ar_session, ar_config) == AR_SUCCESS);
ArConfig_destroy(ar_config);

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

เรียกใช้ ArFrame_acquireRawDepthImage16Bits() เพื่อรับรูปภาพความลึกซึ่งเป็นข้อมูลดิบล่าสุด

int64_t previous_depth_image_timestamp_ns = -1;
int64_t depth_image_timestamp_ns;
ArImage* depth_image = NULL;

// Acquire the raw depth image for the current frame.
ArStatus acquire_image_status =
    ArFrame_acquireRawDepthImage16Bits(ar_session, ar_frame, &depth_image);

if (acquire_image_status == AR_SUCCESS) {
  // Optional: compare raw depth image timestamps. Use this check if your app
  // uses only new depth data.
  ArImage_getTimestamp(ar_session, depth_image, &depth_image_timestamp_ns);
  if (depth_image_timestamp_ns != previous_depth_image_timestamp_ns) {
    // Raw depth image is based on new depth data.
    previous_depth_image_timestamp_ns = depth_image_timestamp_ns;
    // …
  }
  // Release the acquired image.
  ArImage_release(depth_image);
}

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

รับรูปภาพความเชื่อมั่นล่าสุด

โทรหา ArFrame_acquireRawDepthConfidenceImage() เพื่อรับรูปภาพความเชื่อมั่น คุณใช้รูปภาพความเชื่อมั่นเพื่อตรวจสอบความแม่นยำของพิกเซลความลึกแบบ RAW แต่ละรายการได้ ระบบจะส่งรูปภาพแสดงความมั่นใจในรูปแบบ Y8 แต่ละพิกเซลเป็นจำนวนเต็ม 8 บิตที่ไม่มีเครื่องหมาย 0 หมายถึงความเชื่อมั่นน้อยที่สุด ขณะที่ 255 หมายถึงค่าสูงสุด

// Acquire the raw depth confidence image.
ArImage* confidence_image = NULL;
ArStatus acquire_image_status = ArFrame_acquireRawDepthConfidenceImage(
    ar_session, ar_frame, &confidence_image);

if (acquire_image_status == AR_SUCCESS) {
  // …
  // Release the acquired image.
  ArImage_release(confidence_image);
}