É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 en basse 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 l'appareil photo 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 luminosité ambiante. Elle est donc optimisée pour chaque environnement.
Grâce à une mise à jour récente, LLB permet aux utilisateurs d'Instagram de cadrer 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, Low Light Boost est destiné à 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 la meilleure qualité photo possible en basse luminosité, 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 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), 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.
Différences sur Instagram
L'équipe d'ingénieurs à l'origine de l'application Instagram pour Android s'efforce constamment de proposer une expérience de caméra de pointe à ses utilisateurs. L'exemple ci-dessus montre l'impact de la 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 peuvent pas voir 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é faible : 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 un plus grand nombre d'appareils. Cette implémentation vous aide donc à toucher plus d'appareils avec LLB.
Mode AE avec amplification de luminosité faible (matériel)
Mécanisme :
Ce mode est compatible avec les appareils équipés d'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 :
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 :
La fréquence d'images peut être plus faible dans des conditions très sombres, car le capteur a besoin de plus de temps pour capter la lumière. La fréquence d'images peut descendre jusqu'à 10 FPS en cas 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 variable dans l'espace 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 d'optimisation. - Traitement HDRNet :
applique le modèle HDRNet pour éclaircir le frame. 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 méthodes 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é Low Light Boost de Google 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 Turbo qu'il est actuellement activé. Le système n'active le boost 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 le 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é en basse lumière, 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)
}
}
)Pour connaître la procédure d'implémentation détaillée pour le client et la session, consultez 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 Jetpack Camera sur GitHub. Il implémente le mode LLB AE et Google LLB, ce qui vous donne une référence pour votre propre intégration.
-
Nouveautés produitSur Google Play, nous développons sans cesse notre plate-forme d'abonnement pour vous aider à développer votre activité, à vous adapter à de nouveaux modèles économiques et à toucher vos utilisateurs là où ils se trouvent.
Sheenam Mittal • Temps de lecture : 4 min -
Nouveautés produitL'année dernière, Android Studio s'est ouvert à tous les modèles d'IA. Aujourd'hui, nous franchissons une nouvelle étape en vous permettant de choisir vos agents de programmation.
Matthew Warner • Temps de lecture : 3 min -
Nouveautés produitGooglebook est une nouvelle catégorie d'ordinateurs portables basés sur une plate-forme Android partagée. Le matériel hautes performances de partenaires tels que HP, Dell, Lenovo, Acer et Asus combine la praticité du mobile et la puissance d'un ordinateur de bureau.
Fahd Imtiaz, Loryn Hairston • Temps de lecture : 4 min
Recevez chaque semaine les dernières informations sur le développement Android directement dans votre boîte de réception.