أخبار المنتجات

تحسين الإضاءة المنخفضة لتعزيز سطوع خلاصات الكاميرا في الوقت الفعلي

مدّة القراءة: 7 دقائق
عرض الملف الشخصي الخاص بـ "دونوفان ماكموراي"
Donovan McMurray مهندسة علاقات المطوّرين

شاركنا مؤخرًا كيف أتاحت Instagram للمستخدمين التقاط صور مذهلة في الإضاءة المنخفضة باستخدام "وضع الليل". تُعدّ هذه الميزة مثالية للصور الثابتة، حيث يتوفّر الوقت لدمج عدة لقطات بمدد تعرّض مختلفة لإنشاء لقطة ثابتة عالية الجودة. ولكن ماذا عن اللحظات التي تحدث بين الصور؟ يجب أن يتفاعل المستخدمون مع الكاميرا أكثر من مجرد الضغط على زر الغالق. يستخدمون المعاينة أيضًا لإنشاء المشهد أو مسح رموز الاستجابة السريعة ضوئيًا.

اليوم، سنتعرّف على ميزة "تحسين الإضاءة المنخفضة" (LLB)، وهي ميزة فعّالة مصمَّمة لتحسين سطوع فيديوهات الكاميرا في الوقت الفعلي. على عكس "وضع الإضاءة المنخفضة" الذي يتطلّب مدة التقاط ثابتة، تعمل ميزة "تحسين الإضاءة المنخفضة" على الفور في المعاينة المباشرة وتسجيلات الفيديو. تعدّل ميزة "الإضاءة المنخفضة" تلقائيًا مقدار التحسين المطلوب استنادًا إلى الإضاءة المتوفرة، لذا فهي محسّنة لكل بيئة.

من خلال تحديث حديث، يتيح تطبيق LLB لمستخدمي Instagram التقاط صور مثالية، ثم يؤدي تنفيذ "وضع الليل" الحالي إلى الحصول على صور عالية الجودة في الإضاءة المنخفضة، وهي الصور نفسها التي يستمتع بها المستخدمون منذ أكثر من عام.

أهمية ميزة "تعديل السطوع في الوقت الفعلي"

في حين يهدف "الوضع الليلي" إلى تحسين جودة الصورة النهائية، يهدف "تحسين الإضاءة المنخفضة" إلى تحسين سهولة الاستخدام والتفاعل في البيئات المظلمة. من العوامل المهمة الأخرى التي يجب أخذها في الاعتبار أنّه على الرغم من أنّ ميزة "التعريض الضوئي الطويل المنخفض الإضاءة" و"الوضع الليلي" تعملان معًا بشكل جيد جدًا، يمكنك استخدام كلّ منهما بشكل مستقل، وستلاحظ في بعض حالات الاستخدام أنّ ميزة "التعريض الضوئي الطويل المنخفض الإضاءة" مفيدة بمفردها عندما لا تكون هناك حاجة إلى صور "الوضع الليلي". في ما يلي كيفية مساهمة LLB في تحسين تجربة المستخدم:

  • ضبط إطار الصورة والتقاطها بشكل أفضل: في المشاهد ذات الإضاءة الخافتة، يمكن أن تكون معاينة الكاميرا العادية سوداء تمامًا. تعمل ميزة "الإضاءة المنخفضة" على زيادة سطوع عدسة الكاميرا، ما يتيح للمستخدمين رؤية ما يودّون تصويره قبل النقر على زر الغالق. للحصول على هذه التجربة، يمكنك استخدام "الوضع الليلي" للحصول على أفضل جودة للصور في ظروف الإضاءة المنخفضة، أو يمكنك السماح لميزة "تحسين الإضاءة المنخفضة" بتقديم نتيجة صورة "ما تراه هو ما تحصل عليه".
  • المسح الضوئي الموثوق: رموز الاستجابة السريعة متوفرة في كل مكان، ولكن غالبًا ما يكون مسحها ضوئيًا في مطعم مظلم أو مرآب للسيارات أمرًا محبطًا. بفضل إضاءة الكاميرا الأقوى بكثير، يمكن لخوارزميات المسح الضوئي رصد رموز الاستجابة السريعة وفك تشفيرها بشكل موثوق حتى في البيئات المظلمة جدًا.
  • التفاعلات المحسّنة: بالنسبة إلى التطبيقات التي تتضمّن تفاعلات فيديو مباشرة (مثل مساعدي الذكاء الاصطناعي أو مكالمات الفيديو)، تزيد ميزة "الحدّ الأدنى من السطوع" من كمية المعلومات التي يمكن إدراكها، ما يضمن توفّر بيانات كافية لنماذج رؤية الكمبيوتر.

