प्रॉडक्ट से जुड़ी खबरें

कम रोशनी में बेहतर फ़ोटो लेने की सुविधा की मदद से, रीयल-टाइम में कैमरा फ़ीड को बेहतर बनाएं

7 मिनट में पढ़ें
Donovan McMurray
डेवलपर रिलेशंस इंजीनियर

हाल ही में, हमने बताया था कि Instagram ने उपयोगकर्ताओं को नाइट मोड का इस्तेमाल करके, कम रोशनी में शानदार फ़ोटो लेने की सुविधा कैसे दी. यह सुविधा, स्थिर इमेज के लिए सबसे सही है. इसमें, अच्छी क्वालिटी की स्थिर इमेज बनाने के लिए, कई एक्सपोज़र को एक साथ जोड़ा जा सकता है. हालांकि, फ़ोटो के बीच के पलों के बारे में क्या? शटर बटन दबाने के अलावा, उपयोगकर्ताओं को कैमरे के साथ इंटरैक्ट करने की ज़रूरत होती है. वे सीन कंपोज़ करने या क्यूआर कोड स्कैन करने के लिए, झलक का भी इस्तेमाल करते हैं.

आज हम कम रोशनी में बेहतर फ़ोटो लेने की सुविधा (एलएलबी) के बारे में बात करेंगे. यह एक बेहतरीन सुविधा है, जिसे रीयल-टाइम में कैमरा स्ट्रीम को बेहतर बनाने के लिए डिज़ाइन किया गया है. नाइट मोड में, फ़ोटो लेने के लिए कुछ समय तक स्थिर रहना पड़ता है. वहीं, कम रोशनी में बेहतर फ़ोटो लेने की सुविधा, लाइव झलक और वीडियो रिकॉर्डिंग पर तुरंत काम करती है. एलएलबी, उपलब्ध रोशनी के हिसाब से, अपने-आप तय करता है कि कितनी रोशनी बढ़ानी है. इसलिए, यह हर तरह के माहौल के लिए ऑप्टिमाइज़ की गई है.

हाल ही में हुए अपडेट के बाद, एलएलबी की मदद से Instagram के उपयोगकर्ता, शानदार फ़ोटो ले सकते हैं. साथ ही, नाइट मोड की मौजूदा सुविधा की मदद से, कम रोशनी में अच्छी क्वालिटी वाली फ़ोटो ली जा सकती हैं. उपयोगकर्ता, पिछले एक साल से इस सुविधा का फ़ायदा उठा रहे हैं.

रीयल-टाइम में रोशनी बढ़ाने की सुविधा क्यों ज़रूरी है

नाइट मोड का मकसद, फ़ोटो की क्वालिटी को बेहतर बनाना है. वहीं, कम रोशनी में बेहतर फ़ोटो लेने की सुविधा, अंधेरे माहौल में इस्तेमाल और इंटरैक्टिविटी के लिए है. एक और अहम बात यह है कि एलएलबी और नाइट मोड, दोनों का इस्तेमाल अलग-अलग किया जा सकता है. हालांकि, ये दोनों एक साथ भी बेहतर तरीके से काम करते हैं. इस्तेमाल के कुछ उदाहरणों से पता चलता है कि नाइट मोड की फ़ोटो की ज़रूरत न होने पर भी, एलएलबी की सुविधा काम की होती है. एलएलबी, उपयोगकर्ता अनुभव को कैसे बेहतर बनाता है, यहां बताया गया है:

  • बेहतर फ़्रेमिंग और फ़ोटो लेना: कम रोशनी वाले सीन में, सामान्य कैमरा झलक पूरी तरह से अंधेरी दिख सकती है. एलएलबी, व्यूफ़ाइंडर को बेहतर बनाता है. इससे उपयोगकर्ता, शटर बटन दबाने से पहले देख पाते हैं कि वे किस चीज़ की फ़ोटो ले रहे हैं. इस अनुभव के लिए, कम रोशनी में अच्छी क्वालिटी वाली फ़ोटो लेने के लिए, नाइट मोड का इस्तेमाल किया जा सकता है. इसके अलावा, एलएलबी की मदद से, उपयोगकर्ता को “जैसा दिखता है वैसा ही मिलता है” वाली फ़ोटो मिल सकती है.
  • भरोसेमंद स्कैनिंग: क्यूआर कोड हर जगह मौजूद हैं. हालांकि, अंधेरे रेस्टोरेंट या पार्किंग गैराज में इन्हें स्कैन करना अक्सर मुश्किल होता है. कैमरा फ़ीड की रोशनी बढ़ने से, स्कैनिंग एल्गोरिदम, बहुत कम रोशनी वाले माहौल में भी क्यूआर कोड को भरोसेमंद तरीके से पहचान और डिकोड कर सकते हैं.
  • बेहतर इंटरैक्शन: लाइव वीडियो इंटरैक्शन वाले ऐप्लिकेशन (जैसे, एआई असिस्टेंट या वीडियो कॉल) के लिए, एलएलबी, दिखने वाली जानकारी की मात्रा को बढ़ाता है. इससे, कंप्यूटर विज़न मॉडल के पास काम करने के लिए, ज़रूरत के मुताबिक डेटा होता है

