اخبار محصول

روشن کردن فیدهای دوربین هم‌زمان با «تقویت نور کم»

زمان خواندن: ۷ دقیقه
مشاهده نمایه Donovan McMurray
Donovan McMurray مهندس روابط توسعه‌دهندگان

اخیراً  نحوه فعال کردن کاربران توسط Instagram برای گرفتن عکس‌های خیره‌کننده در نور کم بااستفاده از «حالت شب» را هم‌رسانی کردیم. این ویژگی برای تصاویر ثابت عالی است، جایی که زمان کافی برای ترکیب چندین نوردهی برای ایجاد یک عکس ثابت با کیفیت بالا وجود دارد. اما لحظاتی که بین عکس‌ها اتفاق می‌افتند چه؟ کاربران باید بیشتر از لحظه فشار دادن دکمه شاتر با دوربین تعامل داشته باشند. آن‌ها همچنین از پیش‌دید برای ترکیب‌بندی صحنه یا اسکن کردن رمزینه‌های پاسخ‌سریع استفاده می‌کنند.

امروز می‌خواهیم به تقویت نور کم (LLB) بپردازیم، ویژگی قدرتمندی که برای روشن‌تر کردن جاری‌سازی‌های دوربین هم‌زمان طراحی شده است. برخلاف «حالت شب» که به مدت‌زمان ضبط بدون حرکت نیاز دارد، «بهبود نور کم» به‌طور آنی روی پیش‌نمایش زنده و ضبط‌های ویدیویی شما اعمال می‌شود. «روشنایی در نور کم» به‌طور خودکار میزان روشنایی موردنیاز را براساس نور موجود تنظیم می‌کند، بنابراین برای هر محیطی بهینه شده است.

با به‌روزرسانی اخیر، LLB به کاربران اینستاگرام اجازه می‌دهد عکس‌های عالی بگیرند و سپس پیاده‌سازی «حالت شب» موجود آن‌ها منجر به همان عکس‌های باکیفیت در نور کم می‌شود که کاربرانشان بیش‌از یک سال است از آن لذت می‌برند.

چرا روشنایی هم‌زمان مهم است

درحالی‌که هدف «حالت شب» بهبود کیفیت تصویر نهایی است، هدف «تقویت نور کم» قابلیت استفاده و تعامل در محیط‌های تاریک است. Another important factor to consider is that – even though they work together very well – you can use LLB and Night Mode independently, and you’ll see with some of these use cases, LLB has value on its own when Night Mode photos aren’t needed. در اینجا نحوه بهبود تجربه کاربری توسط LLB آورده شده است:

  • قاب‌بندی و ضبط بهتر: در صحنه‌های کم‌نور، پیش‌نمایش دوربین استاندارد می‌تواند کاملاً سیاه باشد. «عکاسی در نور کم» نمایاب را روشن می‌کند و به کاربران اجازه می‌دهد قبل‌از زدن دکمه شاتر، آنچه را در قاب قرار می‌دهند ببینند. برای این تجربه، می‌توانید از «حالت شب» برای بهترین کیفیت عکس در نور کم استفاده کنید، یا می‌توانید به LLB اجازه دهید نتیجه عکس «آنچه می‌بینید همان چیزی است که دریافت می‌کنید» را به کاربر ارائه دهد.
  • اسکن مطمئن: رمزینه‌های پاسخ‌سریع همه‌جا هستند، اما اسکن کردن آن‌ها در رستوران تاریک یا پارکینگ اغلب ناامیدکننده است. با فید دوربین به‌طور قابل‌توجهی روشن‌تر، الگوریتم‌های اسکن می‌توانند رمزینه‌های پاسخ‌سریع را حتی در محیط‌های بسیار کم‌نور به‌طور مطمئن شناسایی و رمزگشایی کنند.
  • تعاملات بهبودیافته: برای برنامه‌هایی که شامل تعاملات ویدیویی زنده هستند (مانند دستیارهای هوش مصنوعی یا تماس‌های ویدیویی)، LLB مقدار اطلاعات قابل‌درک را افزایش می‌دهد و اطمینان حاصل می‌کند که مدل‌های بینایی رایانه‌ای داده‌های کافی برای کار کردن دارند

