4.18. Více senzorů#
Hrstka OpenMV Cam kombinuje dva obrazové senzory na stejné desce – nejčastěji barevnou kameru spolu s tepelným senzorem FLIR® Lepton®, ale stejné uspořádání platí pro desky kombinující barvu a události a pro jakýkoli budoucí hardware se dvěma senzory. Každý senzor má své vlastní pixelové pole, svou vlastní řídicí sběrnici a běží svou vlastní pipeline svou vlastní snímkovou frekvencí. API CSI je pokrývá tím, že umožňuje aplikaci vytvořit jeden objekt CSI na fyzický senzor.
4.18.1. Výběr senzoru#
Konstruktor CSI přijímá argument cid, který pojmenovává konkrétní senzor na desce. cid=-1 (výchozí) vybírá primární senzor; pojmenované konstanty cid vybírají sekundární senzor podle ID čipu:
import csi
csi_rgb = csi.CSI() # primary colour sensor
csi_thermal = csi.CSI(cid=csi.LEPTON) # FLIR® Lepton®
Každá instance vlastní svou vlastní konfiguraci – pixelový formát, framesize, ovládací prvky expozice / zisku, pool snímkového bufferu (frame buffer) – a je resetována, konfigurována a čtena nezávisle na ostatních. Konstanty pro podporované sekundární senzory (LEPTON, GENX320 a další uvedené v referenci CSI) pojmenovávají čip, který aplikace očekává na sekundárním portu; ovladač konstrukci nepovede, pokud se skutečný čip neshoduje.
4.18.2. Snímání z obou senzorů#
Každý senzor běží svou snímací pipeline nezávisle na druhém – barevný senzor může dodávat třicet snímků za sekundu, zatímco Lepton® jich dodává devět. Přímočarý způsob, jak tento nesoulad zvládnout, je nechat řídit smyčku rychlejší senzor a číst pomalejší senzor neblokujícím způsobem, vzít cokoli je připraveno a iteraci přeskočit, když není nic:
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
Blokující snapshot() udává tempo smyčky; neblokující vrací nejnovější tepelný snímek, pokud od předchozího volání dorazil čerstvý, a jinak None. Aplikace běží dál snímkovou frekvencí barevného senzoru a získá tepelný snímek pokaždé, když jej Lepton® vyprodukuje.
Opačný vzor – dva blokující snímky za sebou – také funguje, ale smyčka pak běží pomalejší z frekvencí obou senzorů, přičemž pipeline rychlejšího senzoru se mezi iteracemi zastavuje. Vyberte si tu frekvenci, kterou navazující zpracování aplikace skutečně chce řídit.
4.18.4. Výběr zdroje streamu#
Kamery se dvěma senzory mají dvě instance CSI, ale přesto jen jeden streamovací snímkový buffer (frame buffer) mezi nimi. Argument konstruktoru vybírá, snímky kterého senzoru napájejí náhled:
csi_rgb = csi.CSI() # primary
csi_thermal = csi.CSI(cid=csi.LEPTON,
stream=True) # preview source
stream=True činí pojmenovanou instanci zdrojem. Bez argumentu stream= je zdrojem primární senzor (cid=-1, výchozí); instance vytvořené s cid= sekundárního senzoru zůstávají na náhledu tiché, pokud není explicitně předáno stream=True. Volání snapshot() na nevybraném senzoru stále normálně snímají snímky do snímkových bufferů (frame buffer) onoho senzoru – jen neaktualizují náhled.