ทำความเข้าใจสภาพแวดล้อมของผู้ใช้ใน Android NDK (C)

ดูวิธีใช้ Scene Semantics API ในแอปของคุณเอง

Scene Semantics API ช่วยให้นักพัฒนาซอฟต์แวร์เข้าใจฉากรอบตัวผู้ใช้ได้ โดยให้ข้อมูลเชิงความหมายแบบเรียลไทม์ที่อิงตามโมเดล ML เมื่อได้รับรูปภาพฉากกลางแจ้ง API จะแสดงผลป้ายกำกับสำหรับแต่ละพิกเซลในชุดคลาสเชิงอรรถศาสตร์ที่มีประโยชน์ เช่น ท้องฟ้า อาคาร ต้นไม้ ถนน ทางเท้า ยานพาหนะ บุคคล และอื่นๆ นอกจากป้ายกำกับพิกเซลแล้ว Scene Semantics API ยังมีค่าความเชื่อมั่นสำหรับป้ายกำกับพิกเซลแต่ละรายการ และวิธีค้นหาความถี่ของป้ายกำกับหนึ่งๆ ในฉากกลางแจ้งที่ใช้งานง่าย

ตัวอย่างรูปภาพอินพุต รูปภาพเชิงอรรถศาสตร์ของป้ายกำกับพิกเซล และรูปภาพความเชื่อมั่นที่เกี่ยวข้องจากซ้ายไปขวา

ตัวอย่างรูปภาพอินพุต รูปภาพความหมาย และรูปภาพความเชื่อมั่นทางความหมาย

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

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

เปิดใช้ความหมายของฉาก

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

ระบบจะปิดใช้ความหมายของฉากใน ARCore โดยค่าเริ่มต้นเพื่อประหยัดทรัพยากร เปิดใช้โหมดเชิงความหมายเพื่อให้แอปใช้ Scene Semantics API

// Check whether the user's device supports the Scene Semantics API.
int32_t is_scene_semantics_supported = 0;
ArSession_isSemanticModeSupported(ar_session, AR_SEMANTIC_MODE_ENABLED, &is_scene_semantics_supported);

// Configure the session for AR_SEMANTIC_MODEL_ENABLED.
ArConfig* ar_config = NULL;
ArConfig_create(ar_session, &ar_config);
if (is_scene_semantics_supported) {
  ArConfig_setSemanticMode(ar_session, ar_config, AR_SEMANTIC_MODE_ENABLED);
}
CHECK(ArSession_configure(ar_session, ar_config) == AR_SUCCESS);
ArConfig_destroy(ar_config);

รับรูปภาพที่สื่อความหมาย

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

ใช้ ArFrame_acquireSemanticImage() เพื่อดูรูปภาพเชิงความหมาย

// Retrieve the semantic image for the current frame, if available.
ArImage* semantic_image = NULL;
if (ArFrame_acquireSemanticImage(ar_session, ar_frame, &semantic_image) != AR_SUCCESS) {
  // No semantic image retrieved for this frame.
  // The output image may be missing for the first couple frames before the model has had a chance to run yet.
  return;
}
// If a semantic image is available, use it here.

รูปภาพเชิงความหมายที่เอาต์พุตควรพร้อมใช้งานหลังจากผ่านไปประมาณ 1-3 เฟรมนับจากเริ่มเซสชัน ทั้งนี้ขึ้นอยู่กับอุปกรณ์

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

นอกจากรูปภาพเชิงอรรถศาสตร์ซึ่งระบุป้ายกำกับสำหรับพิกเซลแต่ละพิกเซลแล้ว API ยังแสดงรูปภาพความเชื่อมั่นของค่าความเชื่อมั่นของพิกเซลที่เกี่ยวข้องด้วย รูปภาพความเชื่อมั่นคือรูปภาพ AR_IMAGE_FORMAT_Y8 โดยที่แต่ละพิกเซลจะสอดคล้องกับค่าในช่วง [0, 255] ซึ่งตรงกับความน่าจะเป็นที่เชื่อมโยงกับป้ายกำกับเชิงอรรถศาสตร์ของแต่ละพิกเซล

ใช้ ArFrame_acquireSemanticConfidenceImage() เพื่อหารูปภาพความเชื่อมั่นทางความหมาย

// Retrieve the semantic confidence image for the current frame, if available.
ArImage* semantic_confidence_image = NULL;
if (ArFrame_acquireSemanticConfidenceImage(ar_session, ar_frame, &semantic_confidence_image) != AR_SUCCESS) {
  // No semantic confidence image retrieved for this frame.
  // The output image may be missing for the first couple frames before the model has had a chance to run yet.
  return;
}
// If a semantic confidence image is available, use it here.

รูปภาพความเชื่อมั่นของเอาต์พุตควรพร้อมใช้งานหลังจากเริ่มเซสชันประมาณ 1-3 เฟรม โดยขึ้นอยู่กับอุปกรณ์

ค้นหาเศษส่วนของพิกเซลสำหรับป้ายกำกับความหมาย

นอกจากนี้ยังค้นหาเศษส่วนของพิกเซลในเฟรมปัจจุบันที่อยู่ในหมวดหมู่เฉพาะได้ เช่น ท้องฟ้า การค้นหานี้มีประสิทธิภาพมากกว่าการแสดงผลรูปภาพเชิงความหมายและการค้นหาแบบพิกเซลสำหรับป้ายกำกับเฉพาะ เศษส่วนที่แสดงผลเป็นค่าจำนวนลอยตัวในช่วง [0.0, 1.0]

ใช้ ArFrame_getSemanticLabelFraction() เพื่อรับเศษส่วนสำหรับป้ายกำกับที่กำหนด

// Retrieve the fraction of pixels for the semantic label sky in the current frame.
float out_fraction = 0.0f;
if (ArFrame_getSemanticLabelFraction(ar_session, ar_frame, AR_SEMANTIC_LABEL_SKY, &out_fraction) != AR_SUCCESS) {
  // No fraction of semantic labels was retrieved for this frame.
}