Ürün Haberleri

Düşük Işık Güçlendirmesiyle Gerçek Zamanlı Kamera Özet Akışlarınızı Aydınlatın

Okuma süresi: 7 dakika
Donovan McMurray
Geliştirici İlişkileri Mühendisi

Kısa süre önce,  Instagram'ın gece modunu kullanarak kullanıcıların düşük ışıkta çarpıcı fotoğraflar çekmesini nasıl sağladığını paylaşmıştık. Bu özellik, yüksek kaliteli bir statik çekim oluşturmak için birden fazla pozlamayı birleştirme süresinin olduğu durağan görüntüler için idealdir. Peki fotoğraflar arasında yaşanan anlar? Kullanıcıların, deklanşör düğmesine basıldığı anın dışında da kamerayla etkileşim kurması gerekir. Ayrıca, sahneyi oluşturmak veya QR kodlarını taramak için de önizlemeyi kullanırlar.

Bugün, gerçek zamanlı kamera akışlarını aydınlatmak için tasarlanmış güçlü bir özellik olan Zayıf Işık Güçlendirme (LLB)'yi ayrıntılı olarak ele alacağız. Gece Modu'nda sabit çekim süresi gerekirken Zayıf Işık Geliştirme özelliği, canlı önizlemenizde ve video kayıtlarınızda anında çalışır. LLB, mevcut ışığa göre ne kadar aydınlatma gerektiğini otomatik olarak ayarlar. Bu nedenle her ortam için optimize edilmiştir.

Yakın zamanda yapılan bir güncelleme ile LLB, Instagram kullanıcılarının mükemmel çekimi yapmasına olanak tanıyor. Ardından, mevcut gece modu uygulaması, kullanıcıların bir yılı aşkın süredir keyif aldığı aynı yüksek kaliteli düşük ışık fotoğraflarını çekmelerini sağlıyor.

Gerçek Zamanlı Parlaklığın Önemi

Gece Modu, son resim kalitesini iyileştirmeyi amaçlarken Zayıf Işık Güçlendirme, karanlık ortamlarda kullanılabilirlik ve etkileşim için tasarlanmıştır. Göz önünde bulundurulması gereken bir diğer önemli faktör de birlikte çok iyi çalışsalar da LLB ve Gece Modu'nu bağımsız olarak kullanabileceğinizdir. Bu kullanım alanlarından bazılarında, Gece Modu fotoğraflarına ihtiyaç duyulmadığında LLB'nin tek başına da değerli olduğunu göreceksiniz. LLB, kullanıcı deneyimini şu şekilde iyileştirir:

  • Daha İyi Kadraj ve Çekim: Loş ışıklı sahnelerde standart kamera önizlemesi tamamen karanlık olabilir. LLB, vizörü aydınlatarak kullanıcıların deklanşör düğmesine basmadan önce kadrajlarına aldıkları öğeleri görmelerini sağlar. Bu deneyimde, düşük ışıkta en iyi kalitede fotoğraf sonucu için gece modunu kullanabilir veya LLB'nin kullanıcıya "gördüğünüz gibi" bir fotoğraf sonucu vermesine izin verebilirsiniz.
  • Güvenilir Tarama: QR kodları her yerde bulunur ancak karanlık bir restoranda veya otoparkta bu kodları taramak genellikle sinir bozucudur. Tarama algoritmaları, önemli ölçüde daha parlak bir kamera feed'i sayesinde çok karanlık ortamlarda bile QR kodlarını güvenilir bir şekilde algılayıp çözebilir.
  • Gelişmiş Etkileşimler: Canlı video etkileşimleri içeren uygulamalarda (ör. yapay zeka asistanları veya görüntülü görüşmeler) LLB, algılanabilir bilgi miktarını artırarak bilgisayarla görme modellerinin çalışmak için yeterli veriye sahip olmasını sağlar.

Instagram'daki Fark

LLB_IG_demo_white_background.gif

Android Instagram uygulamasının arkasındaki mühendislik ekibi, kullanıcılarına en iyi kamera deneyimini sunmak için her zaman yoğun bir şekilde çalışmaktadır. Yukarıdaki örnekte, LLB'nin Pixel 10 Pro'da ne kadar fark yarattığını görebilirsiniz. 

lowlight.png

Bu durumun kullanıcı deneyiminde ne kadar fark yarattığını tahmin etmek kolaydır. Kullanıcılar çektiklerini göremezse çekimi bırakma olasılıkları daha yüksektir. 

lowlight1.png

Uygulama yönteminizi seçme

