4.17. כפתורי בקרת החיישן¶
מעבר ל-pixformat() ול-framesize(), המחלקה CSI חושפת קומץ בקרות פר-חיישן שכמעט כל יישום נזקק להן במוקדם או במאוחר – כיוון ההתקנה, חשיפה, הגבר (gain), איזון לבן וכמה כלי עזר לניפוי שגיאות. כל אחת מהן ממופה ישירות למושג חיישן שכוסה קודם לכן; ה-API פשוט מספק ידית Python לכתיבה לאוגר (register) שמבצע המנהל התקן מתחת לפני השטח.
כל השיטות שלהלן פועלות על החיישן הבסיסי. כולן דוחפות כתיבות לאוגרים על פני אפיק הבקרה I2C של החיישן, כך שהעלות היא מיקרו-שניות וההגדרה החדשה נכנסת לתוקף בחשיפה הבאה – בדרך כלל ה-snapshot() הבא.
4.17.1. כיוון (Orientation)¶
המצלמה אינה יודעת באיזה כיוון מעלה היא הותקנה. שני דגלי היפוך המיושמים בחיישן מסובבים את התמונה לכיוון הנכון לפני שפיקסל כלשהו עוזב את השבב:
csi0.hmirror(True)
csi0.vflip(True)
hmirror() הופך משמאל לימין ו-vflip() הופך מלמעלה למטה. יחד הם מכסים את המקרים שעולים בפועל: לוח המותקן הפוך (שני הדגלים True), לוח שמאחורי מראה מצופה-קדמית (hmirror בלבד), או כזה הצופה בסצנה משוקפת מלמטה (vflip בלבד).
מכיוון שההיפוך מתרחש בלוגיקת הקריאה של החיישן, אין עלות מעבד ואין תקורת זיכרון – הפריים נוחת בחוצץ הפריימים (frame buffer) כשהוא כבר מכוון נכון.
4.17.2. חשיפה¶
חשיפה היא זמן האינטגרציה – כמה זמן הפוטודיודה שבכל פיקסל אוספת מטען לפני שהשורה נקראת, במיקרו-שניות. המנהל התקן מתחיל כשלולאת החשיפה האוטומטית של החיישן פועלת, כך שהמצלמה מנסה לשמור על ערך הפיקסל הממוצע קרוב ליעד. השבתת הלולאה מקבעת את החשיפה לערך שהיישום בוחר:
csi0.auto_exposure(False, exposure_us=8000)
חשיפה קבועה היא הבחירה הנכונה כאשר בהירות הסצנה יציבה והיישום זקוק לטשטוש תנועה צפוי או לעוצמה עקבית מפריים לפריים לצורך השוואה לסף. קריאת החשיפה הנוכחית חזרה – בין אם הלולאה קבעה אותה ובין אם היישום – היא קריאה נפרדת:
us = csi0.exposure_us()
קריאה ל-auto_exposure() עם True וללא ערך חשיפה מחזירה את השליטה ללולאה.
4.17.3. הגבר (gain)¶
הגבר (gain) הוא המגבר המיושם על מתח הפיקסל לפני שהוא מגיע ל-ADC, בדציבלים. כמו חשיפה, המנהל התקן מתחיל כשלולאת ההגבר האוטומטי פעילה. שני דפוסים עולים לעיתים קרובות. הגבלת התקרה מאפשרת ללולאה להסתגל לתאורה אך מונעת ממנה להגביר רעש ללא הגבלה בסצנות חשוכות:
csi0.auto_gain(True, gain_db_ceiling=16)
קיבוע הגבר קבוע הוא המהלך הנכון כאשר היישום גם מקבע את החשיפה – יציבות ההגבר חשובה ליישומים המשווים ערכי פיקסל מפריים לפריים, כמו מעקב צבע:
csi0.auto_gain(False, gain_db=0)
ההגבר הנוכחי נקרא חזרה דרך gain_db(). בכל פעם שהיישום משבית הגבר אוטומטי עליו להשבית גם איזון-לבן אוטומטי וחשיפה אוטומטית – אחרת לולאות הבקרה שעדיין פעילות ימשכו את התמונה בדרכים שמסכלות את ההגבר הקבוע.
4.17.4. איזון לבן¶
איזון לבן הוא ההגבר פר-ערוץ שה-ISP מיישם על ערוצי האדום, הירוק והכחול היוצאים משלב ה-debayer כך שעצם לבן ייראה לבן תחת כל צבע של אור. לולאת איזון-הלבן האוטומטי מחשבת את שלושת ההגברים הללו מתוך הסטטיסטיקה פר-אזור שה-ISP אוסף בכל פריים ומיישמת אותם בפריים הבא.
רוב היישומים משאירים את הלולאה פועלת. מעקב צבע הוא היוצא מן הכלל הנפוץ – ההגברים הם גם מה שהלולאה תמשוך כדי לרדוף אחר עצם צבעוני, כך שאם היישום מנסה למצוא רכיב/כתם (blob) אדום, הלולאה תעמעם בשקט את הערוץ האדום והרכיב יפסיק להתאים. נעילת הלולאה מתקנת זאת:
csi0.auto_whitebal(False)
העבר מפורשות צמד (r, g, b) בדציבלים לכיול צבע שניתן לשחזור – אותם הגברים על פני לוחות ומפגשים:
csi0.auto_whitebal(False, rgb_gain_db=(0.0, 0.0, 0.0))
ההגברים הנוכחיים נקראים חזרה כצמד דרך rgb_gain_db().
4.17.5. הגבלת קצב פריימים¶
חיישנים פועלים בקצב הפריימים הטבעי שלהם כברירת מחדל – 30 עד 60 פריימים לשנייה ברוב הרכיבים, גבוה בהרבה בחיישנים המהירים כאשר ה-framesize קטן מספיק. הגבלת הקצב מאפשרת ליישום לחנוק את המצלמה לכל מה שהעיבוד במורד הזרם מסוגל לעמוד בו:
csi0.framerate(15)
בחיישנים התומכים בבקרת קצב חומרתית הקריאה גם מאריכה את תקציב החשיפה פר-פריים, מה שיכול לעזור בתאורה חלשה; באחרים המנהל התקן פשוט מדלג על הפריימים הנוספים ברמת חוצץ הפריימים (frame buffer).
4.17.6. תבנית בדיקה¶
תבנית הבדיקה של פסי-צבע מובנית ברוב החיישנים ושימושית להפרדת בעיית הדמיה מבעיית פלט. הפעלתה עוקפת את מערך הפוטודיודות ושולחת תבנית קבועה במורד אותו נתיב נתוני פיקסל:
csi0.colorbar(True)
אם תבנית הבדיקה נראית תקינה אך התמונה החיה אינה, התקלה היא באופטיקה או בקדמת-האנלוג של החיישן; אם אפילו תבנית הבדיקה משובשת, הבעיה היא היכן שהוא באפיק נתוני הפיקסל או בהגדרת pixformat() / framesize(). העבר False כדי לחזור לתמונה החיה.
ראה csi.CSI עבור ה-API המלא, כולל פקודות ה-ioctl() הספציפיות-לחיישן החושפות בקרות ייחודיות למשפחות חיישנים מסוימות.