Instagram में अंतर

LLB_IG_demo_white_background.gif

Android Instagram ऐप्लिकेशन को बनाने वाली इंजीनियरिंग टीम, अपने उपयोगकर्ताओं को बेहतर कैमरा अनुभव देने के लिए हमेशा काम करती रहती है. ऊपर दिए गए उदाहरण में देखा जा सकता है कि Pixel 10 Pro पर, एलएलबी से कितना अंतर पड़ता है. 

lowlight.png

इससे उपयोगकर्ता अनुभव में कितना अंतर आता है, इसका अंदाज़ा आसानी से लगाया जा सकता है. अगर उपयोगकर्ता यह नहीं देख पाते कि वे किस चीज़ की फ़ोटो ले रहे हैं, तो इस बात की संभावना ज़्यादा होती है कि वे फ़ोटो न लें. 

lowlight1.png

अपने ऐप्लिकेशन के लिए एलएलबी को लागू करने का तरीका चुनना

एलएलबी को लागू करने के दो तरीके हैं. इससे, ज़्यादा से ज़्यादा डिवाइसों पर बेहतर अनुभव दिया जा सकता है:

  1. एलएलबी एई मोड: यह हार्डवेयर-लेयर वाला ऑटो-एक्सपोज़र मोड है. यह सबसे अच्छी क्वालिटी और परफ़ॉर्मेंस देता है, क्योंकि यह सीधे इमेज सिग्नल प्रोसेसर (आईएसपी) पाइपलाइन को फ़ाइन-ट्यून करता है. सबसे पहले, इसकी उपलब्धता की जांच करें.
  2. Google Low Light Boost: अगर डिवाइस, एई मोड के साथ काम नहीं करता है, तो Google Play services की ओर से उपलब्ध कराए गए सॉफ़्टवेयर पर आधारित इस समाधान का इस्तेमाल किया जा सकता है. यह कैमरा स्ट्रीम पर पोस्ट-प्रोसेसिंग लागू करके, उसकी रोशनी बढ़ाता है. यह पूरी तरह से सॉफ़्टवेयर पर आधारित समाधान है. इसलिए, यह ज़्यादा डिवाइसों पर उपलब्ध है. इससे, एलएलबी को ज़्यादा डिवाइसों पर लागू करने में मदद मिलती है.

कम रोशनी बूस्ट एई मोड (हार्डवेयर)

मैकेनिज़्म:
यह मोड, Android 15 और इसके बाद के वर्शन वाले डिवाइसों पर काम करता है. इसके लिए, ओईएम को एचएएल में इस सुविधा को लागू करना होगा. फ़िलहाल, यह Pixel 10 डिवाइसों पर उपलब्ध है. यह सीधे कैमरे के इमेज सिग्नल प्रोसेसर (आईएसपी) के साथ इंटिग्रेट होता है. अगर आपने CaptureRequest.CONTROL_AE_MODE को CameraMetadata.CONTROL_AE_MODE_ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY पर सेट किया है, तो कैमरा सिस्टम कंट्रोल ले लेता है.

व्यवहार:
एचएएल/आईएसपी, सीन का विश्लेषण करता है और सेंसर और प्रोसेसिंग पैरामीटर को अडजस्ट करता है. इसमें, अक्सर इमेज की रोशनी बढ़ाने के लिए, एक्सपोज़र टाइम बढ़ाना शामिल होता है. इससे, सिग्नल-टू-नॉइज़ रेशियो (एसएनआर) को बेहतर बनाने में मदद मिलती है. ऐसा इसलिए, क्योंकि डिजिटल सेंसर गेन (आईएसओ) बढ़ाने के बजाय, एक्सपोज़र टाइम बढ़ाने से सेंसर, ज़्यादा रोशनी की जानकारी कैप्चर कर पाता है.

फ़ायदा:
इससे इमेज की क्वालिटी और पावर एफिशिएंसी बेहतर हो सकती है, क्योंकि यह खास हार्डवेयर पाथवे का इस्तेमाल करता है.

नुकसान:
बहुत कम रोशनी वाले माहौल में, फ़्रेम रेट कम हो सकता है, क्योंकि सेंसर को रोशनी कैप्चर करने में ज़्यादा समय लगता है. बहुत कम रोशनी वाले माहौल में, फ़्रेम रेट 10 एफपीएस तक गिर सकता है.

