שימוש ב'עומק גולמי' באפליקציית Android

Raw Depth API מספק נתוני עומק לתמונת מצלמה ברמת דיוק גבוהה יותר מאשר נתוני Full Depth API, אבל לא תמיד מכסה כל פיקסל. בנוסף, ניתן להמשיך לעבד תמונות עומק גולמיות ותמונות מהימנות תואמות, וכך האפליקציות יכולות להשתמש רק בנתוני העומק שרמת הדיוק שלהם מתאימה לתרחיש הספציפי שלהם.

אין לי מכשיר תואם

נתוני עומק גולמי זמינים בכל המכשירים שתומכים ב-Depth API. ב-Raw Depth API, כמו ב-Full Depth API, אין צורך בחיישן עומק של חומרה נתמך, כמו חיישן בזמן הטיסה (ToF). עם זאת, גם ה-Raw Depth API וגם ה-Full Depth API משתמשים בכל חיישני החומרה הנתמכים שקיימים במכשיר.

Raw Depth API לעומת full Depth API

Raw Depth API מספק הערכות עומק ברמת דיוק גבוהה יותר, אבל יכול להיות שתמונות עומק גולמיות לא יכללו הערכות עומק של כל הפיקסלים בתמונת המצלמה. לעומת זאת, ה-Full עומק API מספק אומדן של העומק לכל פיקסל, אבל נתוני העומק לכל פיקסל עשויים להיות פחות מדויקים בגלל החלקה ואינטרפולציה של אומדני עומק. הפורמט והגודל של תמונות עומק זהים בשני ממשקי ה-API. רק התוכן שונה.

הטבלה הבאה ממחישה את ההבדלים בין Raw Depth API לבין Full Depth API, באמצעות תמונה של כיסא ושולחן במטבח.

API החזרות תמונת מצלמה תמונת עומק תמונת מהימנות
ממשק API גולמי של עומק
  • תמונה של עומק גולמי שמכילה הערכת עומק מדויקת מאוד לחלק מהפיקסלים בתמונת המצלמה, אך לא לכולם.
  • תמונת מהימנות שנותנת את הביטחון לכל פיקסל של תמונה בעומק גולמי. רמת הסמך של פיקסלים של תמונות מצלמה ללא הערכת עומק היא אפס.
ממשק API של עומק מלא
  • תמונת עומק 'חלקית' אחת שמכילה הערכת עומק לכל פיקסל.
  • ל-API הזה סופקה תמונה לא מהימנה.
לא רלוונטי

תמונות מהימנות

בתמונות מהימנות שהוחזרו על ידי Raw Depth API, לפיקסלים בהירים יש ערכי סמך גבוהים יותר, עם פיקסלים לבנים שמייצגים רמת מהימנות מלאה ופיקסלים שחורים שמייצגים אי-אמינות. באופן כללי, באזורים בתמונה של המצלמה שיש להם יותר מרקם, כמו עץ, רמת המהימנות של העומק גולמי גבוהה יותר מאשר באזורים שאין בהם מסך ריק, כמו קיר ריק. משטחים ללא מרקם בדרך כלל מניבים ערך ודאי של אפס.

אם מכשיר היעד כולל חיישן עומק נתמך של עומק החומרה, רמת הסמך של האזורים בתמונה שקרובים מספיק למצלמה תהיה גבוהה יותר, גם במשטחים ללא מרקם.

עלות מחשוב

עלות המחשוב של Raw Depth API היא כמחצית מעלות המחשוב של Full Depth API.

תרחישים לדוגמה

באמצעות Raw Depth API, אפשר לקבל תמונות עומק שמספקות ייצוג מפורט יותר של הגאומטריה של האובייקטים בסצנה. נתוני עומק גולמיים יכולים להיות שימושיים כשיוצרים חוויות AR שבהן צריך לשפר את הדיוק והפרטים של העומק כדי שמשימות של הבנה גיאומטרית. תרחישים לדוגמה:

  • שחזור בתלת ממד
  • מדידה
  • זיהוי צורות

דרישות מוקדמות

לפני שממשיכים, חשוב לוודא שאתם מבינים את המושגים הבסיסיים של AR ואת האופן שבו מגדירים סשן של ARCore.

הפעלת העומק

