از Raw Depth در برنامه اندروید خود استفاده کنید

Raw Depth API داده های عمقی را برای یک تصویر دوربین ارائه می دهد که دقت بالاتری نسبت به داده های API عمق کامل دارد، اما همیشه همه پیکسل ها را پوشش نمی دهد. تصاویر عمق خام، همراه با تصاویر اطمینان منطبق با آن‌ها، می‌توانند بیشتر پردازش شوند و به برنامه‌ها اجازه می‌دهد فقط از داده‌های عمقی استفاده کنند که دقت کافی برای موارد استفاده فردی آن‌ها را دارد.

سازگاری دستگاه

Raw Depth در همه دستگاه‌هایی که از Depth API پشتیبانی می‌کنند در دسترس است. Raw Depth API، مانند Depth API کامل، به سنسور عمق سخت افزاری پشتیبانی شده، مانند سنسور زمان پرواز (ToF) نیاز ندارد. با این حال، هم Raw Depth API و هم کامل Depth API از سنسورهای سخت افزاری پشتیبانی شده ای که ممکن است یک دستگاه داشته باشد استفاده می کنند.

Raw Depth API در مقابل 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 حدود نیمی از هزینه محاسباتی برای Depth API کامل است.

موارد استفاده کنید

با استفاده از Raw Depth API، می توانید تصاویر عمقی به دست آورید که نمایش دقیق تری از هندسه اشیاء در صحنه ارائه می دهد. داده‌های عمق خام می‌توانند هنگام ایجاد تجربیات واقعیت افزوده مفید باشند، جایی که دقت عمق و جزئیات بیشتر برای وظایف درک هندسه مورد نیاز است. برخی از موارد استفاده عبارتند از:

  • بازسازی سه بعدی
  • اندازه گیری
  • تشخیص شکل

پیش نیازها

قبل از ادامه، مطمئن شوید که مفاهیم اساسی AR و نحوه پیکربندی یک جلسه ARCore را درک کرده اید.

Depth را فعال کنید

در جلسه ARCore جدید ، بررسی کنید که آیا دستگاه کاربر از عمق پشتیبانی می‌کند یا خیر. همه دستگاه‌های سازگار با ARCore از Depth API به دلیل محدودیت‌های قدرت پردازشی پشتیبانی نمی‌کنند. برای ذخیره منابع، عمق به طور پیش فرض در ARCore غیرفعال است. حالت عمق را فعال کنید تا برنامه شما از Depth API استفاده کند.

جاوا

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() را فراخوانی کنید. می توانید از تصویر اطمینان برای بررسی دقت هر پیکسل عمق خام استفاده کنید. تصاویر Confidence در فرمت 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.
}

بعدش چی