تيارات الإخراج، والاقتصاص، والتكبير

تيارات الإخراج

يعمل نظام الكاميرا الفرعي فقط على المسار المستند إلى ANativeWindow لجميع مستويات الدقة وتنسيقات الإخراج. يمكن تكوين تدفقات متعددة في وقت واحد لإرسال إطار واحد إلى العديد من الأهداف مثل وحدة معالجة الرسومات، أو برنامج تشفير الفيديو، أو RenderScript ، أو المخازن المؤقتة المرئية في التطبيق (RAW Bayer، أو المخازن المؤقتة YUV المعالجة، أو المخازن المؤقتة المشفرة بـ JPEG).

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

لمزيد من المعلومات حول مجموعات إخراج التدفق المضمونة التي تعتمد على مستوى الأجهزة المدعومة، راجع createCaptureSession() .

الاقتصاص

يتم إرسال اقتصاص مجموعة البكسل الكاملة (للتقريب الرقمي وحالات الاستخدام الأخرى حيث يكون مجال الرؤية الأصغر مرغوبًا فيه) من خلال إعداد ANDROID_SCALER_CROP_REGION. يعد هذا إعدادًا لكل طلب، ويمكن تغييره على أساس كل طلب، وهو أمر بالغ الأهمية لتنفيذ التكبير الرقمي السلس.

يتم تعريف المنطقة على أنها مستطيل (x، y، العرض، الارتفاع)، مع (x، y) تصف الزاوية العلوية اليسرى من المستطيل. يتم تعريف المستطيل على نظام الإحداثيات الخاص بمصفوفة البكسل النشطة للمستشعر، حيث يكون (0,0) هو البكسل العلوي الأيسر لمصفوفة البكسل النشطة. لذلك، لا يمكن أن يكون العرض والارتفاع أكبر من الأبعاد المذكورة في حقل المعلومات الثابتة ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY. يتم الإبلاغ عن الحد الأدنى المسموح به من العرض والارتفاع بواسطة HAL من خلال حقل المعلومات الثابتة ANDROID_SCALER_MAX_DIGITAL_ZOOM، الذي يصف الحد الأقصى لعامل التكبير/التصغير المدعوم. وبالتالي، فإن الحد الأدنى لعرض وارتفاع منطقة المحاصيل هما:

  {width, height} =
   { floor(ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY[0] /
       ANDROID_SCALER_MAX_DIGITAL_ZOOM),
     floor(ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY[1] /
       ANDROID_SCALER_MAX_DIGITAL_ZOOM) }

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

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

في جميع الحالات، يجب أن يتم توسيط محصول التدفق داخل منطقة الاقتصاص الكاملة، ويتم اقتصاص كل تيار فقط إما أفقيًا أو رأسيًا بالنسبة إلى منطقة الاقتصاص الكاملة، وليس كليهما معًا.

على سبيل المثال، إذا تم تعريف دفقين، دفق 640x480 (4:3)، ودفق 1280x720 (16:9)، يوضح أدناه مناطق الإخراج المتوقعة لكل تيار لعدد قليل من مناطق المحاصيل العينة، على 3 افتراضية مستشعر MP (مصفوفة 2000 × 1500 بكسل).

منطقة الاقتصاص: (500، 375، 1000، 750) (نسبة العرض إلى الارتفاع 4:3)
اقتصاص تيار 640 × 480: (500، 375، 1000، 750) (يساوي منطقة الاقتصاص)
1280 × 720 اقتصاص تيار: (500، 469، 1000، 562)

منطقة المحاصيل-43-نسبة

الشكل 1. نسبة العرض إلى الارتفاع 4:3

منطقة الاقتصاص: (500، 375، 1333، 750) (نسبة العرض إلى الارتفاع 16:9)
اقتصاص تيار 640 × 480: (666، 375، 1000، 750)
1280 × 720 اقتصاص تيار: (500، 375، 1333، 750) (يساوي منطقة الاقتصاص)

منطقة المحاصيل-169-نسبة

الشكل 2. نسبة العرض إلى الارتفاع 16:9

منطقة الاقتصاص: (500، 375، 750، 750) (نسبة العرض إلى الارتفاع 1:1)
اقتصاص تيار 640 × 480: (500، 469، 750، 562)
1280 × 720 اقتصاص تيار: (500، 543، 750، 414)

منطقة المحاصيل-11-نسبة

الشكل 3. نسبة العرض إلى الارتفاع 1:1

والمثال الأخير، دفق بنسبة عرض إلى ارتفاع مربعة 1024 × 1024 بدلاً من دفق 480 بكسل:
منطقة الاقتصاص: (500، 375، 1000، 750) (نسبة العرض إلى الارتفاع 4:3)
1024 × 1024 اقتصاص تيار: (625، 375، 750، 750)
1280 × 720 اقتصاص تيار: (500، 469، 1000، 562)

منطقة المحاصيل-43-نسبة مربع

الشكل 4. نسبة العرض إلى الارتفاع 4:3، مربعة

إعادة المعالجة

يتم توفير دعم إضافي لملفات الصور الأولية من خلال إعادة معالجة دعم بيانات RAW Bayer. يسمح هذا الدعم لخط أنابيب الكاميرا بمعالجة مخزن RAW المؤقت والبيانات الوصفية التي تم التقاطها مسبقًا (إطار كامل تم تسجيله سابقًا)، لإنتاج مخرجات YUV أو JPEG جديدة.

