Новости о продуктах

Увеличьте яркость видеопотоков в реальном времени с помощью функции усиления при слабом освещении.

7 минут чтения
Donovan McMurray
Инженер по связям с разработчиками

Недавно мы рассказывали о том, как Instagram позволяет пользователям делать потрясающие фотографии при слабом освещении с помощью ночного режима. Эта функция идеально подходит для статичных изображений, где есть время объединить несколько снимков с разной экспозицией, чтобы создать высококачественный снимок. Но как насчет моментов между фотографиями? Пользователям нужно взаимодействовать с камерой не только в момент нажатия кнопки спуска затвора. Они также используют предварительный просмотр для компоновки кадра или сканирования QR-кодов.

Сегодня мы рассмотрим функцию Low Light Boost (LLB) — мощный инструмент, предназначенный для повышения яркости видеопотоков в реальном времени. В отличие от ночного режима, требующего длительной съемки в неподвижном положении, Low Light Boost мгновенно работает как с предварительным просмотром в реальном времени, так и с видеозаписями. LLB автоматически регулирует необходимую яркость в зависимости от уровня освещенности, поэтому оптимизирована для любых условий.

Благодаря недавнему обновлению, LLB позволяет пользователям Instagram идеально выстроить кадр, и тогда существующий ночной режим позволит получить такие же высококачественные фотографии в условиях низкой освещенности, которыми пользователи наслаждаются уже более года.

Почему важна яркость в реальном времени

В то время как ночной режим направлен на улучшение качества конечного изображения, функция усиления при слабом освещении (Low Light Boost) предназначена для повышения удобства использования и интерактивности в условиях недостаточного освещения. Ещё один важный фактор, который следует учитывать, — несмотря на то, что они отлично работают вместе, — вы можете использовать LLB и ночной режим независимо друг от друга, и, как вы увидите на примере некоторых из этих сценариев, LLB имеет ценность и сам по себе, когда фотографии в ночном режиме не требуются. Вот как LLB улучшает пользовательский опыт:

  • Улучшенная кадрировка и качество снимка: В условиях недостаточного освещения стандартный предварительный просмотр изображения может быть совершенно чёрным. Функция LLB осветляет видоискатель, позволяя пользователям видеть то, что они кадрируют, прежде чем нажать кнопку спуска затвора. Для этого можно использовать ночной режим для получения наилучшего качества фотографий в условиях низкой освещённости, или же позволить LLB обеспечить получение снимков по принципу «что видишь, то и получаешь».
  • Надежное сканирование: QR-коды повсеместно распространены, но сканирование их в темном ресторане или на парковке часто вызывает затруднения. Благодаря значительно более яркому изображению с камеры, алгоритмы сканирования могут надежно обнаруживать и декодировать QR-коды даже в очень темных условиях.
  • Улучшенное взаимодействие: для приложений, использующих видеосвязь в реальном времени (например, для ИИ-помощников или видеозвонков), LLB увеличивает объем воспринимаемой информации, обеспечивая моделям компьютерного зрения достаточным количеством данных для работы.

Разница в Инстаграме

LLB_IG_demo_white_background.gif

Команда разработчиков приложения Instagram для Android постоянно работает над тем, чтобы предоставить пользователям самые современные возможности камеры. На приведенном выше примере вы можете увидеть, насколько сильно LLB улучшает качество снимков на Pixel 10 Pro.

lowlight.png

Легко представить, насколько это меняет пользовательский опыт. Если пользователи не видят, что именно они снимают, то вероятность того, что они откажутся от съемки, значительно возрастает.

lowlight1.png

Выбор способа реализации

Существует два способа включения функции Low Light Boost для обеспечения наилучшего качества изображения на максимально широком спектре устройств:

  1. Режим автоматической экспозиции при слабом освещении (Low Light Boost AE Mode): это аппаратный режим автоматической экспозиции. Он обеспечивает высочайшее качество и производительность, поскольку напрямую настраивает конвейер обработки изображений (ISP). Всегда проверяйте наличие этого режима в первую очередь.
  2. Функция Google Low Light Boost: если устройство не поддерживает режим AE, вы можете использовать это программное решение, предоставляемое сервисами Google Play. Оно применяет постобработку к видеопотоку с камеры для его осветления. Будучи полностью программным решением, оно доступно на большем количестве устройств, поэтому эта реализация поможет вам охватить больше устройств с поддержкой Low Light Boost.

Режим усиления экспозиции при слабом освещении (аппаратный)

Механизм:
Этот режим поддерживается на устройствах под управлением Android 15 и более новых версий и требует, чтобы производитель реализовал поддержку в HAL (в настоящее время доступно на устройствах Pixel 10). Он напрямую интегрируется с процессором обработки изображений (ISP) камеры. Если вы установите CaptureRequest.CONTROL_AE_MODE в значение CameraMetadata.CONTROL_AE_MODE_ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY , управление перейдет к системе камеры.

