Actualités des produits

Éclairez vos flux de caméra en temps réel grâce à l'amplification de la luminosité

Temps de lecture : 7 min
Donovan McMurray
Ingénieur en relations avec les développeurs

Nous avons récemment expliqué comment Instagram permettait aux utilisateurs de prendre de superbes photos par faible luminosité à l’aide du mode Nuit. Cette fonctionnalité est idéale pour les images fixes, car elle permet de combiner plusieurs expositions pour créer une photo statique de haute qualité. Mais qu'en est-il des moments qui se produisent entre les photos ? Les utilisateurs doivent interagir avec l'appareil photo plus que simplement au moment où ils appuient sur le déclencheur. Ils utilisent également l'aperçu pour composer leur scène ou scanner des codes QR.

Aujourd'hui, nous allons nous intéresser à l'amplification de la luminosité, une fonctionnalité puissante conçue pour éclairer les flux de caméra en temps réel. Contrairement au mode Nuit, qui nécessite une durée de capture fixe, l'amplification de la luminosité fonctionne instantanément sur votre aperçu en direct et vos enregistrements vidéo. Elle ajuste automatiquement l'éclaircissement nécessaire en fonction de la lumière disponible, ce qui lui permet d'être optimisée pour tous les environnements.

Grâce à une mise à jour récente, l'amplification de la luminosité permet aux utilisateurs d'Instagram de prendre la photo parfaite. L'implémentation du mode Nuit existant permet ensuite d'obtenir des photos de haute qualité par faible luminosité, comme les utilisateurs en profitent depuis plus d'un an.

Pourquoi la luminosité en temps réel est-elle importante ?

Alors que le mode Nuit vise à améliorer la qualité finale de l'image, l'amplification de la luminosité est destinée à l'utilisabilité et à l'interactivité dans les environnements sombres. Un autre facteur important à prendre en compte est que, même si elles fonctionnent très bien ensemble, vous pouvez utiliser l'amplification de la luminosité et le mode Nuit indépendamment. Vous verrez que dans certains de ces cas d'utilisation, l'amplification de la luminosité a une valeur propre lorsque les photos en mode Nuit ne sont pas nécessaires. Voici comment l'amplification de la luminosité améliore l'expérience utilisateur :

  • Meilleure prise de vue et capture : dans les scènes peu éclairées, un aperçu standard de l'appareil photo peut être complètement noir. L'amplification de la luminosité éclaire le viseur, ce qui permet aux utilisateurs de voir ce qu'ils cadrent avant d'appuyer sur le déclencheur. Pour cette expérience, vous pouvez utiliser le mode Nuit pour obtenir la meilleure qualité de photo par faible luminosité, ou laisser l'amplification de la luminosité donner à l'utilisateur un résultat photo "ce que vous voyez est ce que vous obtenez".
  • Numérisation fiable : les codes QR sont omniprésents, mais les scanner dans un restaurant ou un parking sombre est souvent frustrant. Avec un flux de caméra beaucoup plus lumineux, les algorithmes de numérisation peuvent détecter et décoder de manière fiable les codes QR, même dans des environnements très sombres.
  • Interactions améliorées : pour les applications impliquant des interactions vidéo en direct (comme les assistants IA ou les appels vidéo), l'amplification de la luminosité augmente la quantité d'informations perceptibles, ce qui garantit que les modèles de vision par ordinateur disposent de suffisamment de données pour fonctionner.

La différence dans Instagram

LLB_IG_demo_white_background.gif

L'équipe d'ingénierie de l'application Android Instagram travaille sans relâche pour offrir une expérience de pointe à ses utilisateurs. Dans l'exemple ci-dessus, vous pouvez voir la différence que l'amplification de la luminosité apporte sur un Pixel 10 Pro. 

lowlight.png

Il est facile d'imaginer la différence que cela fait dans l'expérience utilisateur. Si les utilisateurs ne peuvent pas voir ce qu'ils capturent, ils sont plus susceptibles d'abandonner la capture. 

lowlight1.png

Choisir votre implémentation

