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

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

पढ़ने में 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 को एक मज़बूत फ़ॉलबैक के तौर पर इस्तेमाल करना चाहिए.

अपने ऐप्लिकेशन में 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 ऐप्लिकेशन के लिए, CaptureRequest.Builder.addTarget() के साथ, नतीजे के तौर पर मिले Surface को जोड़ा जा सकता है. 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 एलएलबी, दोनों को लागू किया गया है. इससे, आपको अपने इंटिग्रेशन के लिए एक रेफ़रंस मिलता है.

इसे लिखा है:

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