আপনার Android অ্যাপে Raw Depth ব্যবহার করুন

Raw Depth API একটি ক্যামেরা ইমেজের জন্য গভীরতার ডেটা প্রদান করে যার সম্পূর্ণ ডেপথ API ডেটার চেয়ে বেশি নির্ভুলতা রয়েছে, কিন্তু সবসময় প্রতিটি পিক্সেলকে কভার করে না। কাঁচা গভীরতার চিত্রগুলি, তাদের মিলিত আত্মবিশ্বাসের চিত্রগুলির সাথে, আরও প্রক্রিয়া করা যেতে পারে, অ্যাপগুলিকে শুধুমাত্র গভীরতার ডেটা ব্যবহার করার অনুমতি দেয় যা তাদের ব্যক্তিগত ব্যবহারের ক্ষেত্রে যথেষ্ট নির্ভুলতা রয়েছে৷

ডিভাইস সামঞ্জস্য

Depth API সমর্থন করে এমন সমস্ত ডিভাইসে Raw Depth উপলব্ধ। সম্পূর্ণ গভীরতা API-এর মতো Raw Depth API-এর জন্য একটি সমর্থিত হার্ডওয়্যার গভীরতা সেন্সরের প্রয়োজন হয় না, যেমন একটি টাইম-অফ-ফ্লাইট (ToF) সেন্সর। যাইহোক, Raw Depth API এবং full Depth API উভয়ই একটি ডিভাইসে থাকতে পারে এমন কোনো সমর্থিত হার্ডওয়্যার সেন্সর ব্যবহার করে।

Raw Depth API বনাম সম্পূর্ণ Depth API

Raw Depth API উচ্চতর নির্ভুলতার সাথে গভীরতার অনুমান প্রদান করে, তবে অশোধিত গভীরতার চিত্রগুলি ক্যামেরা চিত্রের সমস্ত পিক্সেলের জন্য গভীরতার অনুমান অন্তর্ভুক্ত নাও করতে পারে৷ বিপরীতে, পূর্ণ গভীরতা API প্রতিটি পিক্সেলের জন্য আনুমানিক গভীরতা প্রদান করে, কিন্তু গভীরতার অনুমানের মসৃণতা এবং ইন্টারপোলেশনের কারণে প্রতি-পিক্সেল গভীরতার ডেটা কম সঠিক হতে পারে। উভয় API জুড়ে গভীরতার চিত্রের বিন্যাস এবং আকার একই। শুধুমাত্র বিষয়বস্তু ভিন্ন.

নিচের সারণীটি রান্নাঘরের একটি চেয়ার এবং টেবিলের একটি চিত্র ব্যবহার করে Raw Depth API এবং full Depth API-এর মধ্যে পার্থক্যগুলিকে ব্যাখ্যা করে৷

API রিটার্নস ক্যামেরা ছবি গভীরতার চিত্র আত্মবিশ্বাসের ছবি
Raw Depth API
  • একটি অপরিশোধিত গভীরতার চিত্র যা ক্যামেরার ছবিতে কিছু পিক্সেলের জন্য খুব সঠিক গভীরতার অনুমান ধারণ করে।
  • একটি আত্মবিশ্বাসের ছবি যা প্রতিটি কাঁচা গভীরতার ছবি পিক্সেলের জন্য আত্মবিশ্বাস দেয়। যে ক্যামেরা ইমেজ পিক্সেলগুলিতে গভীরতার অনুমান নেই সেগুলির আত্মবিশ্বাস শূন্য থাকে৷
সম্পূর্ণ গভীরতা API
  • একটি একক "মসৃণ" গভীরতার চিত্র যাতে প্রতিটি পিক্সেলের জন্য একটি গভীরতার অনুমান থাকে৷
  • এই API এর সাথে কোন আস্থার চিত্র প্রদান করা হয় না।
N/A

আত্মবিশ্বাসের ছবি

Raw Depth API দ্বারা প্রত্যাবর্তিত আত্মবিশ্বাসের চিত্রগুলিতে, লাইটার পিক্সেলগুলির আত্মবিশ্বাসের মান বেশি, সাদা পিক্সেলগুলি সম্পূর্ণ আত্মবিশ্বাসের প্রতিনিধিত্ব করে এবং কালো পিক্সেলগুলি অনাস্থার প্রতিনিধিত্ব করে৷ সাধারনত, ক্যামেরা ইমেজে যেসব অঞ্চলে বেশি টেক্সচার আছে, যেমন একটি গাছ, সেসব অঞ্চলের তুলনায় বেশি কাঁচা গভীরতার আত্মবিশ্বাস থাকবে, যেমন একটি ফাঁকা দেয়াল। কোন টেক্সচার ছাড়া পৃষ্ঠ সাধারণত শূন্য একটি আত্মবিশ্বাস ফলন.

যদি টার্গেট ডিভাইসে একটি সমর্থিত হার্ডওয়্যার গভীরতা সেন্সর থাকে, তাহলে ক্যামেরার যথেষ্ট কাছাকাছি ইমেজের জায়গাগুলিতে আত্মবিশ্বাস সম্ভবত উচ্চতর হবে, এমনকি টেক্সচারহীন পৃষ্ঠগুলিতেও।

খরচ গণনা

Raw Depth API-এর কম্পিউট খরচ সম্পূর্ণ ডেপথ API-এর কম্পিউট খরচের প্রায় অর্ধেক।

ব্যবহারের ক্ষেত্রে

Raw Depth API-এর সাহায্যে, আপনি গভীরতার ছবি পেতে পারেন যা দৃশ্যের বস্তুর জ্যামিতির আরও বিস্তারিত উপস্থাপনা প্রদান করে। AR অভিজ্ঞতা তৈরি করার সময় কাঁচা গভীরতার ডেটা উপযোগী হতে পারে যেখানে জ্যামিতি-বোঝার কাজগুলির জন্য গভীরতার নির্ভুলতা এবং বিস্তারিত প্রয়োজন। কিছু ব্যবহারের ক্ষেত্রে অন্তর্ভুক্ত:

  • 3D পুনর্গঠন
  • মাপা
  • আকৃতি সনাক্তকরণ

পূর্বশর্ত

এগিয়ে যাওয়ার আগে নিশ্চিত করুন যে আপনি মৌলিক AR ধারণা এবং কীভাবে একটি ARCore সেশন কনফিগার করবেন তা বুঝতে পেরেছেন।

গভীরতা সক্ষম করুন

একটি নতুন ARCore সেশনে , ব্যবহারকারীর ডিভাইস Depth সমর্থন করে কিনা তা পরীক্ষা করুন৷ প্রসেসিং পাওয়ার সীমাবদ্ধতার কারণে সমস্ত ARCore-সামঞ্জস্যপূর্ণ ডিভাইস ডেপথ API সমর্থন করে না। সম্পদ সংরক্ষণ করতে, ARCore-এ ডিফল্টরূপে গভীরতা অক্ষম করা হয়। আপনার অ্যাপ ডেপথ এপিআই ব্যবহার করতে গভীরতা মোড সক্ষম করুন।

জাভা

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);

কোটলিন

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 সর্বাধিক নির্দেশ করে।

জাভা

// 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.
}

কোটলিন

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 কোডল্যাবের মাধ্যমে কীভাবে Raw Depth দিয়ে আপনার নিজস্ব অ্যাপ তৈরি করবেন তা শিখুন।