The Difference در Instagram

LLB_IG_demo_white_background.gif

تیم مهندسی برنامه Instagram برای Android همیشه سخت در تلاش است تا تجربه دوربینی پیشرفته برای کاربرانش فراهم کند. در مثال بالا می‌توانید ببینید که «نور کم» چه تفاوتی در Pixel 10 Pro ایجاد می‌کند. 

lowlight.png

به‌راحتی می‌توان تصور کرد که این امر چه تفاوتی در تجربه کاربری ایجاد می‌کند. اگر کاربران نتوانند آنچه را ضبط می‌کنند ببینند، احتمال اینکه ضبط را رها کنند بیشتر است. 

lowlight1.png

انتخاب پیاده‌سازی

دو روش برای پیاده‌سازی «تقویت نور کم» وجود دارد تا بهترین تجربه را در گسترده‌ترین طیف دستگاه‌ها ارائه دهد:

  1. حالت نوردهی خودکار تقویت نور کم: این حالت نوردهی خودکار لایه سخت‌افزاری است. این حالت بالاترین کیفیت و عملکرد را ارائه می‌دهد زیرا خط لوله «پردازشگر سیگنال تصویر» (ISP) را مستقیماً تنظیم دقیق می‌کند. همیشه ابتدا این مورد را بررسی کنید.
  2. بهبود نور کم Google: اگر دستگاه از حالت AE پشتیبانی نمی‌کند، می‌توانید به این راهکار نرم‌افزاری ارائه‌شده توسط خدمات Google Play برگردید. این ویژگی پس‌پردازش را روی جاری‌سازی دوربین اعمال می‌کند تا آن را روشن‌تر کند. به‌عنوان یک راه‌حل کاملاً نرم‌افزاری، در دستگاه‌های بیشتری دردسترس است، بنابراین این پیاده‌سازی به شما کمک می‌کند با LLB به دستگاه‌های بیشتری دسترسی پیدا کنید.

Low Light Boost AE Mode (Hardware)

سازوکار:
این حالت در دستگاه‌های دارای Android 15 و جدیدتر پشتیبانی می‌شود و لازم است سازنده اصلی پشتیبانی را در HAL پیاده‌سازی کرده باشد (درحال‌حاضر در دستگاه‌های Pixel 10 دردسترس است). این ویژگی مستقیماً با «پردازشگر سیگنال تصویر» (ISP) دوربین ادغام می‌شود. اگر CaptureRequest.CONTROL_AE_MODE را روی CameraMetadata.CONTROL_AE_MODE_ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY تنظیم کنید، سیستم دوربین کنترل را به‌دست می‌گیرد.

رفتار:
«لایه انتزاعی سخت‌افزار»/«پردازنده سیگنال تصویر» صحنه را تحلیل می‌کند و پارامترهای حسگر و پردازش را تنظیم می‌کند، که اغلب شامل افزایش زمان نوردهی برای روشن‌تر کردن تصویر می‌شود. این کار می‌تواند فریم‌هایی با نسبت سیگنال به نوفه (SNR) به‌طور قابل‌توجهی بهبودیافته تولید کند، زیرا زمان نوردهی طولانی‌تر، به‌جای افزایش بهره حسگر دیجیتال (ISO)، به حسگر اجازه می‌دهد اطلاعات نوری بیشتری را ثبت کند.

مزیت:
به‌دلیل استفاده از مسیرهای سخت‌افزاری اختصاصی، کیفیت تصویر و بهره‌وری انرژی احتمالاً بهتر است.