Il existe deux façons d'implémenter l'amplification de la luminosité pour offrir la meilleure expérience sur le plus grand nombre d'appareils :

  1. Mode AE d'amplification de la luminosité : il s'agit d'un mode d'exposition automatique au niveau matériel. Il offre la meilleure qualité et les meilleures performances, car il ajuste directement le pipeline du processeur de signal d'image (ISP). Vérifiez toujours cela en premier.
  2. Amplification de la luminosité Google : si l'appareil n'est pas compatible avec le mode AE, vous pouvez revenir à cette solution logicielle fournie par les services Google Play. Elle applique un post-traitement au flux de la caméra pour l'éclaircir. En tant que solution entièrement logicielle, elle est disponible sur davantage d'appareils. Cette implémentation vous permet donc d'atteindre plus d'appareils avec l'amplification de la luminosité.

Mode AE d'amplification de la luminosité (matériel)

Mécanisme
: Ce mode est compatible avec les appareils équipés d'Android 15 ou version ultérieure, et nécessite que l'OEM ait implémenté la prise en charge dans HAL (actuellement disponible sur les appareils Pixel 10). Il s'intègre directement au processeur de signal d'image (ISP) de l'appareil photo. Si vous définissez CaptureRequest.CONTROL_AE_MODE sur CameraMetadata.CONTROL_AE_MODE_ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY, le système de l'appareil photo prend le contrôle.

Comportement
Le HAL/ISP analyse la scène et ajuste les paramètres du capteur et du traitement, y compris en augmentant le temps d'exposition, pour éclaircir l'image. Cela peut générer des images avec un rapport signal/bruit (SNR) considérablement amélioré, car le temps d'exposition prolongé, plutôt qu'une augmentation du gain du capteur numérique (ISO), permet au capteur de capturer plus d'informations sur la lumière.

Avantage
: Qualité d'image et efficacité énergétique potentiellement meilleures, car il exploite des chemins matériels dédiés.

Compromis
: Peut entraîner une fréquence d'images plus faible dans des conditions très sombres, car le capteur a besoin de plus de temps pour capturer la lumière. La fréquence d'images peut descendre jusqu'à 10 FPS dans des conditions de très faible luminosité.

Amplification de la luminosité Google (logiciel via les services Google Play)

Mécanisme
Cette solution, distribuée sous forme de module facultatif via les services Google Play, applique un post-traitement au flux de la caméra. Elle utilise une technologie sophistiquée d'amélioration d'image en temps réel appelée HDRNet.

Google HDRNet :
Ce modèle de deep learning analyse l'image à une résolution inférieure pour prédire un ensemble compact de paramètres (une grille bilatérale). Cette grille guide ensuite l'amélioration efficace et spatialement variable de l'image en pleine résolution sur le GPU. Le modèle est entraîné pour éclaircir et améliorer la qualité de l'image dans des conditions de faible luminosité, en mettant l'accent sur la visibilité du visage.

Orchestration du processus
: Le modèle HDRNet et sa logique d'accompagnement sont orchestrés par le processeur d'amplification de la luminosité. Par exemple :

  1. Analyse de la scène :
    Un calculateur personnalisé qui estime la luminosité réelle de la scène à l’aide des métadonnées de l’appareil photo (sensibilité du capteur, temps d’exposition, etc.) et du contenu de l’image. Cette analyse détermine le niveau d'amplification.
  2. Traitement HDRNet :
    Applique le modèle HDRNet pour éclaircir l'image. Le modèle utilisé est ajusté pour les scènes à faible luminosité et optimisé pour les performances en temps réel.
  3. Fusion :
    Les images d'origine et celles traitées par HDRNet sont fusionnées. La quantité de fusion appliquée est contrôlée de manière dynamique par le calculateur de luminosité de la scène, ce qui garantit une transition fluide entre les états amplifiés et non amplifiés.
low-light-boost-processor-diagram.png

Avantage
Fonctionne sur un plus grand nombre d'appareils (actuellement compatible avec les Samsung S22 Ultra, S23 Ultra, S24 Ultra, S25 Ultra et Pixel 6 à 9) sans nécessiter de prise en charge HAL spécifique. Maintient la fréquence d'images de l'appareil photo, car il s'agit d'un effet de post-traitement.

