Ürün Haberleri

Düşük Işık Güçlendirmesi ile Gerçek Zamanlı Kamera Feed'lerinizi Aydınlatma

Okuma süresi: 7 dk.
Donovan McMurray adlı kullanıcının profilini görüntüle
Donovan McMurray Geliştirici İlişkileri Mühendisi

Kısa süre önce, Instagram'ın Gece Modu ile kullanıcıların  düşük ışıkta nasıl etkileyici fotoğraflar çekmesini sağladığını paylaşmıştık. Bu özellik, yüksek kaliteli bir statik çekim oluşturmak için birden fazla pozlamayı birleştirmeye zamanın olduğu hareketsiz görüntüler için idealdir. Peki ya fotoğraflar arasındaki anlar? Kullanıcıların kamerayla etkileşimi, deklanşör düğmesine basılan anla sınırlı kalmamalıdır. Ayrıca, sahnelerini oluşturmak veya QR kodlarını taramak için önizlemeyi kullanırlar.

Bugün, gerçek zamanlı kamera görüntü akışlarını aydınlatmak için tasarlanmış güçlü bir özellik olan Zayıf Işık Güçlendirme (LLB) özelliğini inceleyeceğiz. Çekim sırasında cihazı sabit tutmanızı gerektiren Gece Modu'nun aksine, Düşük Işıkta 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. Böylece her ortam için optimize edilir.

Yakın zamanda yapılan bir güncellemeyle LLB, Instagram kullanıcılarının mükemmel kareyi yakalamasına olanak tanıyor. Ardından, mevcut Gece Modu uygulamaları, kullanıcıların bir yılı aşkın süredir keyifle kullandığı yüksek kaliteli düşük ışık fotoğraflarını sunuyor.

Gerçek Zamanlı Parlaklık Neden Önemlidir?

Gece Modu, nihai resim kalitesini iyileştirmeyi amaçlarken Düşük Işık Güçlendirmesi, karanlık ortamlarda kullanılabilirlik ve etkileşimlilik için tasarlanmıştır. Dikkate alınması gereken bir diğer önemli nokta da, birlikte çok iyi çalışsalar da LLB ve Gece Modu'nu bağımsız olarak kullanabilmenizdir. Bu kullanım alanlarından bazılarında göreceğiniz gibi, Gece Modu fotoğraflarına ihtiyaç duyulmadığında LLB tek başına değerlidir. LLB, kullanıcı deneyimini şu şekilde iyileştirir:

  • Daha iyi kadraj ve çekim: Loş ışıklı sahnelerde standart kamera önizlemesi zifiri karanlık olabilir. LLB, vizörü aydınlatarak kullanıcıların deklanşör düğmesine basmadan önce kadraja aldıkları nesneyi görmelerini sağlar. Bu deneyimde, düşük ışıkta en kaliteli fotoğraf sonucunu elde etmek için gece modunu kullanabilir veya LLB'nin kullanıcıya "gördüğünüzü elde edersiniz" fotoğraf sonucu vermesini sağlayabilirsiniz.
  • Güvenilir Tarama: QR kodları her yerde kullanılsa da karanlık bir restoranda veya otoparkta taramak genellikle can sıkıcıdır. Kamera feed'i önemli ölçüde daha parlak olduğundan tarama algoritmaları, çok loş ortamlarda bile QR kodlarını güvenilir bir şekilde algılayıp çözebilir.
  • Gelişmiş etkileşimler: LLB, canlı video etkileşimleri içeren uygulamalarda (ör. yapay zeka asistanları veya görüntülü görüşmeler) algılanabilir bilgi miktarını artırarak bilgisayar görüşü modellerinin çalışması için yeterli veri sağlar.

Instagram'daki fark

LLB_IG_demo_white_background.gif

Android Instagram uygulamasının arkasındaki mühendislik ekibi, kullanıcılara en son teknolojiye sahip bir kamera deneyimi sunmak için her zaman yoğun bir şekilde çalışıyor. Yukarıdaki örnekte, LLB'nin Pixel 10 Pro'da ne kadar büyük bir fark yarattığını görebilirsiniz. 

lowlight.png

Bunun kullanıcı deneyiminde ne kadar büyük bir fark yaratacağını tahmin etmek zor değil. Kullanıcılar neyi kaydettiklerini göremiyorsa kaydı iptal etme olasılıkları daha yüksektir. 

lowlight1.png

Uygulama Yönteminizi Seçme

En geniş cihaz yelpazesinde en iyi deneyimi sunmak için Düşük Işık Güçlendirme'yi iki şekilde uygulayabilirsiniz:

  1. Düşük Işık Güçlendirmesi AE Modu: Bu, donanım katmanlı bir otomatik pozlama modudur. Görüntü sinyali işlemcisi (ISP) ardışık düzeninde doğrudan ince ayar yaptığı için en yüksek kaliteyi ve performansı sunar. Her zaman önce bunu kontrol edin.
  2. Google Düşük Işıkta Geliştirme: Cihaz, AE modunu desteklemiyorsa Google Play Hizmetleri tarafından sağlanan bu yazılım tabanlı çözümü kullanabilirsiniz. Kamera görüntü akışını aydınlatmak için son işlem uygular. Tamamen yazılım tabanlı 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 Işık Güçlendirmesi AE Modu (Donanım)

