Wiadomości o usługach
Rozjaśnianie obrazu z kamery w czasie rzeczywistym za pomocą funkcji Low Light Boost
Czas czytania: 7 minut
Niedawno pisaliśmy o tym, jak Instagram umożliwia użytkownikom robienie wspaniałych zdjęć przy słabym oświetleniu za pomocą trybu nocnego. Ta funkcja doskonale sprawdza się w przypadku zdjęć statycznych, gdzie jest czas na połączenie wielu ekspozycji w celu utworzenia wysokiej jakości zdjęcia. Ale co z chwilami, które zdarzają się między zdjęciami? Użytkownicy muszą wchodzić w interakcję z aparatem nie tylko w momencie naciśnięcia przycisku migawki. Używają też podglądu do komponowania sceny lub skanowania kodów QR.
Dziś przyjrzymy się bliżej funkcji Low Light Boost (LLB), która rozjaśnia strumienie wideo z kamery w czasie rzeczywistym. W przeciwieństwie do trybu nocnego, który wymaga dłuższego czasu naświetlania, Ulepszenie przy słabym oświetleniu działa natychmiast w podglądzie na żywo i nagraniach wideo. LLB automatycznie dostosowuje poziom rozjaśnienia do dostępnego światła, dzięki czemu jest zoptymalizowany pod kątem każdego otoczenia.
Dzięki niedawnej aktualizacji funkcja LLB umożliwia użytkownikom Instagrama ustawienie idealnego kadru, a następnie wykorzystanie istniejącego trybu nocnego, który zapewnia zdjęcia wysokiej jakości przy słabym oświetleniu. Użytkownicy korzystają z niego już od ponad roku.
Dlaczego jasność w czasie rzeczywistym jest ważna
Tryb nocny ma na celu poprawę jakości końcowego obrazu, a funkcja wzmocnienia przy słabym oświetleniu ma ułatwiać korzystanie z urządzenia i interakcję z nim w ciemnych pomieszczeniach. Kolejnym ważnym czynnikiem jest to, że chociaż te funkcje działają bardzo dobrze razem, możesz używać LLB i trybu nocnego niezależnie od siebie. W niektórych przypadkach LLB jest przydatne samo w sobie, gdy nie są potrzebne zdjęcia w trybie nocnym. Oto jak LLB zwiększa wygodę użytkowników:
- Lepsze kadrowanie i nagrywanie: w słabo oświetlonych scenach podgląd standardowego aparatu może być całkowicie czarny. LLB rozjaśnia wizjer, dzięki czemu użytkownicy mogą zobaczyć, co kadrują, zanim nacisną przycisk migawki. W tym przypadku możesz użyć trybu nocnego, aby uzyskać najlepszą jakość zdjęć przy słabym oświetleniu, lub pozwolić funkcji LLB na wyświetlanie zdjęć w formie „widzisz to, co otrzymujesz”.
- Niezawodne skanowanie: kody QR są wszechobecne, ale skanowanie ich w ciemnej restauracji lub na parkingu jest często frustrujące. Dzięki znacznie jaśniejszemu przekazowi z kamery algorytmy skanowania mogą niezawodnie wykrywać i dekodować kody QR nawet w bardzo słabym oświetleniu.
- Ulepszone interakcje: w przypadku aplikacji, które obejmują interakcje z transmisją na żywo (np. asystenci AI lub rozmowy wideo), LLB zwiększa ilość dostrzegalnych informacji, dzięki czemu modele rozpoznawania obrazów mają wystarczającą ilość danych do pracy.
Różnica w Instagramie
Zespół inżynierów odpowiedzialny za aplikację Instagram na Androida nieustannie pracuje nad tym, aby zapewnić użytkownikom najnowocześniejsze funkcje aparatu. Na powyższym przykładzie widać, jak dużą różnicę robi LLB w przypadku Pixela 10 Pro.
Łatwo sobie wyobrazić, jak bardzo wpływa to na wygodę użytkowników. Jeśli użytkownicy nie widzą tego, co nagrywają, istnieje większe prawdopodobieństwo, że zrezygnują z nagrywania.
Wybór implementacji
Aby zapewnić jak najlepsze wrażenia na jak największej liczbie urządzeń, możesz wdrożyć funkcję Low Light Boost na 2 sposoby:
- Tryb automatycznej ekspozycji w słabym oświetleniu: to tryb automatycznej ekspozycji na poziomie sprzętowym. Zapewnia najwyższą jakość i wydajność, ponieważ bezpośrednio dostraja potok procesora sygnału obrazu (ISP). Zawsze najpierw sprawdzaj to.
- Wzmocnienie przy słabym oświetleniu od Google: jeśli urządzenie nie obsługuje trybu AE, możesz skorzystać z tego rozwiązania opartego na oprogramowaniu, które jest dostępne w usługach Google Play. Stosuje przetwarzanie końcowe do strumienia z kamery, aby go rozjaśnić. Jest to rozwiązanie w całości oparte na oprogramowaniu, więc jest dostępne na większej liczbie urządzeń. Dzięki temu możesz docierać do większej liczby urządzeń z LLB.
Tryb AE ze wzmocnieniem przy słabym oświetleniu (sprzętowy)
Mechanizm:
ten tryb jest obsługiwany na urządzeniach z Androidem 15 i nowszym. Wymaga on wdrożenia obsługi w HAL przez producenta OEM (obecnie dostępny na Pixelu 10). Jest on bezpośrednio zintegrowany z procesorem sygnału obrazu (ISP) kamery. Jeśli ustawisz parametr CaptureRequest.CONTROL_AE_MODE na wartość CameraMetadata.CONTROL_AE_MODE_ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY, system aparatu przejmie kontrolę.
Zachowanie:
warstwa HAL/ISP analizuje scenę i dostosowuje parametry czujnika i przetwarzania, często zwiększając czas ekspozycji, aby rozjaśnić obraz.Dzięki temu można uzyskać klatki o znacznie lepszym stosunku sygnału do szumu (SNR), ponieważ dłuższy czas ekspozycji, a nie zwiększenie wzmocnienia cyfrowego czujnika (ISO), pozwala czujnikowi rejestrować więcej informacji o świetle.
Zaleta:
potencjalnie lepsza jakość obrazu i większa energooszczędność, ponieważ wykorzystuje dedykowane ścieżki sprzętowe.
Wada:
może skutkować niższą liczbą klatek na sekundę w bardzo ciemnych warunkach, ponieważ czujnik potrzebuje więcej czasu na rejestrowanie światła. W bardzo słabym oświetleniu liczba klatek na sekundę może spaść nawet do 10 FPS.
Doświetlanie w słabym oświetleniu (oprogramowanie w Usługach Google Play)
Mechanizm:
to rozwiązanie, rozpowszechniane jako opcjonalny moduł za pomocą Usług Google Play, przetwarza strumień z kamery. Wykorzystuje zaawansowaną technologię ulepszania obrazu w czasie rzeczywistym o nazwie HDRNet.
Google HDRNet:
ten model uczenia głębokiego analizuje obraz w niższej rozdzielczości, aby przewidzieć kompaktowy zestaw parametrów (siatkę dwustronną). Ta siatka służy następnie do efektywnego, przestrzennego ulepszania obrazu w pełnej rozdzielczości na procesorze graficznym. Model jest trenowany w celu rozjaśniania i poprawiania jakości obrazu w słabym oświetleniu, ze szczególnym uwzględnieniem widoczności twarzy.
Orkiestracja procesów:
model HDRNet i towarzysząca mu logika są koordynowane przez procesor Low Light Boost. Obejmuje to m.in.:
-
Analiza sceny:
niestandardowy kalkulator, który szacuje rzeczywistą jasność sceny na podstawie metadanych aparatu (czułość czujnika, czas ekspozycji itp.) i zawartości obrazu. Ta analiza określa poziom wzmocnienia. -
Przetwarzanie HDRNet:
stosuje model HDRNet, aby rozjaśnić klatkę. Używany model jest dostosowany do scen w słabym oświetleniu i zoptymalizowany pod kątem wydajności w czasie rzeczywistym. -
Łączenie:
oryginalne klatki i klatki przetworzone przez HDRNet są łączone. Poziom mieszania jest dynamicznie kontrolowany przez kalkulator jasności sceny, co zapewnia płynne przejście między stanami wzmocnionym i niewzmocnionym.
Zaleta:
działa na szerszej gamie urządzeń (obecnie obsługuje Samsungi S22 Ultra, S23 Ultra, S24 Ultra, S25 Ultra oraz Pixele od 6 do 9) bez konieczności obsługi konkretnego HAL. Utrzymuje liczbę klatek na sekundę, ponieważ jest to efekt przetwarzania końcowego.
Kompromis:
jako metoda przetwarzania końcowego jakość jest ograniczona przez informacje zawarte w klatkach dostarczanych przez czujnik. Nie może odzyskać szczegółów utraconych z powodu ekstremalnej ciemności na poziomie czujnika.
Dzięki dwóm ścieżkom, sprzętowej i programowej, funkcja Low Light Boost zapewnia skalowalne rozwiązanie, które poprawia wydajność aparatu przy słabym oświetleniu w całym ekosystemie Androida. Deweloperzy powinni w miarę możliwości korzystać z trybu AE, a w razie potrzeby używać funkcji Google Low Light Boost.
Wdrażanie doświetlania w aplikacji
Przyjrzyjmy się teraz, jak wdrożyć obie oferty LLB. Możesz to zrobić niezależnie od tego, czy w aplikacji używasz CameraX czy Camera2. Aby uzyskać najlepsze wyniki, zalecamy wykonanie kroków 1 i 2.
Krok 1: Tryb AE wzmocnienia przy słabym oświetleniu
Dostępny na wybranych urządzeniach z Androidem 15 lub nowszym tryb LLB AE działa jako specjalny tryb automatycznej ekspozycji (AE).
1. Sprawdź dostępność
Najpierw sprawdź, czy urządzenie z kamerą obsługuje tryb AE LLB.
val cameraInfo = cameraProvider.getCameraInfo(cameraSelector) val isLlbSupported = cameraInfo.isLowLightBoostSupported
2. Włączanie trybu
Jeśli jest obsługiwany, możesz włączyć tryb automatycznej ekspozycji przy słabym oświetleniu za pomocą obiektu CameraControl w 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. Monitorowanie stanu
Samo poproszenie o ten tryb nie oznacza, że obecnie „wzmacnia” on Twoje treści. System włącza wzmocnienie tylko wtedy, gdy scena jest rzeczywiście ciemna. Możesz skonfigurować obserwatora, aby aktualizować interfejs (np. wyświetlać ikonę księżyca) lub przekształcać go w Flow za pomocą funkcji rozszerzenia asFlow().
if (isLlbSupported) {
camera?.cameraInfo.lowLightBoostState.asFlow().collectLatest { state ->
// Update UI accordingly
updateMoonIcon(state == LowLightBoostState.ACTIVE)
}
}
Pełny przewodnik po trybie AE Low Light Boost znajdziesz tutaj.
Krok 2. Wzmocnienie przy słabym oświetleniu od Google
W przypadku urządzeń, które nie obsługują sprzętowego trybu AE, funkcja Google Low Light Boost stanowi skuteczne rozwiązanie zastępcze. Wykorzystuje LowLightBoostSession do przechwytywania i rozjaśniania strumienia.
1. Dodawanie zależności
Ta funkcja jest dostępna w ramach Usług 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. Inicjowanie klienta
Zanim uruchomisz aparat, użyj LowLightBoostClient, aby sprawdzić, czy moduł jest zainstalowany i czy urządzenie jest obsługiwane.
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. Tworzenie sesji LLB
Google LLB przetwarza każdą klatkę, więc musisz przekazać wyświetlacz Surface do LowLightBoostSession, a ono zwróci Ci wyświetlacz z zastosowanym rozjaśnieniem. W przypadku aplikacji Camera2 możesz dodać wynikową powierzchnię za pomocą metody CaptureRequest.Builder.addTarget(). W przypadku CameraX ten potok przetwarzania najlepiej pasuje do klasy CameraEffect, w której możesz zastosować efekt za pomocą klasy SurfaceProcessor i przekazać go z powrotem do podglądu za pomocą klasy SurfaceProvider, jak widać w tym kodzie.
// 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. Przekazywanie metadanych
Aby algorytm działał, musi analizować stan automatycznej ekspozycji aparatu. Musisz przekazać wyniki przechwytywania z powrotem do sesji LLB. W CameraX można to zrobić, rozszerzając Preview.Builder za pomocą funkcji 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)
}
}
)
Szczegółowe instrukcje wdrożenia po stronie klienta i sesji znajdziesz w przewodniku Google Low Light Boost.
Następne kroki
Dzięki wdrożeniu tych 2 opcji użytkownicy będą mogli wyraźnie widzieć, niezawodnie skanować i skutecznie wchodzić w interakcje niezależnie od warunków oświetleniowych.
Aby zobaczyć te funkcje w działaniu w kompletnym, przygotowanym do zastosowań produkcyjnych kodzie, zapoznaj się z aplikacją aparatu Jetpack w GitHubie. Implementuje zarówno tryb LLB AE, jak i Google LLB, dzięki czemu możesz wykorzystać go jako punkt odniesienia dla własnej integracji.
Czytaj dalej
-
Wiadomości o usługach
Android Studio Panda 4 jest już stabilny i możesz go używać w środowisku produkcyjnym. Wprowadziliśmy m.in. tryb planowania i przewidywanie kolejnych zmian, dzięki czemu tworzenie wysokiej jakości aplikacji na Androida jest jeszcze łatwiejsze.
Matt Dyor • Czas czytania: 5 minut
-
Wiadomości o usługach
Jeśli jesteś deweloperem aplikacji na Androida i chcesz wdrożyć w niej innowacyjne funkcje oparte na AI, niedawno udostępniliśmy nowe, zaawansowane aktualizacje.
Thomas Ezan • Czas czytania: 3 minuty
-
Wiadomości o usługach
Android 17 osiągnął etap wersji beta 4, czyli ostatniej zaplanowanej wersji beta w tym cyklu wydawniczym, co jest kluczowym kamieniem milowym dla zgodności aplikacji i stabilności platformy.
Daniel Galpin • Czas czytania: 4 minuty
Bądź na bieżąco
Otrzymuj co tydzień najnowsze informacje o tworzeniu aplikacji na Androida na swoją skrzynkę odbiorczą.