Google Low Light Boost (Google Play services के ज़रिए सॉफ़्टवेयर)

मैकेनिज़्म:
यह समाधान, Google Play services के ज़रिए एक वैकल्पिक मॉड्यूल के तौर पर डिस्ट्रिब्यूट किया जाता है. यह कैमरा स्ट्रीम पर पोस्ट-प्रोसेसिंग लागू करता है. यह एचडीआरनेट नाम की, रीयल-टाइम में इमेज को बेहतर बनाने वाली एक बेहतर टेक्नोलॉजी का इस्तेमाल करता है.

Google HDRNet:
यह डीप लर्निंग मॉडल, कम रिज़ॉल्यूशन पर इमेज का विश्लेषण करके, पैरामीटर का एक कॉम्पैक्ट सेट (बायलैटरल ग्रिड) का अनुमान लगाता है. इसके बाद, यह ग्रिड, जीपीयू पर फ़ुल-रिज़ॉल्यूशन वाली इमेज को बेहतर बनाने में मदद करता है. मॉडल को कम रोशनी वाले माहौल में, इमेज की क्वालिटी को बेहतर बनाने और रोशनी बढ़ाने के लिए ट्रेन किया जाता है. इसमें, चेहरे की विज़िबिलिटी पर फ़ोकस किया जाता है.

प्रोसेस ऑर्केस्ट्रेशन:
एचडीआरनेट मॉडल और उससे जुड़े लॉजिक को, कम रोशनी में बेहतर फ़ोटो लेने की सुविधा देने वाला प्रोसेसर ऑर्केस्ट्रेट करता है. इसमें ये शामिल हैं:

  1. सीन का विश्लेषण:
    एक कस्टम कैलकुलेटर, जो कैमरा मेटाडेटा (सेंसर की संवेदनशीलता, एक्सपोज़र टाइम वगैरह) और इमेज कॉन्टेंट का इस्तेमाल करके, सीन की असली रोशनी का अनुमान लगाता है. इस विश्लेषण से, बूस्ट लेवल तय होता है.
  2. एचडीआरनेट प्रोसेसिंग:
    फ़्रेम की रोशनी बढ़ाने के लिए, एचडीआरनेट मॉडल लागू करता है. इस्तेमाल किया गया मॉडल, कम रोशनी वाले सीन के लिए ट्यून किया गया है और रीयल-टाइम परफ़ॉर्मेंस के लिए ऑप्टिमाइज़ किया गया है.
  3. ब्लेंडिंग:
    ओरिजनल और एचडीआरनेट प्रोसेस किए गए फ़्रेम को ब्लेंड किया जाता है. ब्लेंडिंग की मात्रा को, सीन की रोशनी के कैलकुलेटर से डाइनैमिक तरीके से कंट्रोल किया जाता है. इससे, बूस्ट किए गए और बूस्ट नहीं किए गए सीन के बीच, नैचुरल दिखने वाला ट्रांज़िशन मिलता है.
low-light-boost-processor-diagram.png

फ़ायदा:
यह ज़्यादा डिवाइसों पर काम करता है. फ़िलहाल, यह Samsung S22 Ultra, S23 Ultra, S24 Ultra, S25 Ultra, और Pixel 6 से Pixel 9 तक के डिवाइसों के साथ काम करता है. इसके लिए, एचएएल की खास सुविधा की ज़रूरत नहीं होती. यह पोस्ट-प्रोसेसिंग इफ़ेक्ट है. इसलिए, यह कैमरे के फ़्रेम रेट को बनाए रखता है.

नुकसान:
यह पोस्ट-प्रोसेसिंग का तरीका है. इसलिए, इसकी क्वालिटी, सेंसर से मिले फ़्रेम में मौजूद जानकारी तक सीमित होती है. यह सेंसर लेवल पर, बहुत कम रोशनी की वजह से खोई हुई जानकारी को वापस नहीं ला सकता.

एलएलबी, हार्डवेयर और सॉफ़्टवेयर, दोनों पाथवे उपलब्ध कराता है. इससे, Android इकोसिस्टम में, कम रोशनी में कैमरे की परफ़ॉर्मेंस को बेहतर बनाने के लिए, एक स्केलेबल समाधान मिलता है. डेवलपर को, जहां उपलब्ध हो वहां एई मोड को प्राथमिकता देनी चाहिए. साथ ही, Google Low Light Boost को एक मज़बूत फ़ॉलबैक के तौर पर इस्तेमाल करना चाहिए.

अपने ऐप्लिकेशन में, कम रोशनी में बेहतर फ़ोटो लेने की सुविधा (एलएलबी) को लागू करना