الفرق في Instagram

LLB_IG_demo_white_background.gif

يعمل فريق الهندسة المسؤول عن تطبيق Instagram على Android دائمًا بجدّ لتوفير تجربة كاميرا حديثة للمستخدمين. يمكنك ملاحظة الفرق الذي تحدثه ميزة "الضوء المنخفض جدًا" في المثال أعلاه على هاتف Pixel 10 Pro. 

lowlight.png

من السهل تخيّل الفرق الذي يحدثه ذلك في تجربة المستخدم. إذا لم يتمكّن المستخدمون من رؤية ما يسجّلونه، يزداد احتمال إلغاء التسجيل. 

lowlight1.png

اختيار طريقة التنفيذ

هناك طريقتان لتنفيذ ميزة "تحسين الإضاءة المنخفضة" من أجل تقديم أفضل تجربة على أكبر مجموعة من الأجهزة:

  1. وضع التعرّض التلقائي للضوء مع تحسين الإضاءة المنخفضة: هذا الوضع متاح على مستوى الأجهزة. ويوفّر أعلى جودة وأداء لأنه يضبط مسار معالجة إشارات الصور (ISP) مباشرةً. يجب التحقّق من ذلك أولاً.
  2. ميزة "تحسين الإضاءة المنخفضة" من Google: إذا كان الجهاز لا يتوافق مع وضع "التعرّض التلقائي"، يمكنك استخدام هذا الحل المستند إلى البرامج الذي توفّره "خدمات Google Play". تطبِّق هذه الميزة معالجة لاحقة على بث الكاميرا لتفتيح الصورة. بما أنّ هذا الحل يعتمد على البرامج فقط، فهو متاح على المزيد من الأجهزة، وبالتالي يساعدك هذا التنفيذ في الوصول إلى المزيد من الأجهزة باستخدام تقنية LLB.

وضع "تحسين الإضاءة المنخفضة" للتعرّض التلقائي (جهاز)

آلية العمل:
يتوافق هذا الوضع مع الأجهزة التي تعمل بالإصدار 15 من نظام التشغيل Android والإصدارات الأحدث، ويتطلّب أن يكون مصنّع المعدات الأصلية قد أتاح إمكانية استخدامه في طبقة تجريد الأجهزة (HAL) (يتوفّر حاليًا على أجهزة Pixel 10). ويتكامل مباشرةً مع معالج إشارات الصور (ISP) في الكاميرا. إذا ضبطت CaptureRequest.CONTROL_AE_MODE على CameraMetadata.CONTROL_AE_MODE_ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY، سيتولّى نظام الكاميرا التحكّم.

السلوك:
تحلّل طبقة تجريد الأجهزة (HAL) أو معالج إشارات الصور (ISP) المشهد وتعدّل مَعلمات المستشعر والمعالجة، بما في ذلك غالبًا زيادة وقت التعريض الضوئي، لتفتيح الصورة. يمكن أن يؤدي ذلك إلى الحصول على لقطات بنسبة إشارة إلى ضوضاء محسّنة بشكل كبير، لأنّ مدة التعرّض للضوء الأطول، بدلاً من زيادة كسب أداة الاستشعار الرقمية (ISO)، تتيح لأداة الاستشعار التقاط المزيد من معلومات الضوء.

الميزة:
جودة صورة أفضل وكفاءة أعلى في استهلاك الطاقة، لأنّها تستفيد من مسارات الأجهزة المخصّصة.

الموازنة:
قد يؤدي ذلك إلى انخفاض عدد اللقطات في الثانية في ظروف الإضاءة المنخفضة جدًا لأنّ المستشعر يحتاج إلى مزيد من الوقت لالتقاط الضوء. يمكن أن ينخفض عدد اللقطات في الثانية إلى 10 لقطات في الثانية في ظروف الإضاءة المنخفضة جدًا.

ميزة "تحسين الإضاءة المنخفضة" من Google (برنامج من خلال "خدمات Google Play")

