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

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

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

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

Raw Depth API กับ Full Depth API

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

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

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

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

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

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

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

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

Use Case

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

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

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

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

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

ในเซสชัน ARCore ใหม่ ให้ตรวจสอบว่าอุปกรณ์ของผู้ใช้รองรับ Depth หรือไม่ อุปกรณ์ที่เข้ากันได้กับ 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);

รับรูปภาพความลึกจริงล่าสุด

เรียกใช้ 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 ก่อนหน้า หากการประทับเวลาแตกต่างกัน รูปภาพความลึกแบบข้อมูลดิบจะอิงตามข้อมูลความลึกใหม่ มิเช่นนั้น ภาพความชัดลึกจะแสดงภาพความลึกก่อนหน้าอีกครั้ง

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

เรียกใช้ ArFrame_acquireRawDepthConfidenceImage() เพื่อรับรูปภาพความเชื่อมั่น คุณสามารถใช้รูปภาพความเชื่อมั่นเพื่อตรวจสอบความแม่นยำของพิกเซลความลึกดิบแต่ละพิกเซล รูปภาพความเชื่อมั่นจะแสดงในรูปแบบ 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);
}