Actualités produit

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

7 minutes de lecture
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é grâce au 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 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 luminosité fonctionne instantanément sur votre aperçu en direct et vos enregistrements vidéo. Elle ajuste automatiquement le niveau d'é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 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 luminosité est destinée à améliorer l'ergonomie 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 luminosité et le mode Nuit indépendamment. Vous verrez que dans certains de ces cas d'utilisation, l'amplification de luminosité a une valeur propre lorsque les photos en mode Nuit ne sont pas nécessaires. Voici comment l'amplification de 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 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 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 sombre ou un parking est souvent frustrant. Grâce à 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 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 à l'origine de l'application Android Instagram travaille sans relâche pour offrir à ses utilisateurs une expérience de pointe en matière d'appareil photo. Dans l'exemple ci-dessus, vous pouvez voir la différence que l'amplification de luminosité apporte à 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 luminosité pour offrir la meilleure expérience sur la plus large gamme d'appareils :

  1. Mode AE d'amplification de 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 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 luminosité.

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

Mécanisme
: Ce mode est compatible avec les appareils équipés d'Android 15 et versions ultérieures, 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 souvent 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 elle 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 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 des processus :
Le modèle HDRNet et sa logique associée sont orchestrés par le processeur d'amplification de 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 adapté aux scènes peu éclairées 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 une plus large gamme 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 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 luminosité Google comme solution de secours robuste.

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

Voyons maintenant comment implémenter les deux offres d'amplification de 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 luminosité

Disponible sur certains appareils équipés d'Android 15 et versions ultérieures, le mode AE d'amplification de 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 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 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 luminosité ici.

Étape 2 : Amplification de luminosité Google

Pour les appareils qui ne sont pas compatibles avec le mode AE matériel, l'amplification de luminosité Google constitue une solution de secours puissante. Elle utilise un 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 le 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 luminosité

L'amplification de luminosité Google traite chaque image. Vous devez donc fournir votre Surface d'affichage au 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 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 luminosité Google.

Étapes suivantes

En implémentant ces deux options, vous vous assurez que vos utilisateurs peuvent voir clairement, numériser 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 luminosité et l'amplification de luminosité Google, ce qui vous donne une référence pour votre propre intégration. 

Auteur :

Lire la suite