آلية العمل:
يتم توزيع هذا الحلّ على شكل وحدة اختيارية من خلال "خدمات Google Play"، ويتم تطبيقه على معالجة ما بعد التسجيل لبيانات بث الكاميرا. تستخدم هذه الميزة تقنية متطورة لتحسين الصور في الوقت الفعلي تُعرف باسم HDRNet.

‫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) بدون الحاجة إلى توفُّر دعم معيّن لطبقة تجريد الأجهزة (HAL). يحافظ على عدد اللقطات في الثانية للكاميرا لأنّه تأثير ما بعد المعالجة.

الموازنة:
بما أنّها طريقة معالجة لاحقة، فإنّ الجودة تكون محدودة بالمعلومات المتوفّرة في اللقطات التي تقدّمها أداة الاستشعار. ولا يمكنه استرداد التفاصيل المفقودة بسبب الظلام الشديد على مستوى المستشعر.

من خلال توفير مسارات للأجهزة والبرامج، يقدّم "تحسين الإضاءة المنخفضة" حلاً قابلاً للتوسيع لتحسين أداء الكاميرا في الإضاءة المنخفضة على مستوى منظومة Android المتكاملة. على المطوّرين إعطاء الأولوية لوضع "التعرّض التلقائي" حيثما كان متاحًا واستخدام ميزة "تحسين الإضاءة المنخفضة من Google" كخيار احتياطي قوي.

تنفيذ ميزة "تحسين الإضاءة المنخفضة" في تطبيقك

لنلقِ نظرة الآن على كيفية تنفيذ كلتا ميزتَي LLB. يمكنك تنفيذ ما يلي سواء كنت تستخدم CameraX أو Camera2 في تطبيقك. وللحصول على أفضل النتائج، ننصحك بتنفيذ الخطوتَين 1 و2.

الخطوة 1: وضع "التعرّض التلقائي" في "تحسين الإضاءة المنخفضة"

تتوفّر الميزة على أجهزة محدّدة تعمل بنظام التشغيل Android 15 والإصدارات الأحدث، وتعمل ميزة LLB AE Mode كوضع محدّد للتعرّض التلقائي للضوء (AE).

1. التحقّق من التوفّر

في البداية، تحقَّق مما إذا كان جهاز الكاميرا يتيح استخدام "وضع الضبط التلقائي لدرجة الإضاءة المنخفضة جدًا".

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

2. تفعيل الوضع

إذا كان ذلك متاحًا، يمكنك تفعيل "وضع الضبط التلقائي للتعرّض المنخفض للضوء" باستخدام عنصر CameraControl في CameraX.

// 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 لتعديل واجهة المستخدم (مثل عرض رمز القمر) أو التحويل إلى Flow باستخدام دالة الإضافة asFlow().

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

يمكنك قراءة الدليل الكامل حول وضع "التعرّض التلقائي" في ميزة "تحسين الأداء في الإضاءة المنخفضة" هنا.

الخطوة 2: ميزة "تحسين الإضاءة المنخفضة" من Google

بالنسبة إلى الأجهزة التي لا تتوافق مع وضع "التعرّض التلقائي" للأجهزة، تعمل ميزة "تحسين الإضاءة المنخفضة" من Google كحلّ احتياطي فعّال. يستخدم هذا الوضع LowLightBoostSession لاعتراض البث وزيادة سطوعه.

1. إضافة التبعيات

يتم توفير هذه الميزة من خلال "خدمات Google Play".

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

تعالج مكتبة LLB من 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. إدخال البيانات الوصفية

لكي تعمل الخوارزمية، يجب أن تحلّل حالة التعريض التلقائي للكاميرا. يجب إعادة نتائج الالتقاط إلى جلسة LLB. في 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.

الخطوات التالية

من خلال تنفيذ هذين الخيارَين، يمكنك ضمان أن يتمكّن المستخدمون من الرؤية بوضوح والمسح الضوئي بشكل موثوق والتفاعل بفعالية، بغض النظر عن ظروف الإضاءة.

للاطّلاع على هذه الميزات أثناء التنفيذ ضمن قاعدة رموز برمجية كاملة وجاهزة للإصدار العلني، يمكنك الاطّلاع على تطبيق Jetpack Camera على GitHub. تتضمّن هذه العيّنة كلاً من وضع LLB AE وGoogle LLB، ما يمنحك مرجعًا لعملية الدمج الخاصة بك. 

من تأليف:
متابعة القراءة