Actualités des produits
Éclaircir les flux vidéo en temps réel de vos caméras grâce à l'amplification de la luminosité
Temps de lecture : 7 min
Nous vous avons récemment expliqué comment Instagram permet aux utilisateurs de prendre de superbes photos par faible luminosité grâce au mode Nuit. Cette fonctionnalité est idéale pour les images fixes, où il est possible de combiner plusieurs expositions pour créer une photo statique de haute qualité. Mais qu'en est-il des moments qui se déroulent entre les photos ? Les utilisateurs doivent interagir avec la caméra au-delà du moment où ils appuient sur le bouton de l'obturateur. Ils utilisent également l'aperçu pour composer leur scène ou scanner des codes QR.
Aujourd'hui, nous allons nous pencher sur l'amplification de la luminosité, une fonctionnalité puissante conçue pour éclaircir les flux vidéo en temps réel. Contrairement au mode Nuit, qui nécessite une durée de capture fixe, la fonctionnalité Luminosité améliorée en faible luminosité fonctionne instantanément sur votre aperçu en direct et vos enregistrements vidéo. La luminosité faible est automatiquement ajustée en fonction de la lumière disponible. Elle est donc optimisée pour chaque environnement.
Grâce à une mise à jour récente, LLB permet aux utilisateurs d'Instagram de prendre la photo parfaite. L'implémentation du mode Nuit existant permet d'obtenir des photos de haute qualité en basse luminosité, comme c'est le cas 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, la fonctionnalité Low Light Boost est destinée à l'usabilité et à l'interactivité dans les environnements sombres. Un autre facteur important à prendre en compte est que, même s'ils fonctionnent très bien ensemble, vous pouvez utiliser LLB et le mode Nuit indépendamment. Vous verrez avec certains de ces cas d'utilisation que LLB a une valeur en soi lorsque les photos en mode Nuit ne sont pas nécessaires. Voici comment LLB améliore l'expérience utilisateur :
- Meilleur cadrage et meilleure capture : dans les scènes peu éclairées, l'aperçu standard de l'appareil photo peut être complètement noir. La luminosité 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 des photos de faible luminosité de la meilleure qualité possible, ou laisser LLB fournir à l'utilisateur un résultat photo "tel que vous le voyez".
- Lecture fiable : les codes QR sont omniprésents, mais les scanner dans un restaurant sombre ou un parking souterrain est souvent frustrant. Grâce à un flux de la caméra beaucoup plus lumineux, les algorithmes de lecture peuvent détecter et décoder les codes QR de manière fiable, 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), 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 qui travaille sur l'application Instagram pour Android s'efforce constamment de fournir à ses utilisateurs une expérience de caméra de pointe. L'exemple ci-dessus montre l'impact de LLB sur un Pixel 10 Pro.
Il est facile d'imaginer la différence que cela fait en termes d'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 sur la plus large gamme d'appareils :
- Mode AE avec amplification de la luminosité : il s'agit d'un mode d'exposition automatique au niveau matériel. Elle offre la meilleure qualité et les meilleures performances, car elle 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. Il applique un post-traitement au flux de la caméra pour l'éclaircir. Comme il s'agit d'une solution entièrement logicielle, elle est disponible sur davantage d'appareils. Cette implémentation vous aide donc à toucher plus d'appareils avec LLB.
Mode AE avec amplification de la luminosité faible (matériel)
Mécanisme :
Ce mode est compatible avec les appareils exécutant Android 15 ou version ultérieure. Il 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 la caméra. Si vous définissez CaptureRequest.CONTROL_AE_MODE sur CameraMetadata.CONTROL_AE_MODE_ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY, le système de caméras 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 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 lumineuses.
Avantage :
Qualité d'image et efficacité énergétique potentiellement meilleures, car il utilise des chemins matériels dédiés.
Compromis :
peut entraîner une fréquence d'images plus faible dans des conditions de très faible luminosité, car le capteur a besoin de plus de temps pour capter 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. 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 spatialement variable de l'image en pleine résolution sur le GPU. Le modèle est entraîné à éclaircir et à améliorer la qualité des images dans des conditions de faible luminosité, en mettant l'accent sur la visibilité des visages.
Orchestration des 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 :
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 le cadre. Le modèle utilisé est adapté aux scènes peu lumineuses et optimisé pour les 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 une plus large gamme d'appareils (actuellement compatible avec les Samsung S22 Ultra, S23 Ultra, S24 Ultra, S25 Ultra et Pixel 6 à Pixel 9) sans nécessiter de prise en charge HAL spécifique. Maintient la fréquence d'images de la caméra, 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 frames fournies par le capteur. Il ne peut pas récupérer les détails perdus en raison de l'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 faible luminosité dans l'écosystème Android. Les développeurs doivent privilégier le mode AE lorsqu'il est disponible et utiliser la fonctionnalité Google Low Light Boost comme solution de secours fiable.
Implémenter l'amplification de luminosité faible dans votre application
Voyons maintenant comment implémenter les deux offres LLB. 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 avec amplification de la luminosité faible
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 AE LLB à 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 "activé". Le système n'active la luminosité accrue que lorsque la scène est réellement sombre. Vous pouvez configurer un observateur pour mettre à jour votre UI (par exemple, en affichant une icône de lune) ou convertir 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 sur le mode AE avec amplification de la luminosité, cliquez ici.
Étape 2 : Google Low Light Boost
Pour les appareils qui ne sont pas compatibles avec le mode AE matériel, la fonctionnalité Google Low Light Boost 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 frame. Vous devez donc fournir votre Surface d'affichage à LowLightBoostSession, qui vous renvoie une Surface à laquelle la luminosité a été appliquée. Pour les applications Camera2, vous pouvez ajouter la Surface résultante avec CaptureRequest.Builder.addTarget(). Pour CameraX, ce pipeline de traitement s'aligne le mieux sur la classe CameraEffect, où vous pouvez appliquer l'effet avec un SurfaceProcessor et le renvoyer à votre aperçu 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 renvoyer les résultats de la capture à la session LLB. Dans CameraX, cela peut être fait 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 instructions d'implémentation détaillées pour le client et la session dans le guide Google Low Light Boost.
É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 d'appareil photo Jetpack 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.
Lire la suite
-
Actualités des produits
Android Studio Panda 4 est désormais stable et prêt à être utilisé en production. Cette version inclut le mode Planification, la prédiction de la prochaine modification et bien d'autres fonctionnalités qui vous permettent de créer des applications Android de haute qualité plus facilement que jamais.
Matt Dyor • Temps de lecture : 5 min
-
Actualités des produits
Si vous êtes un développeur Android et que vous souhaitez implémenter des fonctionnalités d'IA innovantes dans votre application, nous avons récemment lancé de nouvelles mises à jour puissantes.
Thomas Ezan • Temps de lecture : 3 min
-
Actualités des produits
Android 17 est disponible en version bêta 4, la dernière version bêta prévue pour ce cycle de publication. Il s'agit d'une étape cruciale pour la compatibilité des applications et la stabilité de la plate-forme.
Daniel Galpin • Temps de lecture : 4 min
Restez informé
Recevez chaque semaine les dernières informations sur le développement Android directement dans votre boîte de réception.