Notícias sobre produtos

Melhore as transmissões de câmera em tempo real com o recurso de aumento de baixa luminosidade

Leitura de 7 minutos
Donovan McMurray
Engenheira de relações com desenvolvedores

Recentemente, compartilhamos  como o Instagram permite que os usuários tirem fotos incríveis com pouca luz usando o Modo noturno. Esse recurso é perfeito para imagens estáticas, em que há tempo para combinar várias exposições e criar uma foto estática de alta qualidade. Mas e os momentos que acontecem entre as fotos? Os usuários precisam interagir com a câmera além do momento em que o botão do obturador é pressionado. Eles também usam a prévia para compor a cena ou ler QR codes.

Hoje, vamos falar sobre o Aumento do modo pouca luz (LLB), um recurso avançado criado para iluminar transmissões de câmera em tempo real. Ao contrário do Modo noturno, que exige uma duração de captura estática, a Otimização de pouca luz funciona instantaneamente na visualização dinâmica e nas gravações de vídeo. O LLB ajusta automaticamente a quantidade de iluminação necessária com base na luz disponível, sendo otimizado para todos os ambientes.

Com uma atualização recente, o LLB permite que os usuários do Instagram alinhem a foto perfeita, e a implementação do modo noturno resulta nas mesmas fotos de alta qualidade com pouca luz que os usuários já aproveitam há mais de um ano.

Por que o brilho em tempo real é importante

Enquanto o Modo noturno visa melhorar a qualidade da imagem final, o Low Light Boost é destinado à usabilidade e interatividade em ambientes escuros. Outro fator importante a considerar é que, embora funcionem muito bem juntos, é possível usar o LLB e o modo noturno de forma independente. Em alguns desses casos de uso, o LLB tem valor por si só quando não são necessárias fotos no modo noturno. Veja como o LLB melhora a experiência do usuário:

  • Melhor enquadramento e captura:em cenas com pouca luz, uma prévia padrão da câmera pode ficar totalmente preta. O LLB ilumina o visor, permitindo que os usuários vejam o que estão enquadrando antes de tocar no botão do obturador. Para essa experiência, use o Modo noturno para ter a melhor qualidade em fotos com pouca luz ou deixe o LLB dar ao usuário um resultado de foto "o que você vê é o que você recebe".
  • Leitura confiável:os QR codes estão em todos os lugares, mas ler um em um restaurante escuro ou em uma garagem de estacionamento geralmente é frustrante. Com uma transmissão da câmera muito mais clara, os algoritmos de leitura podem detectar e decodificar QR codes de forma confiável, mesmo em ambientes muito escuros.
  • Interações aprimoradas:para apps que envolvem interações de vídeo ao vivo (como assistentes de IA ou videochamadas), a LLB aumenta a quantidade de informações perceptíveis, garantindo que os modelos de visão computacional tenham dados suficientes para trabalhar.

A diferença no Instagram

LLB_IG_demo_white_background.gif

A equipe de engenharia por trás do app do Instagram para Android está sempre trabalhando duro para oferecer uma experiência de câmera de última geração aos usuários. No exemplo acima, você pode ver a diferença que o LLB faz em um Pixel 10 Pro. 

lowlight.png

É fácil imaginar a diferença que isso faz na experiência do usuário. Se os usuários não conseguirem ver o que estão capturando, há uma chance maior de que eles abandonem a captura. 

lowlight1.png

Como escolher sua implementação

Há duas maneiras de implementar o recurso Melhoria com pouca luz para oferecer a melhor experiência em uma ampla variedade de dispositivos:

  1. Modo AE com melhoria de pouca luz:é um modo de exposição automática na camada de hardware. Ela oferece a mais alta qualidade e desempenho porque ajusta o pipeline do processador de sinal de imagem (ISP, na sigla em inglês) diretamente. Sempre verifique isso primeiro.
  2. Melhoria de pouca luz do Google:se o dispositivo não for compatível com o modo AE, você poderá usar essa solução baseada em software fornecida pelo Google Play Services. Ele aplica pós-processamento ao stream da câmera para iluminar. Como é uma solução totalmente de software, ela está disponível em mais dispositivos. Assim, essa implementação ajuda você a alcançar mais dispositivos com LLB.

Modo AE de aumento de pouca luz (hardware)

Mecanismo:
esse modo é compatível com dispositivos que executam o Android 15 e versões mais recentes e exige que o OEM tenha implementado o suporte em HAL (atualmente disponível em dispositivos Pixel 10). Ele se integra diretamente ao processador de sinal de imagem (ISP, na sigla em inglês) da câmera. Se você definir CaptureRequest.CONTROL_AE_MODE como CameraMetadata.CONTROL_AE_MODE_ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY, o sistema da câmera vai assumir o controle.

Comportamento:
a HAL/ISP analisa a cena e ajusta os parâmetros do sensor e de processamento, geralmente aumentando o tempo de exposição para clarear a imagem.Isso pode gerar frames com uma relação sinal-ruído (SNR) significativamente melhorada, porque o tempo de exposição estendido, em vez de um aumento no ganho do sensor digital (ISO), permite que o sensor capture mais informações de luz.

Vantagem:
qualidade de imagem e eficiência energética potencialmente melhores, já que usa caminhos de hardware dedicados.

Compensação:
pode resultar em uma taxa de frames menor em condições muito escuras, já que o sensor precisa de mais tempo para capturar a luz. A taxa de frames pode cair para até 10 FPS em condições de pouca luz.

