4.18. Više senzora¶
Šačica OpenMV Cam kamera spaja dva slikovna senzora na istoj pločici – najčešće senzor u boji uz FLIR® Lepton® termalni senzor, ali isti se oblik primjenjuje na pločice s bojom i događajima te bilo koji budući hardver s dva senzora. Svaki senzor ima vlastito polje piksela, vlastitu upravljačku sabirnicu i pokreće vlastiti cjevovod pri vlastitoj brzini sličica. CSI API proširuje se da ih pokrije tako da aplikaciji dopušta instanciranje jednog CSI objekta po fizičkom senzoru.
4.18.1. Odabir senzora¶
Konstruktor CSI prima argument cid koji imenuje određeni senzor na pločici. cid=-1 (zadana vrijednost) odabire primarni senzor; imenovane konstante cid odabiru sekundarni prema ID-u čipa:
import csi
csi_rgb = csi.CSI() # primary colour sensor
csi_thermal = csi.CSI(cid=csi.LEPTON) # FLIR® Lepton®
Svaka instanca posjeduje vlastitu konfiguraciju – format piksela, veličinu sličice, postavke ekspozicije / pojačanja, skup međuspremnika slike – te se resetira, konfigurira i čita neovisno o drugoj. Konstante za podržane sekundarne senzore (LEPTON, GENX320 i ostale navedene u referenci CSI) imenuju čip koji aplikacija očekuje na sekundarnom priključku; upravljački program ne uspijeva u izgradnji ako stvarni čip ne odgovara.
4.18.2. Snimanje s oba senzora¶
Svaki senzor pokreće svoj cjevovod snimanja neovisno o drugome – senzor u boji možda isporučuje trideset sličica u sekundi dok Lepton® isporučuje devet. Izravan način da se nosi s tim nesrazmjerom jest pustiti brži senzor da pokreće petlju i čitati sporiji senzor neblokirajuće, uzimajući ono što je spremno i preskačući iteraciju kada nema ničega:
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
Blokirajući snapshot() tempira petlju; neblokirajući vraća najnoviju termalnu sličicu kada je nova stigla od prethodnog poziva, a inače None. Aplikacija nastavlja raditi pri brzini sličica senzora u boji i dobiva termalnu sličicu kad god je Lepton® proizvede.
Suprotan obrazac – dvije blokirajuće snimke jedna za drugom – također radi, ali petlja tada radi pri sporijoj od brzina dvaju senzora, dok cjevovod bržeg senzora zastaje između iteracija. Odaberite onu brzinu koju zapravo želi pokretati naredna obrada u aplikaciji.
4.18.4. Odabir izvora toka¶
Kamere s dva senzora imaju dvije instance CSI, ali i dalje samo jedan međuspremnik slike toka između njih. Argument konstruktora bira čije sličice hrane pretpregled:
csi_rgb = csi.CSI() # primary
csi_thermal = csi.CSI(cid=csi.LEPTON,
stream=True) # preview source
stream=True čini imenovanu instancu izvorom. Bez argumenta stream= izvor je primarni senzor (cid=-1, zadana vrijednost); instance izgrađene s cid= sekundarnog senzora ostaju nečujne na pretpregledu osim ako se izričito ne proslijedi stream=True. Pozivi snapshot() na neodabranom senzoru i dalje normalno snimaju sličice u međuspremnike slike tog senzora – samo ne ažuriraju pretpregled.