En geniş cihaz yelpazesinde en iyi deneyimi sunmak için Zayıf Işık Güçlendirme'yi uygulamanın iki yolu vardır:

  1. Düşük ışıkta otomatik pozlama modu: Bu, donanım katmanında otomatik pozlama modudur. Görüntü sinyali işlemcisi (GSİ) ardışık düzenini doğrudan ayarladığından en yüksek kaliteyi ve performansı sunar. Öncelikle bunu kontrol edin.
  2. Google Low Light Boost: Cihaz AE modunu desteklemiyorsa Google Play Hizmetleri tarafından sağlanan bu yazılıma dayalı çözüme geri dönebilirsiniz. Kamera görüntü akışını aydınlatmak için işleme sonrası uygular. Tamamen yazılıma dayalı bir çözüm olduğundan daha fazla cihazda kullanılabilir. Bu nedenle, bu uygulama LLB ile daha fazla cihaza ulaşmanıza yardımcı olur.

Düşük ışıkta otomatik pozlama modu (donanım)

Mekanizma:
Bu mod, Android 15 ve sonraki sürümleri çalıştıran cihazlarda desteklenir ve OEM'nin HAL'de desteği uygulaması gerekir (şu anda Pixel 10 cihazlarda kullanılabilir). Doğrudan kameranın görüntü sinyali işlemcisiyle (ISP) entegre olur. CaptureRequest.CONTROL_AE_MODE değerini CameraMetadata.CONTROL_AE_MODE_ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY olarak ayarlarsanız kamera sistemi kontrolü ele alır.

Davranış:
HAL/ISP, sahneyi analiz eder ve sensör ile işleme parametrelerini ayarlar. Bu ayarlamalar genellikle pozlama süresini artırarak görüntüyü daha parlak hale getirmeyi içerir. Bu, dijital sensör kazancında (ISO) artış yerine daha uzun pozlama süresi sayesinde sensörün daha fazla ışık bilgisi yakalamasına olanak tanıdığı için önemli ölçüde iyileştirilmiş sinyal-gürültü oranına (SNR) sahip kareler elde etmenizi sağlayabilir.

Avantaj:
Özel donanım yollarından yararlandığı için resim kalitesi ve güç verimliliği daha iyi olabilir.

Dezavantaj:
Sensörün ışığı yakalaması daha uzun sürdüğünden çok karanlık koşullarda daha düşük kare hızıyla sonuçlanabilir. Kare hızı, çok düşük ışık koşullarında 10 FPS'ye kadar düşebilir.

Google Low Light Boost (Google Play Hizmetleri aracılığıyla yazılım)

Mekanizma:
Google Play Hizmetleri üzerinden isteğe bağlı bir modül olarak dağıtılan bu çözüm, kamera görüntü akışına son işlem uygular. HDRNet adlı gelişmiş bir gerçek zamanlı görüntü iyileştirme teknolojisi kullanır.

Google HDRNet:
Bu derin öğrenme modeli, kompakt bir parametre grubu (iki taraflı bir ızgara) tahmin etmek için görüntüyü daha düşük çözünürlükte analiz eder. Bu kılavuz, GPU'daki tam çözünürlüklü görüntünün verimli ve mekansal olarak değişen şekilde iyileştirilmesini sağlar. Model, yüz görünürlüğüne odaklanarak düşük ışık koşullarında resim kalitesini iyileştirmek ve parlaklığını artırmak için eğitilmiştir.

Süreç düzenleme:
HDRNet modeli ve beraberindeki mantık, düşük ışık güçlendirme işlemcisi tarafından düzenlenir. Bu güvenlik özelliklerinden bazıları şunlardır:

  1. Sahne Analizi:
    Kamera meta verilerini (sensör hassasiyeti, pozlama süresi vb.) ve görüntü içeriğini kullanarak gerçek sahne parlaklığını tahmin eden özel bir hesap makinesi. Bu analiz, artış düzeyini belirler.
  2. HDRNet İşleme:
    Kareyi aydınlatmak için HDRNet modelini uygular. Kullanılan model, düşük ışıklı sahneler için ayarlanmış ve gerçek zamanlı performans için optimize edilmiştir.
  3. Karıştırma:
    Orijinal ve HDRNet ile işlenmiş kareler karıştırılır. Uygulanan karıştırma miktarı, sahne parlaklığı hesaplayıcı tarafından dinamik olarak kontrol edilir. Bu sayede, artırılmış ve artırılmamış durumlar arasında sorunsuz bir geçiş sağlanır.
low-light-boost-processor-diagram.png

Avantaj:
Belirli bir HAL desteği gerektirmeden daha geniş bir cihaz yelpazesinde çalışır (şu anda Samsung S22 Ultra, S23 Ultra, S24 Ultra, S25 Ultra ve Pixel 6 ile Pixel 9 arasındaki modelleri desteklemektedir). Kameranın kare hızını korur. Bu, bir son işleme efektidir.

Değişken:
Bir son işleme yöntemi olarak kalite, sensör tarafından sağlanan karelerdeki bilgilerle sınırlıdır. Sensör düzeyinde aşırı karanlık nedeniyle kaybolan ayrıntıları kurtaramaz.

Hem donanım hem de yazılım yolları sunan Düşük Işık Güçlendirmesi, Android ekosisteminde düşük ışıkta kamera performansını iyileştirmek için ölçeklenebilir bir çözüm sağlar. Geliştiriciler, varsa AE moduna öncelik vermeli ve Google Zayıf Işık Güçlendirme'yi sağlam bir yedek olarak kullanmalıdır.