Mekanizma:
Bu mod, Android 15 ve sonraki sürümleri çalıştıran cihazlarda desteklenir ve OEM'in HAL'de desteği uygulamış olmasını gerektirir (ş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 görüntüyü aydınlatmak için sensör ve işleme parametrelerini (genellikle pozlama süresini artırma dahil) ayarlar. Bu, sinyal-gürültü oranının (SNR) önemli ölçüde iyileştirildiği kareler elde edilmesini sağlayabilir. Bunun nedeni, dijital sensör kazancındaki (ISO) artış yerine uzatılmış pozlama süresinin sensörün daha fazla ışık bilgisi yakalamasına olanak tanımasıdır.

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

Dezavantajı:
Sensörün ışığı yakalamak için daha fazla zamana ihtiyacı olduğundan çok karanlık ortamlarda kare hızının düşmesine neden olabilir. Kare hızı, çok düşük ışık koşullarında 10 FPS'ye kadar düşebilir.

Google Low Light Boost (Google Play Hizmetleri üzerinden yazılım)

Mekanizma:
Google Play Hizmetleri aracılığıyla isteğe bağlı bir modül olarak dağıtılan bu çözüm, kamera görüntü akışına sonradan işleme uygular. HDRNet adlı gelişmiş bir anlık resim iyileştirme teknolojisi kullanır.

Google HDRNet:
Bu derin öğrenme modeli, kompakt bir parametre kümesini (bilateral grid) tahmin etmek için görüntüyü daha düşük çözünürlükte analiz eder. Bu ızgara, GPU'da tam çözünürlüklü görüntünün verimli ve mekansal olarak değişen şekilde iyileştirilmesine yardımcı olur. Model, düşük ışık koşullarında yüz görünürlüğüne odaklanarak resim kalitesini artırmak ve görüntüyü aydınlatmak için eğitilmiştir.

İşlem düzenleme:
HDRNet modeli ve beraberindeki mantık, düşük ışık güçlendirmesi işlemcisi tarafından düzenlenir. Bunlardan bazıları:

  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 hesaplayıcı. Bu analiz, artırma düzeyini belirler.
  2. HDRNet İşleme:
    Kareyi daha parlak hale getirmek 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ısı tarafından dinamik olarak kontrol edilir. Böylece, güçlendirilmiş ve güçlendirilmemiş durumlar arasında yumuşak bir geçiş sağlanır.
low-light-boost-processor-diagram.png

Avantajı:
Özel HAL desteği gerektirmeden daha geniş bir cihaz yelpazesinde (şu anda Samsung S22 Ultra, S23 Ultra, S24 Ultra, S25 Ultra ve Pixel 6'dan Pixel 9'a kadar olan modelleri destekler) çalışır. Son işlem efekti olduğu için kameranın kare hızını korur.

Dezavantaj:
İşlem sonrası bir yöntem olduğundan 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.

Düşük Işık Güçlendirmesi, hem donanım hem de yazılım yolları sunarak Android ekosisteminde düşük ışıkta kamera performansını iyileştirmek için ölçeklenebilir bir çözüm sunar. Geliştiriciler, mümkün olduğunda AE moduna öncelik vermeli ve Google Zayıf Işık Güçlendirme'yi güvenilir bir yedek olarak kullanmalıdır.

Uygulamanızda Düşük Işık Güçlendirmesi'ni uygulama

Şimdi her iki LLB teklifini de nasıl uygulayacağımıza bakalım. Uygulamanızda CameraX veya Camera2 kullanıyorsanız aşağıdakileri uygulayabilirsiniz. En iyi sonuçlar için hem 1. hem de 2. adımı uygulamanızı öneririz.

1. adım: Düşük Işık Güçlendirmesi AE Modu

Android 15 ve sonraki sürümlerin yüklü olduğu belirli cihazlarda kullanılabilen LLB AE modu, özel bir otomatik pozlama (AE) modu olarak çalışı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. Durumu izleme

Modu istemeniz, şu anda "güçlendirme" yaptığı anlamına gelmez. Sistem, güçlendirmeyi yalnızca sahne gerçekten karanlık olduğunda etkinleştirir. Kullanıcı arayüzünüzü güncellemek için bir Observer ayarlayabilir (ör. ay simgesi gösterme) veya asFlow() uzantı işlevini kullanarak Flow'a dönüştürebilirsiniz.

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

 Düşük Işıkta Güçlendirme AE Modu ile ilgili kılavuzun tamamını buradan okuyabilirsiniz.

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

Google Zayıf Işık Güçlendirme, donanım AE modunu desteklemeyen cihazlar için güçlü bir yedek görevi görür. Akışı yakalayıp parlaklaştırmak için LowLightBoostSession kullanılır.

1. Bağımlılık ekleme

Bu özellik, Google Play Hizmetleri aracılığıyla 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 LowLightBoostClient'ı kullanarak modülün yüklü ve cihazın desteklendiğinden emin olun.

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'e vermeniz gerekir. , parlaklaştırma uygulanmış bir yüzey döndürür. Camera2 uygulamaları için elde edilen Surface'ı CaptureRequest.Builder.addTarget() ile ekleyebilirsiniz. CameraX için bu işleme ardışık düzeni, CameraEffect sınıfıyla en iyi şekilde uyum sağlar. Bu kodda görüldüğü gibi, efekti SurfaceProcessor ile uygulayabilir ve SurfaceProvider ile önizlemenize geri gönderebilirsiniz.

// 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. Yakalama sonuçlarını LLB oturumuna geri göndermeniz gerekir. CameraX'te bu işlem, Preview.Builder'ınızı 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 Düşük Işıkta Geliştirme 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 tarama yapabilmesini ve etkili bir şekilde etkileşim kurabilmesini sağlarsınız.

Bu özelliklerin üretime hazır eksiksiz bir kod tabanında nasıl çalıştığını görmek için GitHub'daki Jetpack Kamera Uygulaması'na göz atın. Hem LLB AE Modu'nu hem de Google LLB'yi uygulayarak kendi entegrasyonunuz için referans sağlar. 

Yazan:
Okumaya devam et