Améliorez la luminosité des flux de votre caméra en temps réel grâce à l'amplification de la luminosité
Temps de lecture : 7 min
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 au-delà du moment où ils appuient sur le bouton de l'obturateur. Ils l'utilisent également pour composer leur scène ou scanner des QR codes.
Aujourd'hui, nous allons nous intéresser à l'amplification de la luminosité, une fonctionnalité puissante conçue pour éclaircir les flux de caméra en temps réel. Contrairement au mode Nuit, qui nécessite de rester immobile pendant la capture, l'Amélioration en faible luminosité fonctionne instantanément sur l'aperçu en direct et les enregistrements vidéo. La fonctionnalité LLB ajuste automatiquement la luminosité nécessaire en fonction de la lumière disponible, de sorte qu'elle est optimisée pour chaque environnement.
Grâce à une mise à jour récente, LLB permet aux utilisateurs d'Instagram de cadrer la photo parfaite, puis leur implémentation existante du mode Nuit produit les mêmes photos de haute qualité en basse lumière que celles dont ils 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é de l'image finale, Low Light Boost est destiné à améliorer la facilité d'utilisation et l'interactivité dans les environnements sombres. Autre facteur important à prendre en compte : même si elles fonctionnent très bien ensemble, vous pouvez utiliser la fonctionnalité LLB et le mode Nuit indépendamment. Comme vous le verrez dans certains de ces cas d'utilisation, la fonctionnalité LLB est utile en elle-même lorsque les photos en mode Nuit ne sont pas nécessaires. Voici comment l'équilibrage de charge local améliore l'expérience utilisateur :
- Cadrage et capture améliorés : dans les scènes faiblement éclairées, l'aperçu d'un appareil photo standard peut être complètement noir. La fonctionnalité LLB éclaircit le viseur, ce qui permet aux utilisateurs de voir ce qu'ils cadrent avant d'appuyer sur le bouton de l'obturateur. Pour cette expérience, vous pouvez utiliser le mode Nuit pour obtenir une photo de la meilleure qualité possible en cas de faible luminosité, ou laisser LLB fournir à l'utilisateur une photo "telle qu'il la voit".
- Lecture fiable : les QR codes sont omniprésents, mais les scanner dans un restaurant sombre ou un parking couvert est souvent frustrant. Grâce à un flux de caméra nettement plus lumineux, les algorithmes de lecture peuvent détecter et décoder de manière fiable les QR codes, 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), la LLB 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 sur Instagram
L'équipe d'ingénieurs derrière l'application Instagram pour Android s'efforce constamment d'offrir une expérience d'appareil photo de pointe à ses utilisateurs. Comme vous pouvez le voir dans l'exemple ci-dessus, la fonctionnalité LLB fait une vraie différence sur le Pixel 10 Pro.
Il est facile d'imaginer la différence que cela fait pour l'expérience utilisateur. Si les utilisateurs ne voient pas ce qu'ils capturent, ils sont plus susceptibles d'abandonner la capture.
Choisir votre implémentation
Il existe deux façons d'implémenter l'amplification de la luminosité pour offrir la meilleure expérience possible sur un maximum d'appareils :
- Mode AE d'amplification de la luminosité faible : il s'agit d'un mode d'exposition automatique au niveau de la couche matérielle. 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 ce point en premier.
- Google Low Light Boost : si l'appareil n'est pas compatible avec le mode AE, vous pouvez utiliser 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 de toucher plus d'appareils avec LLB.
Mode AE d'amplification de 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 compatibilité 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, souvent en augmentant le temps d'exposition, pour éclaircir l'image. Cela peut produire des images avec un rapport signal/bruit (SNR) nettement 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 lumineuses.
Avantage :
Potentiellement une meilleure qualité d'image et une meilleure efficacité énergétique, car il exploite des chemins matériels dédiés.
Inconvénient :
La fréquence d'images peut être plus faible dans des conditions de très faible luminosité, 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é.
Google Low Light Boost (logiciel via les services Google Play)
Mécanisme :
Cette solution, distribuée en tant que module facultatif via les services Google Play, applique un post-traitement au flux de la caméra. Il utilise une technologie sophistiquée d'amélioration des images 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 variable dans l'espace de l'image en résolution maximale sur le GPU. Le modèle est entraîné pour éclaircir et améliorer la qualité des images dans des conditions de faible luminosité, en mettant l'accent sur la visibilité des visages.
Orchestration du processus :
Le modèle HDRNet et sa logique associée sont orchestrés par le processeur Low Light Boost. Par exemple :
- 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 de boost. - Traitement HDRNet :
Applique le modèle HDRNet pour éclaircir l'image. Le modèle utilisé est réglé pour les scènes à faible luminosité et optimisé pour des performances en temps réel. - 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 boosté et non boosté.
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 à Pixel 9) sans nécessiter de compatibilité HAL spécifique. Conserve la fréquence d'images de la caméra, car il s'agit d'un effet de post-traitement.
Inconvénient :
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 d'une obscurité extrême au niveau du capteur.
En proposant des solutions matérielles et logicielles, l'amplification de la luminosité offre une solution évolutive pour améliorer les performances de l'appareil photo en conditions de faible luminosité dans l'écosystème Android. Les développeurs doivent privilégier le mode AE lorsqu'il est disponible et utiliser l'amplification en basse lumière de Google comme solution de secours fiable.
Implémenter l'amplification de luminosité dans votre application
Voyons maintenant comment implémenter les deux offres LLB. Vous pouvez implémenter les étapes suivantes, que vous utilisiez CameraX ou Camera2 dans votre application. Pour obtenir des résultats optimaux, 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 ou version ultérieure, le mode LLB AE 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 LLB.
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 LLB AE à 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'exécution. Le système n'active l'amplification que lorsque la scène est réellement sombre. Vous pouvez configurer un Observer pour mettre à jour votre UI (par exemple, en affichant une icône de lune) ou effectuer une conversion en Flow à l'aide de la fonction d'extension asFlow().
if (isLlbSupported) {
camera?.cameraInfo.lowLightBoostState.asFlow().collectLatest { state ->
// Update UI accordingly
updateMoonIcon(state == LowLightBoostState.ACTIVE)
}
}Pour en savoir plus, consultez le guide complet sur le mode AE d'amélioration en basse lumière.
Étape 2 : Boost faible luminosité Google
Pour les appareils qui ne sont pas compatibles avec le mode AE matériel, l'optimisation en faible luminosité de Google constitue une solution de remplacement efficace. Il utilise une LowLightBoostSession pour intercepter et éclaircir le flux.
1. Ajouter des dépendances
Cette fonctionnalité est fournie par 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 caméra, 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 LLB
Google LLB traite chaque image. Vous devez donc fournir votre Surface d'affichage à LowLightBoostSession, qui vous renvoie une Surface sur laquelle l'éclaircissement a été appliqué. Pour les applications Camera2, vous pouvez ajouter la Surface obtenue avec CaptureRequest.Builder.addTarget(). Pour CameraX, ce pipeline de traitement s'aligne mieux avec la classe CameraEffect, où vous pouvez appliquer l'effet avec un SurfaceProcessor et le renvoyer à votre Preview avec un SurfaceProvider, comme indiqué 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 la caméra. Vous devez transmettre les résultats de la capture à la session LLB. 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)
}
}
)Pour connaître les étapes d'implémentation détaillées du client et de la session, consultez le guide sur l'optimisation en faible luminosité de 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 un codebase complet et prêt pour la production, consultez l' application Jetpack Camera sur GitHub. Il implémente à la fois le mode LLB AE et Google LLB, ce qui vous donne une référence pour votre propre intégration.
-
Actualités sur les produitsÀ mesure que le développement agentique s'accélère, l'ingénierie Android atteint une nouvelle frontière passionnante : passer de la complétion de code assistée à des agents qui s'exécutent de bout en bout sous votre direction. Vous disposez d'un choix et d'une flexibilité totaux concernant les modèles et les agents que vous utilisez.
Jason Buchel • Temps de lecture : 3 min -
Actualités sur les produitsAujourd'hui, nous avons expliqué comment nous faisions évoluer notre vision "plus qu'un magasin". De l'onglet "Vous", qui sert désormais d'espace personnel à plus de 250 millions d'utilisateurs actifs par mois, à notre plate-forme de jeux unifiée qui connecte plus de 700 millions de profils de joueurs, Google Play répond aux besoins des utilisateurs où qu'ils se trouvent.
Paul Feng • Temps de lecture : 3 min -
Actualités sur les produitsAvec Googlebook, nous sommes ravis d'aider les utilisateurs à s'exprimer et à accéder à ces outils.
Cyrus Stoller • Temps de lecture : 2 min
Recevez chaque semaine les dernières informations sur le développement Android dans votre boîte de réception.