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

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 استفاده کند.

int32_t is_depth_supported = 0;

// Check whether the user's device supports the Depth API.
ArSession_isDepthModeSupported(ar_session, AR_DEPTH_MODE_AUTOMATIC,
                               &is_depth_supported);
ArConfig* ar_config = NULL;
ArConfig_create(ar_session, &ar_config);
if (is_depth_supported) {
  ArConfig_setDepthMode(ar_session, ar_config, AR_DEPTH_MODE_AUTOMATIC);
}
CHECK(ArSession_configure(ar_session, ar_config) == AR_SUCCESS);
ArConfig_destroy(ar_config);

آخرین تصویر عمق خام را بدست آورید

برای بدست آوردن آخرین تصویر با عمق خام ArFrame_acquireRawDepthImage16Bits() را فراخوانی کنید.

int64_t previous_depth_image_timestamp_ns = -1;
int64_t depth_image_timestamp_ns;
ArImage* depth_image = NULL;

// Acquire the raw depth image for the current frame.
ArStatus acquire_image_status =
    ArFrame_acquireRawDepthImage16Bits(ar_session, ar_frame, &depth_image);

if (acquire_image_status == AR_SUCCESS) {
  // Optional: compare raw depth image timestamps. Use this check if your app
  // uses only new depth data.
  ArImage_getTimestamp(ar_session, depth_image, &depth_image_timestamp_ns);
  if (depth_image_timestamp_ns != previous_depth_image_timestamp_ns) {
    // Raw depth image is based on new depth data.
    previous_depth_image_timestamp_ns = depth_image_timestamp_ns;
    // …
  }
  // Release the acquired image.
  ArImage_release(depth_image);
}

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

آخرین تصویر اعتماد به نفس را بدست آورید

برای بدست آوردن تصویر اطمینان ArFrame_acquireRawDepthConfidenceImage() را فراخوانی کنید. می توانید از تصویر اطمینان برای بررسی دقت هر پیکسل عمق خام استفاده کنید. تصاویر Confidence در فرمت Y8 برگردانده می شوند. هر پیکسل یک عدد صحیح بدون علامت 8 بیتی است. 0 نشان دهنده کمترین اطمینان و 255 بیشترین اطمینان را نشان می دهد.

// Acquire the raw depth confidence image.
ArImage* confidence_image = NULL;
ArStatus acquire_image_status = ArFrame_acquireRawDepthConfidenceImage(
    ar_session, ar_frame, &confidence_image);

if (acquire_image_status == AR_SUCCESS) {
  // …
  // Release the acquired image.
  ArImage_release(confidence_image);
}