בסשן חדש של ARCore, צריך לבדוק אם מכשיר של משתמש תומך בעומק. לא כל המכשירים שתואמים ל-ARCore תומכים ב-Depth API בגלל אילוצי כוח עיבוד. כברירת מחדל, כדי לחסוך במשאבים, העומק מושבת ב-ARCore. כדי שהאפליקציה תשתמש ב-Depth API, צריך להפעיל את מצב העומק.

Java

Config config = session.getConfig();

// Check whether the user's device supports Depth.
if (session.isDepthModeSupported(Config.DepthMode.AUTOMATIC)) {
  // Enable depth mode.
  config.setDepthMode(Config.DepthMode.AUTOMATIC);
}
session.configure(config);

Kotlin

if (session.isDepthModeSupported(Config.DepthMode.AUTOMATIC)) {
  session.configure(session.config.apply { depthMode = Config.DepthMode.AUTOMATIC })
}

קבלת התמונות העדכניות ביותר של אמינות ועומק גולמי

אפשר להתקשר אל frame.acquireRawDepthImage16Bits() כדי לקבל את תמונת העומק הגולמית. לא כל הפיקסלים של התמונות שמוחזרים דרך Raw Depth API יכילו נתוני עומק, ולא כל מסגרת ARCore תכיל תמונה חדשה של עומק גולמי. כדי לקבוע אם תמונת העומק הגולמיים של המסגרת הנוכחית היא חדשה, צריך להשוות את חותמת הזמן שלה לחותמת הזמן של תמונת העומק הגולמיים הקודמת. אם חותמות הזמן שונות, תמונת העומק הגולמית מבוססת על נתוני עומק חדשים. אחרת, תמונת העומק היא היטל מחדש של נתוני העומק הקודמים.

צריך להתקשר אל frame.acquireRawDepthConfidenceImage() כדי להשיג את תמונת הביטחון. ניתן להשתמש בתמונת המהימנות כדי לבדוק את הדיוק של כל פיקסל עומק גולמי. תמונות רווחיות מוחזרות בפורמט Y8. כל פיקסל הוא מספר שלם לא חתום בגודל 8 ביט. הערך 0 מציין את רמת המהימנות הנמוכה ביותר, ואילו 255 מציין את רמת המהימנות הגבוהה ביותר.

Java

// Use try-with-resources, so that images are released automatically.
try (
// Depth image is in uint16, at GPU aspect ratio, in native orientation.
Image rawDepth = frame.acquireRawDepthImage16Bits();
    // Confidence image is in uint8, matching the depth image size.
    Image rawDepthConfidence = frame.acquireRawDepthConfidenceImage(); ) {
  // Compare timestamps to determine whether depth is is based on new
  // depth data, or is a reprojection based on device movement.
  boolean thisFrameHasNewDepthData = frame.getTimestamp() == rawDepth.getTimestamp();
  if (thisFrameHasNewDepthData) {
    ByteBuffer depthData = rawDepth.getPlanes()[0].getBuffer();
    ByteBuffer confidenceData = rawDepthConfidence.getPlanes()[0].getBuffer();
    int width = rawDepth.getWidth();
    int height = rawDepth.getHeight();
    someReconstructionPipeline.integrateNewImage(depthData, confidenceData, width, height);
  }
} catch (NotYetAvailableException e) {
  // Depth image is not (yet) available.
}

Kotlin

try {
  // Depth image is in uint16, at GPU aspect ratio, in native orientation.
  frame.acquireRawDepthImage16Bits().use { rawDepth ->
    // Confidence image is in uint8, matching the depth image size.
    frame.acquireRawDepthConfidenceImage().use { rawDepthConfidence ->
      // Compare timestamps to determine whether depth is is based on new
      // depth data, or is a reprojection based on device movement.
      val thisFrameHasNewDepthData = frame.timestamp == rawDepth.timestamp
      if (thisFrameHasNewDepthData) {
        val depthData = rawDepth.planes[0].buffer
        val confidenceData = rawDepthConfidence.planes[0].buffer
        val width = rawDepth.width
        val height = rawDepth.height
        someReconstructionPipeline.integrateNewImage(
          depthData,
          confidenceData,
          width = width,
          height = height
        )
      }
    }
  }
} catch (e: NotYetAvailableException) {
  // Depth image is not (yet) available.
}

מה השלב הבא?

  • ב-Raw Depth Codelab מוסבר איך ליצור אפליקציה משלכם עם 'עומק גולמי'.