Compromis
: En tant que méthode de post-traitement, la qualité est limitée par les informations présentes dans les images fournies par le capteur. Elle ne peut pas récupérer les détails perdus en raison de l'obscurité extrême au niveau du capteur.

En proposant des chemins matériels et logiciels, l'amplification de la luminosité fournit une solution évolutive pour améliorer les performances de l'appareil photo par faible luminosité dans l'écosystème Android. Les développeurs doivent donner la priorité au mode AE lorsqu'il est disponible et utiliser l'amplification de la luminosité Google comme solution de secours fiable.

Implémenter l'amplification de la luminosité dans votre application

Voyons maintenant comment implémenter les deux offres d'amplification de la luminosité. Vous pouvez implémenter les éléments suivants, que vous utilisiez CameraX ou Camera2 dans votre application. Pour obtenir les meilleurs résultats, nous vous recommandons d'implémenter les étapes 1 et 2.

Étape 1 : Mode AE d'amplification de la luminosité

Disponible sur certains appareils équipés d'Android 15 ou version ultérieure, le mode AE d'amplification de la luminosité fonctionne comme un mode d'exposition automatique (AE) spécifique.

1. Vérifier la disponibilité

Tout d'abord, vérifiez si l'appareil photo est compatible avec le mode AE d'amplification de la luminosité.

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

2. Activer le mode

Si cette fonctionnalité est prise en charge, vous pouvez activer le mode AE d'amplification de la luminosité à l'aide de l'objet CameraControl de 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. Surveiller l'état

Ce n'est pas parce que vous avez demandé le mode qu'il est actuellement en cours d'amplification. Le système n'active l'amplification que lorsque la scène est réellement sombre. Vous pouvez configurer un observateur pour mettre à jour votre interface utilisateur (par exemple, afficher une icône de lune) ou convertir en flux à l'aide de la fonction d'extension asFlow().

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

Vous pouvez consulter le guide complet sur le mode AE d'amplification de la luminosité ici.

Étape 2 : Amplification de la luminosité Google

Pour les appareils qui ne sont pas compatibles avec le mode AE matériel, l'amplification de la luminosité Google constitue une solution de secours puissante. Elle utilise une LowLightBoostSession pour intercepter et éclaircir le flux.

1. Ajouter des dépendances

Cette fonctionnalité est fournie via les services 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. Initialiser le client

Avant de démarrer votre appareil photo, utilisez LowLightBoostClient pour vous assurer que le module est installé et que l'appareil est compatible.

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. Créer une session d'amplification de la luminosité

L'amplification de la luminosité Google traite chaque image. Vous devez donc fournir votre Surface d'affichage à la LowLightBoostSession, qui vous renvoie une Surface à laquelle l'éclaircissement a été appliqué. Pour les applications Camera2, vous pouvez ajouter la Surface résultante avec CaptureRequest.Builder.addTarget(). Pour CameraX, ce pipeline de traitement s'aligne mieux sur la classe CameraEffect, où vous pouvez appliquer l'effet avec un SurfaceProcessor et le renvoyer à votre aperçu avec un SurfaceProvider, comme illustré dans ce code.

// 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. Transmettre les métadonnées

Pour que l'algorithme fonctionne, il doit analyser l'état d'exposition automatique de l'appareil photo. Vous devez renvoyer les résultats de capture à la session d'amplification de la luminosité. Dans CameraX, vous pouvez le faire en étendant votre Preview.Builder avec 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)
    }
  }
)

Vous trouverez des étapes d'implémentation détaillées pour le client et la session dans le guide sur l'amplification de la luminosité Google.

Étapes suivantes

En implémentant ces deux options, vous vous assurez que vos utilisateurs peuvent voir clairement, scanner de manière fiable et interagir efficacement, quelles que soient les conditions d'éclairage.

Pour voir ces fonctionnalités en action dans une base de code complète et prête pour la production, consultez l' application Jetpack Camera sur GitHub. Elle implémente à la fois le mode AE d'amplification de la luminosité LLB et l'amplification de la luminosité Google, ce qui vous donne une référence pour votre propre intégration. 

Écrit par :

Lire la suite