4.18. מספר חיישנים¶
כמה מצלמות OpenMV Cam משלבות שני חיישני תמונה על אותו לוח – לרוב מצלמת צבע לצד חיישן תרמי FLIR® Lepton®, אך אותה צורה חלה על לוחות הצבע-בתוספת-אירועים ועל כל חומרה דו-חיישנית עתידית. לכל חיישן מערך פיקסלים משלו, אפיק בקרה משלו, והוא מריץ צינור משלו בקצב פריימים משלו. ה-API של CSI מתרחב כדי לכסות אותם בכך שהוא מאפשר לאפליקציה ליצור מופע CSI אחד לכל חיישן פיזי.
4.18.1. בחירת איזה חיישן¶
הבנאי של CSI מקבל ארגומנט cid שמציין חיישן מסוים על הלוח. cid=-1 (ברירת המחדל) בוחר את החיישן הראשי; קבועי ה-cid הנקובים בוחרים חיישן משני לפי מזהה שבב:
import csi
csi_rgb = csi.CSI() # primary colour sensor
csi_thermal = csi.CSI(cid=csi.LEPTON) # FLIR® Lepton®
כל מופע מחזיק את התצורה שלו – פורמט פיקסלים, framesize, כפתורי חשיפה / הגבר (gain), מאגר חוצץ פריימים – ומאופס, מוגדר ונקרא באופן עצמאי מהאחר. הקבועים עבור החיישנים המשניים הנתמכים (LEPTON, GENX320, והאחרים המפורטים בעיון של CSI) מציינים את השבב שהאפליקציה מצפה לו ביציאה המשנית; מנהל ההתקן מכשיל את הבנייה אם השבב בפועל אינו תואם.
4.18.2. לכידה משני החיישנים¶
כל חיישן מריץ את צינור הלכידה שלו באופן עצמאי מהאחר – חיישן הצבע עשוי לספק שלושים פריימים בשנייה בעוד ה-Lepton® מספק תשעה. הדרך הישירה לטפל בחוסר ההתאמה הזה היא לתת לחיישן המהיר להניע את הלולאה ולקרוא את החיישן האיטי באופן לא-חוסם, לקחת מה שמוכן ולדלג על האיטרציה כאשר אין דבר:
import csi
csi_rgb = csi.CSI()
csi_thermal = csi.CSI(cid=csi.LEPTON)
csi_rgb.reset() # powers the rail, pulses RESET
csi_rgb.pixformat(csi.RGB565)
csi_rgb.framesize(csi.QVGA)
csi_thermal.reset(hard=False) # I2C reconfigure only
csi_thermal.pixformat(csi.GRAYSCALE)
csi_thermal.framesize(csi.QQVGA)
while True:
rgb_img = csi_rgb.snapshot() # blocks for next colour frame
thermal_img = csi_thermal.snapshot(blocking=False) # returns None if not ready
if thermal_img is not None:
# process aligned colour + thermal pair
pass
else:
# process colour only on this iteration
pass
snapshot() החוסם מקצב את הלולאה; הלא-חוסם מחזיר את הפריים התרמי העדכני ביותר כאשר נחת פריים טרי מאז הקריאה הקודמת, ו-None אחרת. האפליקציה ממשיכה לרוץ בקצב הפריימים של חיישן הצבע ומקבלת פריים תרמי בכל פעם שה-Lepton® מייצר אחד.
התבנית ההפוכה – שתי תמונות בזק (snapshot) חוסמות בזו אחר זו – עובדת גם היא, אך הלולאה רצה אז בקצב האיטי מבין שני החיישנים, כאשר הצינור של החיישן המהיר נתקע בין איטרציות. בחרו בכל קצב שהעיבוד במורד הזרם של האפליקציה באמת רוצה להניע.
4.18.4. בחירת מקור הזרם¶
למצלמות עם שני חיישנים יש שני מופעי CSI אך עדיין רק חוצץ פריימי זרם אחד ביניהם. ארגומנט בנאי בוחר אילו פריימים של חיישן מזינים את התצוגה המקדימה:
csi_rgb = csi.CSI() # primary
csi_thermal = csi.CSI(cid=csi.LEPTON,
stream=True) # preview source
stream=True הופך את המופע הנקוב למקור. ללא ארגומנט stream= החיישן הראשי (cid=-1, ברירת המחדל) הוא המקור; מופעים שנבנו עם cid= של חיישן משני נשארים שקטים בתצוגה המקדימה אלא אם stream=True מועבר במפורש. קריאות ל-snapshot() על החיישן שלא נבחר עדיין לוכדות פריימים לתוך חוצצי הפריימים של אותו חיישן כרגיל – הן פשוט אינן מעדכנות את התצוגה המקדימה.