Поведение:
HAL/ISP анализирует сцену и корректирует параметры сенсора и обработки, часто увеличивая время экспозиции, чтобы осветлить изображение. Это может привести к получению кадров со значительно улучшенным соотношением сигнал/шум (SNR), поскольку увеличенное время экспозиции, а не увеличение коэффициента усиления цифрового сенсора (ISO), позволяет сенсору захватывать больше световой информации.

Преимущество:
Потенциально лучшее качество изображения и энергоэффективность благодаря использованию выделенных аппаратных каналов.

Компромисс:
В условиях очень низкой освещенности это может привести к снижению частоты кадров, поскольку сенсору требуется больше времени для захвата света. Частота кадров может упасть до 10 FPS в условиях очень слабого освещения.

Google Low Light Boost (программное обеспечение через Google Play Services)

Механизм:
Это решение, распространяемое в качестве дополнительного модуля через сервисы Google Play , применяет постобработку к видеопотоку с камеры. Оно использует сложную технологию улучшения изображения в реальном времени под названием HDRNet.

Google HDRNet:
Эта модель глубокого обучения анализирует изображение с более низким разрешением, чтобы предсказать компактный набор параметров (двустороннюю сетку). Затем эта сетка направляет эффективное, пространственно изменяющееся улучшение изображения с полным разрешением на графическом процессоре. Модель обучена осветлять и улучшать качество изображения в условиях низкой освещенности, уделяя особое внимание видимости лиц.

Оркестрация процессов:
Модель HDRNet и связанная с ней логика управляются процессором Low Light Boost. Это включает в себя:

  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. Сохраняет частоту кадров камеры, поскольку это эффект постобработки.

Компромисс:
В качестве метода постобработки качество изображения ограничено информацией, содержащейся в кадрах, передаваемых сенсором. Он не может восстановить детали, потерянные из-за сильной темноты на уровне сенсора.

Предлагая как аппаратные, так и программные пути, Low Light Boost предоставляет масштабируемое решение для повышения производительности камеры в условиях низкой освещенности во всей экосистеме Android. Разработчикам следует отдавать приоритет режиму AE, если он доступен, и использовать Google Low Light Boost в качестве надежного резервного варианта.

Внедрение функции усиления яркости при слабом освещении в ваше приложение.

Теперь давайте рассмотрим, как реализовать оба предложения LLB. Вы можете реализовать следующее независимо от того, используете ли вы CameraX или Camera2 в своем приложении. Для достижения наилучших результатов мы рекомендуем реализовать как Шаг 1, так и Шаг 2.

Шаг 1: Режим усиления экспозиции при слабом освещении

Режим LLB AE, доступный на некоторых устройствах под управлением Android 15 и выше, функционирует как особый режим автоматической экспозиции (AE).

1. Уточните наличие.

Для начала проверьте, поддерживает ли камера режим LLB AE.

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

2. Включите режим

Если поддерживается, вы можете включить режим 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)
  }
}

3. Мониторинг состояния государства

Тот факт, что вы запросили этот режим, не означает, что он сейчас "усилен". Система активирует усиление только тогда, когда сцена действительно темная. Вы можете настроить наблюдателя для обновления пользовательского интерфейса (например, для отображения значка луны) или преобразовать его в поток, используя функцию расширения asFlow().

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

Полное руководство по режиму усиления экспозиции при слабом освещении можно прочитать здесь .

Шаг 2: Google Low Light Boost

Для устройств, не поддерживающих аппаратный режим автоматической экспозиции, Google Low Light Boost выступает в качестве мощного резервного варианта. Он использует LowLightBoostSession для перехвата и осветления видеопотока.

1. Добавьте зависимости

Эта функция предоставляется через сервисы 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")

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()
}

3. Создайте сессию LLB.

Google LLB обрабатывает каждый кадр, поэтому вам необходимо передать поверхность вашего дисплея в LowLightBoostSession , и она вернет вам поверхность с примененным осветлением. Для приложений Camera2 вы можете добавить полученную поверхность с помощью CaptureRequest.Builder.addTarget() . Для CameraX этот конвейер обработки лучше всего соответствует классу CameraEffect , где вы можете применить эффект с помощью SurfaceProcessor и передать его обратно в Preview с помощью 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)
}

4. Передайте метаданные.

Для корректной работы алгоритма необходимо проанализировать состояние автоматической экспозиции камеры. Результаты захвата изображения следует передавать обратно в сессию 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 Camera на GitHub. Оно реализует как режим LLB AE , так и Google LLB , что послужит вам примером для собственной интеграции.

    Автор:

    Продолжить чтение