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

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

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

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

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

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

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

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

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

Instagram में अंतर

LLB_IG_demo_white_background.gif

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

lowlight.png

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

lowlight1.png

लागू करने का तरीका चुनना

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

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

कम रोशनी में बेहतर फ़ोटो खींचने की सुविधा वाला एई मोड (हार्डवेयर)

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

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

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

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

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

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

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

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

  1. सीन का विश्लेषण:
    यह एक कस्टम कैलकुलेटर है. यह कैमरा मेटाडेटा (सेंसर की संवेदनशीलता, एक्सपोज़र टाइम वगैरह) और इमेज के कॉन्टेंट का इस्तेमाल करके, सीन की असल चमक का अनुमान लगाता है. इस विश्लेषण से बूस्ट लेवल का पता चलता है.
  2. HDRNet प्रोसेसिंग:
    यह फ़्रेम की चमक बढ़ाने के लिए, HDRNet मॉडल का इस्तेमाल करता है. इस्तेमाल किया गया मॉडल, कम रोशनी वाले सीन के लिए ट्यून किया गया है. साथ ही, इसे रीयलटाइम परफ़ॉर्मेंस के लिए ऑप्टिमाइज़ किया गया है.
  3. ब्लेंडिंग:
    ओरिजनल और HDRNet से प्रोसेस किए गए फ़्रेम को ब्लेंड किया जाता है. ब्लेंडिंग की सुविधा को कितना इस्तेमाल करना है, यह सीन की चमक का हिसाब लगाने वाले टूल से तय होता है. इससे, बूस्ट की गई और बूस्ट नहीं की गई स्थितियों के बीच आसानी से ट्रांज़िशन किया जा सकता है.
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 ऑब्जेक्ट का इस्तेमाल करके, LLB AE मोड चालू किया जा सकता है.

// 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. स्टेट को मॉनिटर करना

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

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. LLB सेशन बनाना

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

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

इस एल्गोरिदम को काम करने के लिए, कैमरे की ऑटो-एक्सपोज़र की स्थिति का विश्लेषण करना होता है. आपको कैप्चर किए गए नतीजों को LLB सेशन में वापस भेजना होगा. CameraX में, Camera2Interop.Extender.setSessionCaptureCallback() का इस्तेमाल करके, Preview.Builder को बढ़ाया जा सकता है.

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 एलएलबी, दोनों को लागू किया गया है. इससे आपको अपने इंटिग्रेशन के लिए रेफ़रंस मिलता है. 

इसे लिखा है:

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