اخبار محصول

با قابلیت Low Light Boost، تصاویر دوربین خود را در لحظه روشن‌تر کنید

۷ دقیقه مطالعه
Donovan McMurray
مهندس روابط توسعه‌دهنده

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

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

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

چرا روشنایی بلادرنگ اهمیت دارد؟

در حالی که حالت شب (Night Mode) با هدف بهبود کیفیت نهایی تصویر طراحی شده است، تقویت نور کم (Low Light Boost) برای قابلیت استفاده و تعامل در محیط‌های تاریک در نظر گرفته شده است. عامل مهم دیگری که باید در نظر بگیرید این است که - حتی اگر آنها به خوبی با هم کار کنند - می‌توانید از LLB و حالت شب به طور مستقل استفاده کنید و در برخی از این موارد استفاده خواهید دید که LLB به تنهایی زمانی که به عکس‌های حالت شب نیازی نیست، ارزش دارد. در اینجا نحوه بهبود تجربه کاربری توسط LLB آورده شده است:

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

تفاوت در اینستاگرام

LLB_IG_demo_white_background.gif

تیم مهندسی پشت اپلیکیشن اندروید اینستاگرام همیشه سخت تلاش می‌کند تا یک تجربه دوربین پیشرفته را برای کاربران خود فراهم کند. در مثال بالا می‌توانید تفاوت LLB را در Pixel 10 Pro ببینید.

نور کم.png

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

نور کم1.png

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

دو روش برای پیاده‌سازی قابلیت Low Light Boost وجود دارد تا بهترین تجربه را در طیف وسیعی از دستگاه‌ها ارائه دهد:

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

حالت AE تقویت‌کننده نور کم (سخت‌افزار)

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

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

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

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

تقویت نور کم گوگل (نرم‌افزار از طریق سرویس‌های گوگل پلی)

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

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

هماهنگ‌سازی فرآیند:
مدل HDRNet و منطق همراه آن توسط پردازنده Low Light Boost هماهنگ می‌شوند. این شامل موارد زیر است:

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

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

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

با ارائه مسیرهای سخت‌افزاری و نرم‌افزاری، Low Light Boost یک راه‌حل مقیاس‌پذیر برای افزایش عملکرد دوربین در نور کم در سراسر اکوسیستم اندروید ارائه می‌دهد. توسعه‌دهندگان باید در صورت وجود، حالت AE را در اولویت قرار دهند و از Google Low Light Boost به عنوان یک جایگزین قوی استفاده کنند.

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

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

مرحله ۱: حالت AE تقویت‌کننده نور کم

حالت LLB AE که در دستگاه‌های منتخب دارای اندروید ۱۵ و بالاتر موجود است، به عنوان یک حالت نوردهی خودکار (AE) خاص عمل می‌کند.

۱. بررسی موجودی

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

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

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

در صورت پشتیبانی، می‌توانید حالت LLB AE را با استفاده از شیء 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)
  }
}

شما می‌توانید راهنمای کامل حالت AE با قابلیت افزایش نور کم (Low Light Boost AE Mode) را اینجا بخوانید.

مرحله ۲: تقویت نور کم گوگل

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

۱. وابستگی‌ها را اضافه کنید

این ویژگی از طریق سرویس‌های گوگل پلی ارائه می‌شود.

  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 هر فریم را پردازش می‌کند، بنابراین شما باید سطح نمایشگر خود را به LowLightBoostSession بدهید و آن سطحی را که روشنایی روی آن اعمال شده است، به شما برمی‌گرداند. برای برنامه‌های Camera2، می‌توانید سطح حاصل را با CaptureRequest.Builder.addTarget() اضافه کنید. برای CameraX، این خط لوله پردازش به بهترین وجه با کلاس CameraEffect همسو می‌شود، جایی که می‌توانید جلوه را با SurfaceProcessor اعمال کنید و آن را با SurfaceProvider ، همانطور که در این کد مشاهده می‌شود، به Preview خود برگردانید.

  // 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 Low Light Boost بیابید.

مراحل بعدی

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

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

    نوشته شده توسط:

    ادامه مطلب