Melhoria de pouca luz do Google (software via Google Play Services)

Mecanismo:
essa solução, distribuída como um módulo opcional pelo Google Play Services, aplica pós-processamento ao stream da câmera. Ele usa uma tecnologia sofisticada de aprimoramento de imagem em tempo real chamada HDRNet.

Google HDRNet:
esse modelo de aprendizado profundo analisa a imagem em uma resolução mais baixa para prever um conjunto compacto de parâmetros (uma grade bilateral). Essa grade orienta o aprimoramento eficiente e espacialmente variável da imagem de resolução total na GPU. O modelo é treinado para aumentar o brilho e melhorar a qualidade da imagem em condições de pouca luz, com foco na visibilidade do rosto.

Orquestração de processos:
o modelo HDRNet e a lógica associada são orquestrados pelo processador Low Light Boost. Isso inclui:

  1. Análise de cena:
    uma calculadora personalizada que estima o brilho real da cena usando metadados da câmera (sensibilidade do sensor, tempo de exposição etc.) e conteúdo da imagem. Essa análise determina o nível de aumento.
  2. Processamento do HDRNet:
    aplica o modelo HDRNet para aumentar o brilho do frame. O modelo usado é ajustado para cenas com pouca luz e otimizado para desempenho em tempo real.
  3. Fusão:
    Os frames originais e processados pela HDRNet são mesclados. A quantidade de fusão aplicada é controlada dinamicamente pela calculadora de brilho da cena, garantindo uma transição suave entre os estados com e sem otimização.
low-light-boost-processor-diagram.png

Vantagem:
funciona em uma variedade maior de dispositivos (atualmente compatível com Samsung S22 Ultra, S23 Ultra, S24 Ultra, S25 Ultra e Pixel 6 a Pixel 9) sem exigir suporte específico do HAL. Mantém a taxa de frames da câmera, já que é um efeito de pós-processamento.

Compensação:
como um método de pós-processamento, a qualidade é limitada pelas informações presentes nos frames entregues pelo sensor. Não é possível recuperar detalhes perdidos devido à escuridão extrema no nível do sensor.

Ao oferecer caminhos de hardware e software, o Modo pouca luz refinado oferece uma solução escalonável para melhorar o desempenho da câmera em ambientes com pouca luz em todo o ecossistema Android. Os desenvolvedores precisam priorizar o modo AE quando disponível e usar o recurso de melhoria de pouca luz do Google como um fallback robusto.

Implementar o aumento do modo pouca luz no seu app

Agora vamos ver como implementar as duas ofertas de LLB. Você pode implementar o seguinte, seja usando CameraX ou Camera2 no seu app. Para os melhores resultados, recomendamos implementar as etapas 1 e 2.

Etapa 1: modo de AE de aumento do modo pouca luz

Disponível em alguns dispositivos com Android 15 e versões mais recentes, o modo LLB AE funciona como um modo de exposição automática (AE) específico.

1. Verificar disponibilidade

Primeiro, verifique se o dispositivo de câmera é compatível com o modo AE LLB.

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

2. Ativar o modo

Se compatível, você pode ativar o modo AE de LLB usando o objeto CameraControl da biblioteca 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. Monitorar o estado

Só porque você pediu o modo não significa que ele está "impulsionando" no momento. O sistema só ativa o aumento quando a cena está realmente escura. Você pode configurar um Observer para atualizar a interface (como mostrar um ícone de lua) ou converter em um Flow usando a função de extensão asFlow().

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

Leia o guia completo sobre o  modo AE de melhoria de pouca luz.

Etapa 2: Google Low Light Boost

Para dispositivos que não oferecem suporte ao modo AE de hardware, o Google Low Light Boost funciona como um substituto eficiente. Ele usa um LowLightBoostSession para interceptar e iluminar o stream.

1. Adicione dependências

Esse recurso é oferecido pelo Google Play Services.

  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. Inicializar o cliente

Antes de iniciar a câmera, use o LowLightBoostClient para garantir que o módulo esteja instalado e que o dispositivo seja compatível.

  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. Criar uma sessão do LLB

O LLB do Google processa cada frame. Por isso, você precisa dar sua Surface de exibição ao LowLightBoostSession, que devolve uma Surface com o brilho aplicado. Para apps do Camera2, adicione a superfície resultante com CaptureRequest.Builder.addTarget(). Para o CameraX, esse pipeline de processamento se alinha melhor à classe CameraEffect, em que é possível aplicar o efeito com um SurfaceProcessor e fornecê-lo de volta à visualização com um SurfaceProvider, conforme mostrado neste código.

  // 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. Transmitir os metadados

Para que o algoritmo funcione, ele precisa analisar o estado de exposição automática da câmera. Você precisa transmitir os resultados da captura de volta para a sessão da LLB. Na CameraX, isso pode ser feito estendendo o Preview.Builder com 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)
    }
  }
)

Confira as etapas detalhadas de implementação do cliente e da sessão no  guia do Google Low Light Boost.

A seguir

Ao implementar essas duas opções, você garante que os usuários possam ver com clareza, fazer a leitura de forma confiável e interagir de maneira eficaz, independente das condições de iluminação.

Para conferir esses recursos em ação em uma base de código completa e pronta para produção, confira o  app de câmera do Jetpack no GitHub. Ele implementa o modo LLB AE e o Google LLB, oferecendo uma referência para sua própria integração. 

Escrito por:

Continuar lendo