مبادله:
ممکن است در شرایط بسیار تاریک منجر به نرخ فریم پایین‌تر شود زیرا حسگر به زمان بیشتری برای ثبت نور نیاز دارد. در شرایط نور بسیار کم، نرخ فریم می‌تواند تا ۱۰ فریم در ثانیه کاهش یابد.

Google Low Light Boost (نرم‌افزار ازطریق «خدمات Google Play»)

سازوکار:
این راه‌حل که به‌عنوان ماژول اختیاری ازطریق خدمات Google Play توزیع می‌شود، پس‌پردازش را روی جاری‌سازی دوربین اعمال می‌کند. این دوربین از فناوری پیچیده بهبود تصویر هم‌زمان به‌نام HDRNet استفاده می‌کند.

Google HDRNet:
این مدل یادگیری عمیق تصویر را با وضوح پایین‌تر تحلیل می‌کند تا مجموعه فشرده‌ای از پارامترها (شبکه دوطرفه) را پیش‌بینی کند. سپس این شبکه، بهبود کارآمد و متغیر فضایی تصویر با وضوح کامل را در GPU هدایت می‌کند. این مدل برای روشن‌تر کردن و بهبود کیفیت تصویر در شرایط کم‌نور، با تمرکز بر نمایان بودن چهره، آموزش دیده است.

سازمان‌دهی فرایند:
مدل HDRNet و منطق همراه آن توسط پردازنده «تقویت نور کم» سازمان‌دهی می‌شود. ازجمله:

  1. تحلیل صحنه:
    یک ماشین‌حساب سفارشی که روشنایی واقعی صحنه را بااستفاده از فراداده دوربین (حساسیت حسگر، زمان نوردهی، و غیره) و محتوای تصویر تخمین می‌زند. این تحلیل سطح تقویت را تعیین می‌کند.
  2. پردازش HDRNet:
    مدل HDRNet را برای روشن کردن قاب اعمال می‌کند. مدل استفاده‌شده برای صحنه‌های کم‌نور تنظیم شده است و برای عملکرد هم‌زمان بهینه‌سازی شده است.
  3. ترکیب:
    قاب‌های اصلی و پردازش‌شده HDRNet باهم ترکیب می‌شوند. میزان ادغام اعمال‌شده به‌طور پویا توسط محاسبه‌گر روشنایی صحنه کنترل می‌شود تا انتقال همواری بین حالت‌های تقویت‌شده و تقویت‌نشده تضمین شود.
low-light-boost-processor-diagram.png

مزیت:
روی طیف گسترده‌تری از دستگاه‌ها (درحال‌حاضر از Samsung S22 Ultra،‏ S23 Ultra،‏ S24 Ultra،‏ S25 Ultra، و Pixel 6 تا Pixel 9 پشتیبانی می‌کند) بدون نیاز به پشتیبانی HAL خاص کار می‌کند. نرخ فریم دوربین را حفظ می‌کند زیرا جلوه‌ای پس‌پردازشی است.

مبادله:
به‌عنوان روش پس‌پردازش، کیفیت به اطلاعات موجود در فریم‌های ارائه‌شده توسط حسگر محدود می‌شود. این ویژگی نمی‌تواند جزئیات ازدست‌رفته به‌دلیل تاریکی شدید در سطح حسگر را بازیابی کند.

«بهبود در نور کم» با ارائه مسیرهای سخت‌افزاری و نرم‌افزاری، راه‌حلی مقیاس‌پذیر برای بهبود عملکرد دوربین در نور کم در سراسر بوم‌سازگان Android ارائه می‌دهد. توسعه‌دهندگان باید درصورت دردسترس بودن، حالت AE را در اولویت قرار دهند و از «بهبود نور کم Google» به‌عنوان جایگزین مطمئن استفاده کنند.

پیاده‌سازی «تقویت نور کم» در برنامه شما

