अपने Android ऐप्लिकेशन में रॉ डेप्थ का इस्तेमाल करें

रॉ डेप्थ एपीआई, ऐसी कैमरा इमेज के लिए डेप्थ का डेटा उपलब्ध कराता है जो फ़ुल डेप्थ एपीआई के डेटा से ज़्यादा सटीक होती है. हालांकि, इसमें हर पिक्सल की जानकारी शामिल नहीं होती. रॉ डेप्थ इमेज और उनसे मेल खाने वाली कॉन्फ़िडेंस इमेज को भी प्रोसेस किया जा सकता है. इससे ऐप्लिकेशन, सिर्फ़ उस डेप्थ डेटा का इस्तेमाल कर पाएंगे जो उनके अलग-अलग इस्तेमाल के उदाहरण के लिए सटीक हो.

मेरे डिवाइस पर यह सुविधा काम नहीं करती

रॉ डेप्थ की सुविधा, डेप्थ एपीआई के साथ काम करने वाले सभी डिवाइसों पर उपलब्ध है. फ़ुल डेप्थ एपीआई की तरह रॉ डेप्थ एपीआई के लिए, काम करने वाले हार्डवेयर डेप्थ सेंसर की ज़रूरत नहीं होती. जैसे, फ़्लाइट का टाइम-ऑफ़-फ़्लाइट (ToF) सेंसर. हालांकि, रॉ डेप्थ एपीआई और फ़ुल डेप्थ एपीआई, दोनों ही ऐसे हार्डवेयर सेंसर का इस्तेमाल करते हैं जो डिवाइस पर काम करते हैं.

रॉ डेप्थ एपीआई बनाम पूरी डेप्थ एपीआई

रॉ डेप्थ एपीआई, ज़्यादा सटीक होने के साथ गहराई का अनुमान देता है. हालांकि, ऐसा हो सकता है कि रॉ डेप्थ वाली इमेज में, कैमरा इमेज के सभी पिक्सल के लिए गहराई के अनुमान शामिल न हों. इसके उलट, पूरी डेप्थ एपीआई हर पिक्सल के लिए अनुमानित डेप्थ की जानकारी देता है. हालांकि, डेप्थ के अनुमान को बेहतर तरीके से इस्तेमाल करने और इंटरपोलेशन की वजह से, हर पिक्सल की डेप्थ का डेटा कम सटीक हो सकता है. दोनों एपीआई में, डेप्थ इमेज का फ़ॉर्मैट और साइज़ एक जैसा है. सिर्फ़ कॉन्टेंट अलग होता है.

नीचे दी गई टेबल में, रॉ डेप्थ एपीआई और फ़ुल डेप्थ एपीआई के बीच के अंतर को दिखाया गया है. इसके लिए, किचन में मौजूद कुर्सी और टेबल की इमेज का इस्तेमाल किया गया है.

एपीआई रिटर्न कैमरे की इमेज डेप्थ इमेज कॉन्फ़िडेंस इमेज
रॉ डेप्थ एपीआई
  • गहराई वाली रॉ इमेज, जिसमें कैमरा इमेज के कुछ पिक्सल के लिए, कुछ पिक्सल के लिए बिलकुल सटीक अनुमान दिया गया हो.
  • एक कॉन्फ़िडेंस इमेज, जो रॉ डेप्थ इमेज के हर पिक्सल के लिए कॉन्फ़िडेंस इमेज देती है. जिन कैमरा इमेज पिक्सल का डेप्थ का अनुमान नहीं लगाया जाता उनका कॉन्फ़िडेंस लेवल शून्य होता है.
पूरी गहराई से एपीआई
  • सिंगल "स्मूद" डेप्थ इमेज, जिसमें हर पिक्सल के लिए डेप्थ का अनुमान होता है.
  • इस एपीआई के साथ कोई कॉन्फ़िडेंस इमेज नहीं दी गई है.
लागू नहीं

कॉन्फ़िडेंस इमेज

रॉ डेप्थ एपीआई से मिलने वाली कॉन्फ़िडेंस इमेज में, हल्के पिक्सल का कॉन्फ़िडेंस वैल्यू ज़्यादा होती है. इसमें, सफ़ेद पिक्सल और काले रंग के पिक्सल से कोई कॉन्फ़िडेंस वैल्यू नहीं मिलती. आम तौर पर, कैमरा इमेज में मौजूद उन इलाकों की रॉ डेप्थ कॉन्फ़िडेंस इन जगहों के मुकाबले ज़्यादा होती है जहां ऐसा नहीं होता. जैसे, पेड़. जैसे: खाली दीवार. बिना बनावट वाली सतहें आम तौर पर शून्य मानती हैं.

अगर टारगेट किए गए डिवाइस में, काम करने वाला हार्डवेयर डेप्थ सेंसर मौजूद है, तो इमेज में कैमरे के काफ़ी करीब मौजूद जगहों पर भरोसे की संभावना ज़्यादा होगी. भले ही, उनमें कोई बनावट न हो.

कंप्यूट कॉस्ट

रॉ डेप्थ एपीआई की कंप्यूट लागत, फ़ुल डेप्थ एपीआई के लिए कंप्यूट की कुल लागत का आधा होता है.

उपयोग के उदाहरण

रॉ डेप्थ एपीआई की मदद से, इमेज की गहराई से जुड़ी जानकारी इकट्ठा की जा सकती है. इससे सीन में मौजूद ऑब्जेक्ट की ज्यामिति के बारे में ज़्यादा जानकारी मिलती है. एआर डेप्थ का रॉ डेटा, एआर के अनुभवों को बनाते समय काफ़ी मददगार हो सकता है. इसमें ज्यामिति को समझने वाले टास्क के लिए, ज़्यादा सटीक जानकारी और डेप्थ की ज़रूरत होती है. इस्तेमाल के कुछ उदाहरण:

  • 3D रीकंस्ट्रक्शन
  • आकलन
  • आकार का पता लगाना

ज़रूरी शर्तें

पक्का करें कि आपको एआर के बुनियादी सिद्धांतों के बारे में पता हो साथ ही, आगे बढ़ने से पहले ARCore सेशन को कॉन्फ़िगर करने का तरीका जानें.

डेप्थ की सुविधा चालू करें

नए ARCore सेशन में, देखें कि उपयोगकर्ता के डिवाइस पर 'डेप्थ' सुविधा काम करती है या नहीं. प्रोसेसिंग पावर कम होने की वजह से, ARCore के साथ काम करने वाले सभी डिवाइस, डेप्थ एपीआई के साथ काम नहीं करते. संसाधन सेव करने के लिए, ARCore पर डिफ़ॉल्ट रूप से 'डेप्थ' सेटिंग बंद होती है. अपने ऐप्लिकेशन में डेप्थ एपीआई इस्तेमाल करने के लिए, डेप्थ मोड चालू करें.

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() को कॉल करें. रॉ डेप्थ एपीआई के ज़रिए दिखाए गए सभी इमेज पिक्सल में डेप्थ डेटा शामिल नहीं होगा. साथ ही, हर 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.
}

आगे क्या होगा

  • रॉ डेप्थ कोडलैब की मदद से, रॉ डेप्थ की मदद से अपना ऐप्लिकेशन बनाने का तरीका जानें.