4.17. مفاتيح ضبط المستشعر

إلى جانب pixformat() و framesize()، تكشف فئة CSI عن مجموعة من عناصر التحكم الخاصة بكل مستشعر والتي يلجأ إليها كل تطبيق تقريبًا عاجلًا أم آجلًا -- اتجاه التركيب، والتعريض، والكسب، وموازنة اللون الأبيض، وبعض الأدوات المساعدة على تنقيح الأخطاء. وكل واحد منها يقابل مفهومًا من مفاهيم المستشعر التي تناولناها سابقًا؛ ولا تقدّم الـ API سوى مقبض بلغة Python للكتابة في السجل التي يجريها المشغّل في الخلفية.

تعمل جميع الطرق أدناه على المستشعر الأساسي. وهي جميعها تدفع عمليات كتابة في السجلات عبر ناقل التحكم I2C الخاص بالمستشعر، لذا فإن الكلفة بالميكروثوانٍ ويسري الإعداد الجديد في التعريض التالي -- وهو عادةً الاستدعاء التالي لـ snapshot().

4.17.1. الاتجاه

لا تعرف الكاميرا الاتجاه الذي رُكّبت به. يعمل علمان للقلب يُطبَّقان على مستوى المستشعر على تصحيح اتجاه الصورة قبل أن يغادر أي بكسل الشريحة:

csi0.hmirror(True)
csi0.vflip(True)

تقلب hmirror() الصورة من اليسار إلى اليمين بينما تقلب vflip() من الأعلى إلى الأسفل. ومعًا يغطيان الحالات التي تظهر في الواقع العملي: لوحة مركّبة مقلوبة رأسًا على عقب (كلا العلمين True)، أو لوحة خلف مرآة مفضّضة من الأمام (hmirror فقط)، أو لوحة تنظر إلى مشهد منعكس من الأسفل (vflip فقط).

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

4.17.2. التعريض

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

csi0.auto_exposure(False, exposure_us=8000)

يكون التعريض الثابت هو الخيار الصحيح عندما يكون سطوع المشهد مستقرًا ويحتاج التطبيق إلى ضبابية حركة متوقّعة أو شدّة متّسقة من إطار إلى آخر لأغراض تحديد العتبة. وتُعدّ قراءة التعريض الحالي مرة أخرى -- سواء ضبطته الحلقة أم ضبطه التطبيق -- استدعاءً منفصلًا:

us = csi0.exposure_us()

يؤدي استدعاء auto_exposure() بالقيمة True ودون تمرير قيمة تعريض إلى إعادة التحكم إلى الحلقة.

4.17.3. الكسب

الكسب هو المضخّم المطبَّق على جهد البكسل قبل وصوله إلى الـ ADC، بالديسيبل. وكما هو الحال مع التعريض، يبدأ المشغّل وحلقة الكسب التلقائي قيد التشغيل. وهناك نمطان يتكرران كثيرًا. تحديد سقف أعلى يتيح للحلقة التكيّف مع الإضاءة لكنه يمنعها من تضخيم الضوضاء إلى ما لا نهاية في المشاهد المعتمة:

csi0.auto_gain(True, gain_db_ceiling=16)

يكون تثبيت كسب ثابت هو الخطوة الصحيحة عندما يثبّت التطبيق أيضًا التعريض -- إذ يهمّ استقرار الكسب التطبيقات التي تقارن قيم البكسل من إطار إلى آخر، مثل تتبّع الألوان:

csi0.auto_gain(False, gain_db=0)

يُقرأ الكسب الحالي مرة أخرى عبر gain_db(). وكلما عطّل التطبيق الكسب التلقائي وجب عليه أيضًا تعطيل موازنة اللون الأبيض التلقائية والتعريض التلقائي -- وإلا فإن حلقات التحكم التي ما زالت تعمل ستجرّ الصورة في اتجاهات تُبطل الكسب الثابت.

4.17.4. موازنة اللون الأبيض

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

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

csi0.auto_whitebal(False)

مرّر صفًا (tuple) صريحًا (r, g, b) بالديسيبل من أجل معايرة ألوان قابلة للتكرار -- الكسوب ذاتها عبر اللوحات والجلسات:

csi0.auto_whitebal(False, rgb_gain_db=(0.0, 0.0, 0.0))

تُقرأ الكسوب الحالية مرة أخرى على هيئة صف (tuple) عبر rgb_gain_db().

4.17.5. تحديد معدل الإطارات

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

csi0.framerate(15)

في المستشعرات التي تدعم تحكمًا بالمعدل عتاديًا، يطيل الاستدعاء أيضًا ميزانية التعريض لكل إطار، وهو ما قد يساعد في الإضاءة المنخفضة؛ أما في غيرها فيتخطى المشغّل ببساطة الإطارات الإضافية على مستوى مخزن الإطارات.

4.17.6. نمط الاختبار

إن نمط اختبار شريط الألوان مدمج في معظم المستشعرات ومفيد للفصل بين مشكلة تصوير ومشكلة إخراج. وتشغيله يتجاوز مصفوفة الفوتوديود ويرسل نمطًا ثابتًا عبر مسار بيانات البكسل ذاته:

csi0.colorbar(True)

إذا بدا نمط الاختبار صحيحًا لكن الصورة الحية ليست كذلك، فإن العطل يكون في البصريات أو في الواجهة التناظرية الأمامية للمستشعر؛ أما إذا كان نمط الاختبار نفسه تالفًا، فإن المشكلة تكون في مكان ما على ناقل بيانات البكسل أو في إعداد pixformat() / framesize(). مرّر القيمة False للعودة إلى الصورة الحية.

راجع csi.CSI للاطلاع على الـ API الكاملة، بما في ذلك أوامر ioctl() الخاصة بكل مستشعر التي تكشف عناصر تحكم فريدة لعائلات مستشعرات بعينها.