Novità sul prodotto
Migliorare i feed della videocamera in tempo reale con la funzionalità Miglioramento in condizioni di scarsa luminosità
Lettura di 7 minuti
Di recente abbiamo condiviso come Instagram ha consentito agli utenti di scattare foto straordinarie in condizioni di scarsa illuminazione utilizzando la modalità notturna. Questa funzionalità è perfetta per le immagini statiche, in cui c'è tempo per combinare più esposizioni per creare uno scatto statico di alta qualità. Ma cosa succede nei momenti che si verificano tra le foto? Gli utenti devono interagire con la videocamera non solo nel momento in cui viene premuto il pulsante di scatto. Utilizzano l'anteprima anche per comporre la scena o scansionare i codici QR.
Oggi parleremo di Aumento luce (LLB), una potente funzionalità progettata per illuminare gli stream della videocamera in tempo reale. A differenza della modalità notturna, che richiede una durata di acquisizione fissa, la funzionalità Potenziamento in condizioni di scarsa illuminazione funziona istantaneamente sull'anteprima live e sulle registrazioni video. La funzionalità LLB regola automaticamente la quantità di luminosità necessaria in base alla luce disponibile, in modo da essere ottimizzata per ogni ambiente.
Con un recente aggiornamento, LLB consente agli utenti di Instagram di inquadrare lo scatto perfetto, mentre l'implementazione della modalità notturna esistente produce foto di alta qualità in condizioni di scarsa illuminazione, come quelle che gli utenti apprezzano da oltre un anno.
Perché la luminosità in tempo reale è importante
Mentre la modalità notturna mira a migliorare la qualità dell'immagine finale, Low Light Boost è pensata per l'usabilità e l'interattività in ambienti bui. Un altro fattore importante da considerare è che, anche se funzionano molto bene insieme, puoi utilizzare LLB e la modalità notturna in modo indipendente. In alcuni di questi casi d'uso, LLB ha valore di per sé quando le foto in modalità notturna non sono necessarie. Ecco in che modo LLB migliora l'esperienza utente:
- Inquadratura e acquisizione migliori:nelle scene con scarsa illuminazione, l'anteprima standard della videocamera può essere completamente nera. La funzionalità LLB illumina il mirino, consentendo agli utenti di vedere effettivamente ciò che stanno inquadrando prima di premere il pulsante di scatto. Per questa esperienza, puoi utilizzare la modalità notturna per ottenere foto di alta qualità in condizioni di scarsa illuminazione oppure puoi lasciare che LLB offra all'utente un risultato fotografico "ciò che vedi è ciò che ottieni".
- Scansione affidabile: i codici QR sono ovunque, ma scansionarli in un ristorante o in un parcheggio buio è spesso frustrante. Grazie a un feed della videocamera molto più luminoso, gli algoritmi di scansione possono rilevare e decodificare in modo affidabile i codici QR anche in ambienti molto bui.
- Interazioni avanzate:per le app che prevedono interazioni video in diretta (come assistenti AI o videochiamate), LLB aumenta la quantità di informazioni percepibili, garantendo che i modelli di visione artificiale dispongano di dati sufficienti per funzionare.
La differenza su Instagram
Il team di ingegneri che lavora all'app Instagram per Android si impegna costantemente per offrire ai propri utenti un'esperienza di utilizzo della fotocamera all'avanguardia. Nell'esempio riportato sopra puoi vedere la differenza che fa LLB su Pixel 10 Pro.
È facile immaginare la differenza che questo comporta nell'esperienza utente. Se gli utenti non riescono a vedere ciò che stanno acquisendo, è più probabile che abbandonino l'acquisizione.
Scegliere l'implementazione
Esistono due modi per implementare Low Light Boost e offrire la migliore esperienza sulla più ampia gamma di dispositivi:
- Modalità AE Low Light Boost:si tratta di una modalità di esposizione automatica a livello hardware. Offre la massima qualità e prestazioni perché ottimizza direttamente la pipeline del processore di immagine (ISP). Controlla sempre prima questo aspetto.
- Google Low Light Boost:se il dispositivo non supporta la modalità AE, puoi utilizzare questa soluzione basata su software fornita da Google Play Services. Applica il post-processing allo stream della videocamera per renderlo più luminoso. In quanto soluzione interamente software, è disponibile su più dispositivi, quindi questa implementazione ti aiuta a raggiungere più dispositivi con LLB.
Modalità AE con aumento luce (hardware)
Meccanismo:
questa modalità è supportata sui dispositivi con Android 15 e versioni successive e richiede che l'OEM abbia implementato il supporto in HAL (attualmente disponibile sui dispositivi Pixel 10). Si integra direttamente con il processore di immagine (ISP) della videocamera. Se imposti CaptureRequest.CONTROL_AE_MODE su CameraMetadata.CONTROL_AE_MODE_ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY, il sistema della fotocamera prende il controllo.
Comportamento:
l'HAL/ISP analizza la scena e regola i parametri del sensore e di elaborazione, spesso aumentando il tempo di esposizione, per illuminare l'immagine.In questo modo, si possono ottenere frame con un rapporto segnale/rumore (SNR) notevolmente migliorato, perché il tempo di esposizione prolungato, anziché un aumento del guadagno del sensore digitale (ISO), consente al sensore di acquisire più informazioni sulla luce.
Vantaggio:
qualità dell'immagine e efficienza energetica potenzialmente migliori, in quanto sfrutta percorsi hardware dedicati.
Compromesso:
potrebbe comportare una frequenza fotogrammi inferiore in condizioni di oscurità, poiché il sensore ha bisogno di più tempo per catturare la luce. La frequenza fotogrammi può scendere fino a 10 FPS in condizioni di scarsa illuminazione.
Google Low Light Boost (software tramite Google Play Services)
Meccanismo:
questa soluzione, distribuita come modulo facoltativo tramite Google Play Services, applica il post-processing allo stream della videocamera. Utilizza una sofisticata tecnologia di miglioramento delle immagini in tempo reale chiamata HDRNet.
Google HDRNet:
questo modello di deep learning analizza l'immagine a una risoluzione inferiore per prevedere un insieme compatto di parametri (una griglia bilaterale). Questa griglia guida quindi il miglioramento efficiente e spazialmente variabile dell'immagine a piena risoluzione sulla GPU. Il modello è addestrato per illuminare e migliorare la qualità delle immagini in condizioni di scarsa illuminazione, con particolare attenzione alla visibilità del volto.
Orchestrazione dell'elaborazione:
il modello HDRNet e la relativa logica sono orchestrati dal processore Low Light Boost. tra cui:
- Analisi della scena:
un calcolatore personalizzato che stima la luminosità effettiva della scena utilizzando i metadati della fotocamera (sensibilità del sensore, tempo di esposizione e così via) e il contenuto dell'immagine. Questa analisi determina il livello di incremento. - Elaborazione HDRNet:
applica il modello HDRNet per illuminare il frame. Il modello utilizzato è ottimizzato per le scene con scarsa illuminazione e per le prestazioni in tempo reale. - Fusione:
i fotogrammi originali e quelli elaborati con HDRNet vengono uniti. La quantità di fusione applicata è controllata dinamicamente dal calcolatore della luminosità della scena, garantendo una transizione graduale tra gli stati potenziato e non potenziato.
Vantaggio:
funziona su una gamma più ampia di dispositivi (attualmente supporta Samsung S22 Ultra, S23 Ultra, S24 Ultra, S25 Ultra e Pixel 6 fino a Pixel 9) senza richiedere il supporto HAL specifico. Mantiene la frequenza fotogrammi della videocamera, in quanto è un effetto di post-elaborazione.
Compromesso:
in quanto metodo di post-elaborazione, la qualità è limitata dalle informazioni presenti nei frame forniti dal sensore. Non è in grado di recuperare i dettagli persi a causa dell'oscurità estrema a livello di sensore.
Offrendo percorsi hardware e software, Low Light Boost fornisce una soluzione scalabile per migliorare le prestazioni della fotocamera in condizioni di scarsa illuminazione nell'ecosistema Android. Gli sviluppatori devono dare la priorità alla modalità AE, se disponibile, e utilizzare Google Low Light Boost come robusto fallback.
Implementare la funzionalità Aumento luce nell'app
Ora vediamo come implementare entrambe le offerte di LLB. Puoi implementare quanto segue indipendentemente dal fatto che utilizzi CameraX o Camera2 nella tua app. Per ottenere risultati ottimali, ti consigliamo di implementare sia il passaggio 1 che il passaggio 2.
Passaggio 1: modalità AE con aumento luce
Disponibile su alcuni dispositivi con Android 15 e versioni successive, la modalità LLB AE funziona come una modalità di esposizione automatica (AE) specifica.
1. Verifica disponibilità
Innanzitutto, controlla se il dispositivo videocamera supporta la modalità AE LLB.
val cameraInfo = cameraProvider.getCameraInfo(cameraSelector) val isLlbSupported = cameraInfo.isLowLightBoostSupported
2. Attivare la modalità
Se supportato, puoi attivare la modalità AE LLB utilizzando l'oggetto CameraControl di 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. Monitorare lo stato
Il fatto che tu abbia richiesto la modalità non significa che sia attualmente "in boost". Il sistema attiva il potenziamento solo quando la scena è effettivamente buia. Puoi configurare un Observer per aggiornare la tua UI (ad esempio, mostrare un'icona della luna) o convertire in un flusso utilizzando la funzione di estensione asFlow().
if (isLlbSupported) {
camera?.cameraInfo.lowLightBoostState.asFlow().collectLatest { state ->
// Update UI accordingly
updateMoonIcon(state == LowLightBoostState.ACTIVE)
}
}Puoi leggere la guida completa sulla modalità AE Low Light Boost qui.
Passaggio 2: Google Low Light Boost
Per i dispositivi che non supportano la modalità AE hardware, Google Low Light Boost funge da potente alternativa. Utilizza una LowLightBoostSession per intercettare e illuminare lo stream.
1. Aggiungere dipendenze
Questa funzionalità viene fornita tramite Google Play Services.
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. Inizializzare il client
Prima di avviare la videocamera, utilizza LowLightBoostClient per assicurarti che il modulo sia installato e che il dispositivo sia supportato.
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. Crea una sessione LLB
Google LLB elabora ogni frame, quindi devi fornire la tua Surface di visualizzazione a LowLightBoostSession, che ti restituisce una Surface a cui è stata applicata la luminosità. Per le app Camera2, puoi aggiungere la Surface risultante con CaptureRequest.Builder.addTarget(). Per CameraX, questa pipeline di elaborazione si allinea meglio alla classe CameraEffect, in cui puoi applicare l'effetto con un SurfaceProcessor e fornirlo di nuovo all'anteprima con un SurfaceProvider, come mostrato in questo codice.
// 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. Trasmettere i metadati
Affinché l'algoritmo funzioni, deve analizzare lo stato di esposizione automatica della videocamera. Devi restituire i risultati della cattura alla sessione LLB. In CameraX, questa operazione può essere eseguita estendendo Preview.Builder con 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)
}
}
)I passaggi di implementazione dettagliati per il client e la sessione sono disponibili nella guida a Google Low Light Boost.
Passaggi successivi
Implementando queste due opzioni, ti assicuri che i tuoi utenti possano vedere chiaramente, scansionare in modo affidabile e interagire in modo efficace, indipendentemente dalle condizioni di illuminazione.
Per vedere queste funzionalità in azione all'interno di un codebase completo e pronto per la produzione, consulta l' app fotocamera Jetpack su GitHub. Implementa sia la modalità LLB AE sia Google LLB, fornendoti un riferimento per la tua integrazione.
Continua a leggere
-
Novità sul prodotto
Testare le interazioni multi-dispositivo è ora più facile che mai con l'emulatore Android.
Steven Jenkins • Lettura di 2 minuti
-
Novità sul prodotto
Android Studio supporta Gemma 4: il nostro modello locale più potente per la programmazione agentica
Il flusso di lavoro e le esigenze di ogni sviluppatore in materia di AI sono unici ed è importante poter scegliere in che modo l'AI può aiutarti nello sviluppo. A gennaio abbiamo introdotto la possibilità di scegliere qualsiasi modello di AI locale o remoto per potenziare la funzionalità di AI in Android Studio
Matthew Warner • Lettura di 2 minuti
-
Novità sul prodotto
Android Studio Panda 3 è ora stabile e pronto per l'uso in produzione. Questa release ti offre ancora più controllo e personalizzazione sui tuoi flussi di lavoro basati sull'AI, rendendo più facile che mai creare app per Android di alta qualità.
Matt Dyor • Lettura di 3 minuti
Segui gli aggiornamenti
Ricevi ogni settimana gli ultimi approfondimenti sullo sviluppo per Android direttamente nella tua casella di posta.