रॉ डेप्थ एपीआई, किसी कैमरा इमेज के लिए डेप्थ का डेटा देता है. यह डेटा, पूरी डेप्थ एपीआई के डेटा की तुलना में ज़्यादा सटीक होता है. हालांकि, यह हर पिक्सल को कवर नहीं करता. रॉ डेप्थ की इमेज और मिलती-जुलती कॉन्फ़िडेंस इमेज भी प्रोसेस की जा सकती हैं. इससे ऐप्लिकेशन सिर्फ़ डेप्थ वाला सिर्फ़ वह डेटा इस्तेमाल कर पाएंगे जो उनके निजी इस्तेमाल के हिसाब से सटीक होता है.
मेरे डिवाइस पर यह सुविधा काम नहीं करती
रॉ डेप्थ की सुविधा उन सभी ऐसे डिवाइसों पर उपलब्ध है जिन पर डेप्थ एपीआई काम करता है. फ़ुल डेप्थ एपीआई की तरह, रॉ डेप्थ एपीआई को किसी ऐसे हार्डवेयर डेप्थ सेंसर की ज़रूरत नहीं होती जो फ़्लाइट के समय (ToF) सेंसर के साथ काम करता हो. हालांकि, रॉ डेप्थ एपीआई और फ़ुल डेप्थ एपीआई, दोनों ऐसे सभी हार्डवेयर सेंसर का इस्तेमाल करते हैं जो डिवाइस में मौजूद हो सकते हैं.
रॉ डेप्थ एपीआई बनाम फ़ुल डेप्थ एपीआई
रॉ डेप्थ API, ज़्यादा सटीक जानकारी के साथ गहराई का अनुमान देता है. हालांकि, हो सकता है कि रॉ डेप्थ की इमेज में सभी पिक्सल के लिए, कैमरा इमेज में मौजूद गहराई के अनुमान शामिल न हों. इसके उलट, पूरा डेप्थ एपीआई हर पिक्सल के लिए अनुमानित गहराई देता है, लेकिन हर पिक्सल में गहराई का डेटा कम सटीक हो सकता है. ऐसा गहराई के अनुमानों को स्मूदिंग और इंटरपोलेशन से किया जाता है. दोनों एपीआई में, डेप्थ इमेज का फ़ॉर्मैट और साइज़ एक जैसा होता है. सिर्फ़ कॉन्टेंट में अंतर है.
नीचे दी गई टेबल में, रॉ डेप्थ एपीआई और फ़ुल डेप्थ एपीआई के बीच अंतर को दिखाया गया है. इसके लिए, रसोई में कुर्सी और टेबल की इमेज का इस्तेमाल किया गया है.
API | रिटर्न | कैमरे की इमेज | डेप्थ इमेज | कॉन्फ़िडेंस इमेज |
---|---|---|---|---|
रॉ डेप्थ एपीआई |
|
|||
फ़ुल डेप्थ एपीआई |
|
लागू नहीं |
कॉन्फ़िडेंस इमेज
रॉ डेप्थ एपीआई से मिली कॉन्फ़िडेंस इमेज में हल्के रंग की इमेज ज़्यादा कॉन्फ़िडेंस वैल्यू होती हैं. इनमें सफ़ेद पिक्सल पूरे कॉन्फ़िडेंस दिखाते हैं और काले पिक्सल कॉन्फ़िडेंस नहीं दिखाते हैं. आम तौर पर, अगर कैमरा इमेज में ज़्यादा टेक्सचर वाली जगहें होती हैं, जैसे कि पेड़, तो उन इलाकों की तुलना में इन जगहों पर गहराई से प्रोसेस नहीं होती है, जैसे कि खाली दीवार. बिना बनावट वाली सतहें आम तौर पर शून्य का भरोसा देती हैं.
अगर टारगेट डिवाइस में, हार्डवेयर डेप्थ सेंसर काम करता हो, तो इमेज के उन हिस्सों पर भरोसा बढ़ जाता है जो कैमरे के पास होते हैं. भले ही, उन जगहों पर कोई टेक्सचर न हो.
लागत का हिसाब लगाएं
रॉ डेप्थ एपीआई की कंप्यूट कीमत, पूरी डेप्थ एपीआई की पूरी कंप्यूट लागत की आधी होती है.
इस्तेमाल के उदाहरण
रॉ डेप्थ एपीआई की मदद से, डेप्थ की ऐसी इमेज पाई जा सकती हैं जो सीन में मौजूद ऑब्जेक्ट की ज्यामिति को ज़्यादा बेहतर तरीके से दिखाती हों. एआर (ऑगमेंटेड रिएलिटी) के अनुभव बनाने के लिए, रॉ डेप्थ का डेटा काम का हो सकता है. इसमें ज्यामिति को समझने वाले कामों के लिए, ज़्यादा सटीक जानकारी और ज़्यादा सटीक जानकारी की ज़रूरत होती है. इस्तेमाल के कुछ उदाहरणों में ये शामिल हैं:
- 3D रीकंस्ट्रक्शन
- मापें
- आकार का पता लगाने की सुविधा
ज़रूरी शर्तें
आगे बढ़ने से पहले, पक्का करें कि आपने बुनियादी एआर (ऑगमेंटेड रिएलिटी) सिद्धांत और ARCore सेशन को कॉन्फ़िगर करने का तरीका समझ लिया है.
गहराई की सुविधा चालू करें
नए ARCore सेशन में, देखें कि उपयोगकर्ता के डिवाइस पर 'डेंसिटी' सुविधा काम करती है या नहीं. प्रोसेस करने में कम समय लगता है, इसलिए ARCore के साथ काम करने वाले सभी डिवाइस depth API के साथ काम नहीं करते हैं. संसाधनों को सेव करने के लिए, 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. }
आगे क्या होगा
- रॉ डेप्थ कोडलैब की मदद से, रॉ डेप्थ की मदद से अपना ऐप्लिकेशन बनाने का तरीका जानें.