अब देखते हैं कि एलएलबी की दोनों सुविधाओं को कैसे लागू किया जाए. अपने ऐप्लिकेशन में CameraX या Camera2 का इस्तेमाल करने पर, इन सुविधाओं को लागू किया जा सकता है. बेहतर नतीजों के लिए, हमारा सुझाव है कि पहला और दूसरा, दोनों चरण पूरे करें.

पहला चरण: कम रोशनी बूस्ट एई मोड

एलएलबी एई मोड, Android 15 और इसके बाद के वर्शन वाले चुनिंदा डिवाइसों पर उपलब्ध है. यह एक खास ऑटो-एक्सपोज़र (एई) मोड के तौर पर काम करता है.

1. उपलब्धता की जांच करना

सबसे पहले, यह देखें कि कैमरा डिवाइस, एलएलबी एई मोड के साथ काम करता है या नहीं.

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

2. मोड चालू करना

अगर यह मोड काम करता है, तो CameraX के CameraControl ऑब्जेक्ट का इस्तेमाल करके, एलएलबी एई मोड को चालू किया जा सकता है.

// 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. स्थिति की निगरानी करना

सिर्फ़ मोड का अनुरोध करने का मतलब यह नहीं है कि यह फ़िलहाल "बूस्ट" कर रहा है. सिस्टम, बूस्ट को सिर्फ़ तब चालू करता है, जब सीन में वाकई में कम रोशनी होती है. यूज़र इंटरफ़ेस (यूआई) को अपडेट करने के लिए, ऑब्ज़र्वर सेट अप किया जा सकता है. जैसे, चंद्रमा का आइकॉन दिखाना. इसके अलावा, एक्सटेंशन फ़ंक्शन asFlow() का इस्तेमाल करके, इसे फ़्लो में बदला जा सकता है.

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

एलएलबी एई मोड के बारे में पूरी गाइड यहां पढ़ी जा सकती है.

दूसरा चरण: Google Low Light Boost

जिन डिवाइसों पर हार्डवेयर एई मोड काम नहीं करता है उनके लिए, Google Low Light Boost एक बेहतरीन फ़ॉलबैक के तौर पर काम करता है. यह स्ट्रीम को इंटरसेप्ट करने और उसकी रोशनी बढ़ाने के लिए, LowLightBoostSession का इस्तेमाल करता है.

1. डिपेंडेंसी जोड़ना

यह सुविधा, 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. क्लाइंट शुरू करना

कैमरा शुरू करने से पहले, LowLightBoostClient का इस्तेमाल करके यह पक्का करें कि मॉड्यूल इंस्टॉल हो और डिवाइस के साथ काम करता हो.

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. एलएलबी सेशन बनाना

Google एलएलबी, हर फ़्रेम को प्रोसेस करता है. इसलिए, आपको अपने डिसप्ले Surface को LowLightBoostSession देना होगा. इसके बदले में, आपको एक ऐसा Surface मिलता है जिस पर रोशनी बढ़ाने की सुविधा लागू होती है. Camera2 ऐप्लिकेशन के लिए, नतीजे के तौर पर मिले Surface को CaptureRequest.Builder.addTarget() का इस्तेमाल करके जोड़ा जा सकता है. CameraX के लिए, यह प्रोसेसिंग पाइपलाइन, CameraEffect क्लास के साथ सबसे अच्छी तरह काम करती है. इसमें, SurfaceProcessor की मदद से इफ़ेक्ट लागू किया जा सकता है और SurfaceProvider की मदद से, इसे अपनी झलक में वापस दिया जा सकता है. इसके लिए, यह कोड देखें.

// 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. मेटाडेटा पास करना

एल्गोरिदम को काम करने के लिए, उसे कैमरे की ऑटो-एक्सपोज़र स्थिति का विश्लेषण करना होगा. आपको कैप्चर के नतीजों को एलएलबी सेशन में वापस पास करना होगा. CameraX में, Preview.Builder को 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)
    }
  }
)

क्लाइंट और सेशन के लिए, लागू करने के बारे में ज़्यादा जानकारी, Google Low Light Boost की गाइड में देखी जा सकती है.

अगले चरण

इन दोनों विकल्पों को लागू करने से, यह पक्का होता है कि आपके उपयोगकर्ता, रोशनी की स्थिति चाहे जैसी भी हो, साफ़ तौर पर देख सकें, भरोसेमंद तरीके से स्कैन कर सकें, और असरदार तरीके से इंटरैक्ट कर सकें.

इन सुविधाओं को, प्रोडक्शन के लिए तैयार कोडबेस में देखने के लिए, GitHub पर Jetpack Camera App देखें. इसमें, एलएलबी एई मोड और Google एलएलबी, दोनों को लागू किया गया है. इससे, आपको अपने इंटिग्रेशन के लिए रेफ़रंस मिलता है.

इसे लिखा है:

पढ़ना जारी रखें