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

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

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

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

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

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

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

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

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

الفرق في Instagram

LLB_IG_demo_white_background.gif

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

lowlight.png

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

lowlight1.png

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

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

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

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

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

السلوك:
يحلّل معالج إشارة الصور (ISP) أو طبقة تجريد الأجهزة (HAL) المشهد ويضبط مَعلمات أداة الاستشعار والمعالجة، بما في ذلك غالبًا زيادة مدة التعرّض للضوء، من أجل زيادة سطوع الصورة. ويمكن أن يؤدي ذلك إلى الحصول على لقطات ذات نسبة إشارة إلى الضوضاء (SNR) محسّنة بشكل كبير لأنّ مدة التعرّض للضوء الممتدة، بدلاً من زيادة كسب أداة الاستشعار الرقمية (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 المتكاملة. على المطوّرين إعطاء الأولوية لوضع التعرض التلقائي (AE) في حال توفّره واستخدام ميزة "تحسين الصورة في الإضاءة المنخفضة" من Google كخيار احتياطي فعّال.

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

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

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

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

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

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

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

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

إذا كان وضع LLB AE متاحًا، يمكنك تفعيله باستخدام عنصر 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

بالنسبة إلى الأجهزة التي لا تتيح وضع التعرض التلقائي (AE) في الأجهزة، تعمل ميزة "تحسين الصورة في الإضاءة المنخفضة" من 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

تعالج Google LLB كل لقطة، لذا عليك منح 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، ما يمنحك مرجعًا لعملية الدمج الخاصة بك. 

من كتابة:
متابعة القراءة