sensor_manual_gain_control.py
# هذا العمل مرخص بموجب ترخيص MIT.
# حقوق النشر (c) 2013-2023 OpenMV LLC. جميع الحقوق محفوظة.
# https://github.com/openmv/openmv/blob/master/LICENSE
#
# التحكم اليدوي في كسب الحساس
#
# يوضح هذا المثال كيفية التحكم في
# الكسب يدويًا بدلاً من ترك التحكم التلقائي في الكسب يعمل.
# ما الفرق بين التحكم في الكسب والتحكم في زمن التعريض الضوئي؟
#
# حسنًا، بزيادة زمن التعريض الضوئي للصورة فإنك تحصل على المزيد من
# الضوء على الكاميرا. هذا يمنحك أفضل نسبة إشارة إلى ضوضاء. أنت
# بشكل عام تريد دائمًا زيادة زمن التعريض الضوئي... إلا أنك عندما
# تزيد زمن التعريض الضوئي فإنك تقلل أقصى معدل إطارات ممكن
# وإذا تحرك أي شيء في الصورة فسيبدأ بالتشوش أكثر مع
# زمن تعريض ضوئي أعلى. يتيح لك التحكم في الكسب زيادة الخرج لكل
# بكسل باستخدام مضاعفات تناظرية ورقمية... مع ذلك، فإنه يضخم أيضًا
# الضوضاء. لذا، من الأفضل ترك زمن التعريض الضوئي يزداد قدر الإمكان
# ثم استخدام التحكم في الكسب لتعويض أي فرق متبقٍ.
import csi
import time
# غيّر هذه القيمة لضبط الكسب. جرّب 10.0/0/0.1/إلخ.
GAIN_SCALE = 1.0
csi0 = csi.CSI()
csi0.reset() # إعادة ضبط المستشعر وتهيئته.
csi0.pixformat(csi.RGB565) # تعيين تنسيق البكسل إلى RGB565 (أو GRAYSCALE)
csi0.framesize(csi.QVGA) # تعيين حجم الإطار إلى QVGA (320x240)
# طباعة قيمة الكسب الأولية للمقارنة.
print("Initial gain == %f db" % csi0.gain_db())
csi0.snapshot(time=2000) # انتظر حتى تدخل الإعدادات حيز التنفيذ.
clock = time.clock() # أنشئ كائن ساعة (clock) لتتبع معدل الإطارات (FPS).
# يجب عليك إيقاف التحكم التلقائي في التعريض الضوئي وتوازن اللون الأبيض التلقائي
# وإلا فسيقومان بتغيير التعريض الضوئي للصورة لإلغاء أي إعدادات كسب
# قمت بتطبيقها...
csi0.auto_exposure(False)
csi0.auto_whitebal(False)
# يجب الانتظار حتى تصبح الإعدادات أعلاه فعالة...
csi0.snapshot(time=500)
current_gain_in_decibels = csi0.gain_db()
print("Current Gain == %f db" % current_gain_in_decibels)
# التحكم التلقائي في الكسب (AGC) مفعّل افتراضيًا. استدعاء الدالة أدناه
# يعطّل التحكم التلقائي في كسب الحساس. المعامل الإضافي "gain_db"
# يقوم بتجاوز قيمة الكسب التلقائي بعد تعطيل AGC.
csi0.auto_gain(False, gain_db=current_gain_in_decibels * GAIN_SCALE)
print("New gain == %f db" % csi0.gain_db())
# csi0.gain_db() تُرجع قيمة كسب حساس الكاميرا الدقيقة بالديسيبل.
# مع ذلك، قد يكون هذا رقمًا مختلفًا عما تم طلبه لأن
# كود الحساس يحوّل الكسب إلى قيمتي كسب صغيرة وكبيرة
# لا يمكنهما قبول كل القيم الممكنة...
# إذا أردت إعادة تفعيل الكسب التلقائي فقم بـ: csi0.auto_gain(True)
# لاحظ أن حساس الكاميرا سيقوم عندها بتغيير الكسب كما يشاء.
# تنفيذ: csi0.auto_gain(False)
# يقوم فقط بتعطيل تحديث قيمة الكسب لكن لا يغيّر قيمة الكسب
# الضوئي التي حددها حساس الكاميرا كقيمة جيدة.
while True:
clock.tick() # تحديث ساعة معدل الإطارات (FPS).
img = csi0.snapshot() # التقاط صورة وإرجاعها.
print(clock.fps()) # ملاحظة: تعمل كاميرا OpenMV بحوالي نصف السرعة عند الاتصال
# بالـ IDE. يجب أن يزداد معدل الإطارات (FPS) بعد قطع الاتصال.