تكبير

بالنسبة للأجهزة التي تعمل بنظام التشغيل Android 11 أو الإصدارات الأحدث، يمكن للتطبيق استخدام تكبير الكاميرا (الرقمي والبصري) من خلال إعداد ANDROID_CONTROL_ZOOM_RATIO .

يتم تعريف نسبة التكبير كعامل النقطة العائمة. بدلاً من استخدام ANDROID_SCALER_CROP_REGION للاقتصاص والتكبير/التصغير، يمكن للتطبيق استخدام ANDROID_CONTROL_ZOOM_RATIO للتحكم في مستوى التكبير/التصغير، واستخدام ANDROID_SCALER_CROP_REGION للاقتصاص الأفقي والرأسي لتحقيق نسب عرض إلى ارتفاع مختلفة عن مستشعر الكاميرا الأصلي.

قد يحتوي نظام الكاميرات المتعددة على أكثر من عدسة بأطوال بؤرية مختلفة، ويمكن للمستخدم استخدام التقريب البصري عن طريق التبديل بين العدسات. استخدام ANDROID_CONTROL_ZOOM_RATIO له فوائد في السيناريوهات أدناه:

  • التكبير من عدسة واسعة إلى عدسة مقربة: توفر نسبة النقطة العائمة دقة أفضل مقارنة بالقيم الصحيحة لـ ANDROID_SCALER_CROP_REGION .
  • التصغير من عدسة واسعة إلى عدسة فائقة الاتساع: يدعم ANDROID_CONTROL_ZOOM_RATIO التصغير (<1.0f) بينما لا يدعمه ANDROID_SCALER_CROP_REGION .

للتوضيح، إليك عدة سيناريوهات لنسب التكبير/التصغير المختلفة، ومناطق الاقتصاص، وتدفقات الإخراج، باستخدام نفس الكاميرا الافتراضية المحددة في القسم السابق.

نسبة التكبير/التصغير: 2.0؛ 1/4 من مجال الرؤية الأصلي
منطقة الاقتصاص: (0، 0، 2000، 1500) (نسبة العرض إلى الارتفاع 4:3)
اقتصاص تيار 640 × 480: (0، 0، 2000، 1500) (يساوي منطقة الاقتصاص)
1280 × 720 اقتصاص تيار: (0، 187، 2000، 1125)

نسبة التكبير/التصغير-2-الاقتصاص-43

الشكل 5. تكبير 2.0، نسبة العرض إلى الارتفاع 4:3

نسبة التكبير/التصغير: 2.0؛ 1/4 من مجال الرؤية الأصلي
منطقة الاقتصاص: (0، 187، 2000، 1125) (نسبة العرض إلى الارتفاع 16:9)
640 × 480 اقتصاص تيار: (250، 187، 1500، 1125) (عمود)
1280 × 720 اقتصاص تيار: (0، 187، 2000، 1125) (يساوي منطقة الاقتصاص)

نسبة التكبير/التصغير-2-الاقتصاص-169

الشكل 6. تكبير/تصغير 2.0، نسبة عرض إلى ارتفاع 16:9

نسبة التكبير/التصغير: 0.5؛ 4x من مجال الرؤية الأصلي (تم التبديل من العدسة الواسعة إلى العدسة فائقة الاتساع)
منطقة الاقتصاص: (250، 0، 1500، 1500) (نسبة العرض إلى الارتفاع 1:1)
اقتصاص تيار 640 × 480: (250، 187، 1500، 1125) (بتنسيق letterbox)
1280 × 720 اقتصاص تيار: (250، 328، 1500، 844) (بتنسيق letterbox)

الصور/نسبة التكبير/التصغير-0.5-اقتصاص-11

الشكل 7. تكبير 0.5، نسبة عرض إلى ارتفاع 1:1

كما يتضح من الرسوم البيانية أعلاه، يتغير النظام الإحداثي لمنطقة الاقتصاص إلى مجال الرؤية الفعال بعد التكبير/التصغير، ويتم تمثيله بالمستطيل بالأبعاد التالية: ( 0 ، 0 ، activeArrayWith ، activeArrayHeight ). الأمر نفسه ينطبق على مناطق ووجوه AE/AWB/AF. لا ينطبق هذا التغيير في نظام الإحداثيات على التقاط RAW وبيانات التعريف المرتبطة به مثل intrinsicCalibration و lensShadingMap .

باستخدام نفس المثال الافتراضي أعلاه، وبافتراض أن تدفق الإخراج رقم 1 (640 × 480) هو تدفق معين المنظر، يمكن تحقيق تكبير 2.0x بإحدى طريقتين:

  • zoomRatio = 2.0 ، scaler.cropRegion = (0, 0, 2000, 1500)
  • zoomRatio = 1.0 (افتراضي)، scaler.cropRegion = (500, 375, 1000, 750)

لكي يقوم أحد التطبيقات بتعيين android.control.aeRegions ليكون الربع العلوي الأيسر من مجال رؤية معين المنظر، قم بتعيين android.control.aeRegions على (0, 0, 1000, 750) مع ضبط android.control.zoomRatio على 2.0 . وبدلاً من ذلك، يمكن للتطبيق ضبط android.control.aeRegions على المنطقة المكافئة (500, 375, 1000, 750) لـ android.control.zoomRatio بقيمة 1.0 .