Uygulamanızda Düşük Işık Güçlendirmesini Uygulama

Şimdi de her iki LLB teklifinin nasıl uygulanacağına bakalım. Uygulamanızda CameraX veya Camera2 kullanmanıza bakılmaksızın aşağıdakileri uygulayabilirsiniz. En iyi sonuçlar için hem 1. hem de 2. adımı uygulamanızı öneririz.

1. adım: Zayıf ışıkta pozlama artırma modu

Android 15 ve sonraki sürümlerin yüklü olduğu belirli cihazlarda kullanılabilir. LLB AE modu, belirli bir otomatik pozlama (AE) modu olarak işlev görür.

1. Uygunluk durumunu kontrol etme

Öncelikle kamera cihazının LLB AE modunu destekleyip desteklemediğini kontrol edin.

val cameraInfo = cameraProvider.getCameraInfo(cameraSelector)
val isLlbSupported = cameraInfo.isLowLightBoostSupported

2. Modu etkinleştirme

Destekleniyorsa CameraX'in CameraControl nesnesini kullanarak LLB AE modunu etkinleştirebilirsiniz.

// 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. Devleti İzleme

Modu istemiş olmanız, şu anda "güçlendirme" yapıldığı anlamına gelmez. Sistem, yalnızca sahne gerçekten karanlık olduğunda güçlendirmeyi etkinleştirir. Kullanıcı arayüzünüzü güncellemek (ör. ay simgesi göstermek) veya uzantı işlevi olan asFlow() kullanarak Flow'a dönüştürmek için Observer ayarlayabilirsiniz.

if (isLlbSupported) {
  camera?.cameraInfo.lowLightBoostState.asFlow().collectLatest { state ->
    // Update UI accordingly
    updateMoonIcon(state == LowLightBoostState.ACTIVE)
  }
}

 Düşük Işıkta AE Modunu Artırma ile ilgili kılavuzun tamamını okuyabilirsiniz.

2. adım: Google Zayıf Işık Güçlendirme

Donanım AE modunu desteklemeyen cihazlarda Google Zayıf Işık Güçlendirme, güçlü bir yedek olarak işlev görür. Akışı yakalayıp aydınlatmak için LowLightBoostSession kullanır.

1. Bağımlılık Ekleme

Bu özellik, Google Play Hizmetleri üzerinden sunulur.

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. İstemciyi başlatma

Kameranızı başlatmadan önce, modülün yüklendiğinden ve cihazın desteklendiğinden emin olmak için LowLightBoostClient'ı kullanın.

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. LLB oturumu oluşturma

Google LLB her kareyi işler. Bu nedenle, ekran yüzeyinizi LowLightBoostSession'ya vermeniz gerekir. Bu işlem sonucunda, parlaklık uygulanmış bir yüzey size geri verilir. Camera2 uygulamalarında, sonuçta elde edilen Surface'i CaptureRequest.Builder.addTarget() ile ekleyebilirsiniz. CameraX'te bu işleme ardışık düzeni en iyi şekilde CameraEffect sınıfıyla uyumludur. Bu sınıfta, efekti SurfaceProcessor ile uygulayabilir ve bu kodda gösterildiği gibi SurfaceProvider ile önizlemenize geri verebilirsiniz.

// 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. Meta verileri iletme

Algoritmanın çalışması için kameranın otomatik pozlama durumunu analiz etmesi gerekir. Yakalanan sonuçları LLB oturumuna geri iletmeniz gerekir. CameraX'te bu işlem, Preview.Builder'ı Camera2Interop.Extender.setSessionCaptureCallback() ile genişleterek yapılabilir.

Camera2Interop.Extender(previewBuilder).setSessionCaptureCallback(
  object : CameraCaptureSession.CaptureCallback() {
    override fun onCaptureCompleted(
      session: CameraCaptureSession,
      request: CaptureRequest,
      result: TotalCaptureResult
    ) {
      super.onCaptureCompleted(session, request, result)
      llbSession?.processCaptureResult(result)
    }
  }
)

İstemci ve oturum için ayrıntılı uygulama adımlarını  Google Zayıf Işık Güçlendirme kılavuzunda bulabilirsiniz.

Sonraki Adımlar

Bu iki seçeneği uygulayarak kullanıcılarınızın ışık koşullarından bağımsız olarak net bir şekilde görebilmesini, güvenilir bir şekilde tarayabilmesini ve etkili bir şekilde etkileşim kurabilmesini sağlarsınız.

Bu özellikleri eksiksiz ve üretime hazır bir kod tabanında kullanırken görmek için GitHub'daki  Jetpack Camera App'e göz atın. Hem LLB AE Modu hem de Google LLB'yi uygulayarak kendi entegrasyonunuz için referans sağlar. 

Yazan:

Okumaya devam edin