اکنون بیایید نحوه پیاده‌سازی هر دو پیشنهاد «آگهی‌های مشتری‌یابی محلی» را بررسی کنیم. چه از CameraX و چه از Camera2 در برنامه‌تان استفاده کنید، می‌توانید موارد زیر را پیاده‌سازی کنید. برای دریافت بهترین نتایج، توصیه می‌کنیم هم «مرحله ۱» و هم «مرحله ۲» را پیاده‌سازی کنید.

مرحله ۱: حالت AE «تقویت نور کم»

«حالت نوردهی خودکار در نور کم» که در دستگاه‌های منتخب دارای Android 15 و بالاتر دردسترس است، به‌عنوان یک حالت «نوردهی خودکار» (AE) خاص عمل می‌کند.

۱. بررسی دردسترس بودن

ابتدا بررسی کنید که آیا دستگاه دوربین از «حالت نوردهی خودکار نور کم» پشتیبانی می‌کند یا نه.

val cameraInfo = cameraProvider.getCameraInfo(cameraSelector)
val isLlbSupported = cameraInfo.isLowLightBoostSupported

۲. فعال کردن «حالت»

اگر پشتیبانی شود، می‌توانید «حالت نوردهی خودکار نور کم» را بااستفاده از شیء CameraControl در CameraX فعال کنید.

// After setting up your camera, use the CameraInfo object to enable LLB AE Mode.
camera = cameraProvider.bindToLifecycle(...)

if (isLlbSupported) {
  try {
    // The .await() extension suspends the coroutine until the
    // ListenableFuture completes. If the operation fails, it throws
    // an exception which we catch below.
    camera?.cameraControl.enableLowLightBoostAsync(true).await()
  } catch (e: IllegalStateException) {
    Log.e(TAG, "Failed to enable low light boost: not available on this device or with the current camera configuration", e)
  } catch (e: CameraControl.OperationCanceledException) {
    Log.e(TAG, "Failed to enable low light boost: camera is closed or value has changed", e)
  }
}

۳. پایش وضعیت

فقط به این دلیل که حالت را درخواست کرده‌اید به این معنی نیست که درحال‌حاضر «تقویت» می‌شود. سیستم فقط زمانی تقویت را فعال می‌کند که صحنه واقعاً تاریک باشد. می‌توانید یک Observer راه‌اندازی کنید تا میانای کاربر شما را به‌روز کند (مانند نمایش نماد ماه) یا بااستفاده از تابع افزونه asFlow() به یک Flow تبدیل کنید.

if (isLlbSupported) {
  camera?.cameraInfo.lowLightBoostState.asFlow().collectLatest { state ->
    // Update UI accordingly
    updateMoonIcon(state == LowLightBoostState.ACTIVE)
  }
}

راهنمای کامل درباره حالت نوردهی خودکار «تقویت نور کم» را می‌توانید در اینجا بخوانید.

مرحله ۲: «تقویت نور کم» Google

برای دستگاه‌هایی که از حالت AE سخت‌افزاری پشتیبانی نمی‌کنند، «بهبود نور کم Google» به‌عنوان جایگزین قدرتمندی عمل می‌کند. این برنامه از LowLightBoostSession برای رهگیری و روشن کردن جاری‌سازی استفاده می‌کند.

۱. افزودن وابستگی‌ها

این ویژگی ازطریق «خدمات Google Play» ارائه می‌شود.

implementation("com.google.android.gms:play-services-camera-low-light-boost:16.0.1-beta06")
// Add coroutines-play-services to simplify Task APIs
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.10.2")

۲. مقداردهی اولیه کارخواه

قبل‌از شروع دوربین، از LowLightBoostClient استفاده کنید تا مطمئن شوید که ماژول نصب شده است و دستگاه پشتیبانی می‌شود.

val llbClient = LowLightBoost.getClient(context)

// Check support and install if necessary
val isSupported = llbClient.isCameraSupported(cameraId).await()
val isInstalled = llbClient.isModuleInstalled().await()

if (isSupported && !isInstalled) {
    // Trigger installation
    llbClient.installModule(installCallback).await()
}

۳. ایجاد جلسه LLB

‫Google LLB هر فریم را پردازش می‌کند، بنابراین باید Surface نمایشگرتان را به LowLightBoostSession بدهید و این API یک Surface به شما برمی‌گرداند که روشن‌سازی روی آن اعمال شده است. برای برنامه‌های Camera2، می‌توانید Surface حاصل را با CaptureRequest.Builder.addTarget() اضافه کنید. برای CameraX، این خط لوله پردازش با کلاس CameraEffect بهترین هم‌ترازی را دارد، که در آن می‌توانید جلوه را با SurfaceProcessor اعمال کنید و آن را با SurfaceProvider به «پیش‌نمایش» خود برگردانید، همان‌طور که در این کد دیده می‌شود.

// With a SurfaceOutput from SurfaceProcessor.onSurfaceOutput() and a
// SurfaceRequest from Preview.SurfaceProvider.onSurfaceRequested(),
// create a LLB Session.
suspend fun createLlbSession(surfaceRequest: SurfaceRequest, outputSurfaceForLlb: Surface) {
  // 1. Create the LLB Session configuration
  val options = LowLightBoostOptions(
    outputSurfaceForLlb,
    cameraId,
    surfaceRequest.resolution.width,
    surfaceRequest.resolution.height,
    true // Start enabled
  )

  // 2. Create the session.
  val llbSession = llbClient.createSession(options, callback).await()

  // 3. Get the surface to use.
  val llbInputSurface = llbSession.getCameraSurface()

  // 4. Provide the surface to the CameraX Preview UseCase.
  surfaceRequest.provideSurface(llbInputSurface, executor, resultListener)

  // 5. Set the scene detector callback to monitor how much boost is being applied.
  val onSceneBrightnessChanged = object : SceneDetectorCallback {
    override fun onSceneBrightnessChanged(
      session: LowLightBoostSession,
      boostStrength: Float
    ) {
      // Monitor the boostStrength from 0 (no boosting) to 1 (maximum boosting)
    }
  }
  llbSession.setSceneDetectorCallback(onSceneBrightnessChanged, null)
}

۴. ارسال فراداده

برای اینکه الگوریتم کار کند، باید وضعیت نوردهی خودکار دوربین را تجزیه‌وتحلیل کند. باید نتایج ضبط را به جلسه LLB برگردانید. در CameraX، این کار را می‌توان با گسترش Preview.Builder با Camera2Interop.Extender.setSessionCaptureCallback() انجام داد.

Camera2Interop.Extender(previewBuilder).setSessionCaptureCallback(
  object : CameraCaptureSession.CaptureCallback() {
    override fun onCaptureCompleted(
      session: CameraCaptureSession,
      request: CaptureRequest,
      result: TotalCaptureResult
    ) {
      super.onCaptureCompleted(session, request, result)
      llbSession?.processCaptureResult(result)
    }
  }
)

مراحل دقیق پیاده‌سازی برای کارخواه و جلسه را می‌توانید در  راهنمای «بهبود در نور کم» Google پیدا کنید.

مراحل بعدی

با پیاده‌سازی این دو گزینه، مطمئن می‌شوید که کاربران شما می‌توانند به‌وضوح ببینند، به‌طور مطمئن اسکن کنند، و به‌طور مؤثر تعامل داشته باشند، صرف‌نظر از شرایط نورپردازی.

برای دیدن این ویژگی‌ها در عمل در یک پایگاه کد کامل و آماده تولید،  برنامه دوربین Jetpack را در GitHub بررسی کنید. این برنامه هم حالت LLB AE و هم Google LLB را پیاده‌سازی می‌کند و مرجعی برای ادغام خودتان ارائه می‌دهد. 

نویسنده:
ادامه خواندن