Multispektrální událostní kamera¶
Modul Multispectral Event Camera kombinuje událostní senzor GENX320 s 1 MP barevným senzorem PAG7936 s globální závěrkou na jediném modulu — synchronizovaný řetězec událostí a barvy pro vysokorychlostní sledování objektů, sledování LED, proudění kapalin a další dynamické scény.
Kompletní katalogový list, fotografie a možnosti objednání najdete na produktové stránce Multispectral Event Camera.
Poznámka
Podporováno pouze na OpenMV N6.
Hlavní vlastnosti¶
Událostní senzor 320x320, dynamický rozsah >140 dB, histogramy 375 Hz+
Barevný PAG7936: 1280x800 @ 120 FPS, 640x400 @ 240 FPS
Synchronizované časové značky událostí se sdíleným spouštěčem expozice
Vidí pod 5 lux bez automatické expozice
Spotřeba začíná na ~3 mW pro streamování událostí
Zaměřeno na vysokorychlostní sledování, sledování LED a proudění kapalin/částic
Použití¶
Barevný senzor a událostní senzor GENX320 každý získá vlastní instanci csi.CSI. První volání se ve výchozím nastavení váže na primární senzor (PAG7936); druhé se naváže na GENX320 předáním cid= csi.GENX320. Barevný senzor tvrdě resetujte pomocí csi.CSI.reset (hard=True), abyste rozběhli napájecí větev, a GENX320 nakonfigurujte s hard=False, aby jeho ovladač pouze přeprogramoval čip bez opětovného přepnutí resetu.
GENX320 v režimu histogramu vydává rozlišení 320x320; PAG7936 při csi.QVGA vydává 320x200. Základní překryv níže ořezává spodních 120 řádků snímku GENX320. Pro přizpůsobený překryv nebo větší velikost snímku PAG7936 použijte homografickou transformaci (níže).
Dva pomocné buffery zůstávají během smyčky snímků konstantní — alfa paleta 256x1 uložená jako image.Image, takže pixely histogramu na střední šedé základní úrovni (128) se stávají průhlednými a jak zvýraznění událostí ON, tak stíny událostí OFF se stávají neprůhlednými, a snímkový buffer (frame buffer) GENX320 předem alokovaný pomocí image.Image, takže csi.CSI.snapshot (blocking=False, image=...) jej může v každé iteraci na místě naplnit bez opětovné alokace:
import time
import csi
import image
import math
# V-shaped alpha: pixels far from the baseline 128 become opaque.
alpha_pal = image.Image(256, 1, image.GRAYSCALE)
for i in range(256):
alpha_pal[i] = int(math.pow(abs(i - 128) / 128.0, 2) * 255)
# Setup the color camera sensor.
csi0 = csi.CSI()
csi0.reset(hard=True) # force hardware reset.
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.QVGA)
csi1 = csi.CSI(cid=csi.GENX320)
csi1.reset(hard=False) # no hardware reset - just configure GENX320
csi1.pixformat(csi.GRAYSCALE)
csi1.framesize((320, 320))
csi1.brightness(128) # histogram baseline (default)
csi1.contrast(64) # per-event step
clock = time.clock()
img1 = image.Image(csi1.width(), csi1.height(), csi1.pixformat())
while True:
clock.tick()
img0 = csi0.snapshot()
csi1.snapshot(blocking=False, image=img1)
img0.draw_image(img1, 0, 0, color_palette=image.PALETTE_EVT_LIGHT,
alpha_palette=alpha_pal,
hint=image.BILINEAR)
print(clock.fps())
Každá iterace pořídí blokující barevný snímek a neblokující snímek GENX320. Image.draw_image poté oba kompozituje: color_palette= image.PALETTE_EVT_LIGHT (nebo image.PALETTE_EVT_DARK pro tmavé pozadí) mapuje histogram GENX320 ve stupních šedi na barevný přechod, alpha_palette= mísí každý pixel pomocí alfa mapy ve tvaru V, takže klidné oblasti scény propustí barevný obraz, a hint= image.BILINEAR vyhlazuje zvětšení, když barevný senzor běží ve vyšším rozlišení než GENX320.
Přednastavení bias hodnot GENX320, filtr AFK, kalibrace horkých pixelů a ioctly STC filtru fungují v tomto nastavení s dvěma kamerami stejným způsobem — zavolejte je na csi1 po csi.CSI.reset. Podrobnosti viz oddíly níže.
Zarovnání akcelerované GPU¶
Image.draw_image přijímá argument transform= — homografickou matici 3x3 jako 2-D pole ulab.numpy. Na OpenMV N6 provádí GPU projekci po jednotlivých pixelech během téhož kreslení, takže snímek GENX320 lze přerovnat vůči perspektivě barevné kamery bez samostatného deformačního průchodu — užitečné, když mají oba senzory mírně odlišnou optiku nebo zorná pole, nebo když barevná kamera běží ve vyšším rozlišení. Matici nakalibrujte pro každou kameru pomocí nástroje GenX320 Overlay Calibration, který zobrazuje blikající šachovnici, takže událostní senzor produkuje rohové události bez jakéhokoli fyzického pohybu:
import time
import csi
import image
from ulab import numpy as np
import math
# Calibration matrix from the GenX320 Overlay Calibration tool.
m = np.array([
[2.000000, 0.000000, 0.000000],
[0.000000, 2.000000, 80.000000],
[0.000000, 0.000000, 1.000000],
])
alpha_pal = image.Image(256, 1, image.GRAYSCALE)
for i in range(256):
alpha_pal[i] = int(math.pow(abs(i - 128) / 128.0, 2) * 255)
# Setup the color camera sensor.
csi0 = csi.CSI()
csi0.reset(hard=True)
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.VGA)
csi1 = csi.CSI(cid=csi.GENX320)
csi1.reset(hard=False)
csi1.pixformat(csi.GRAYSCALE)
csi1.framesize((320, 320))
csi1.brightness(128)
csi1.contrast(64)
clock = time.clock()
img1 = image.Image(csi1.width(), csi1.height(), csi1.pixformat())
while True:
clock.tick()
img0 = csi0.snapshot()
csi1.snapshot(blocking=False, image=img1)
img0.draw_image(img1, 0, 0, color_palette=image.PALETTE_EVT_LIGHT,
alpha_palette=alpha_pal,
hint=image.BILINEAR,
transform=m)
print(clock.fps())
Tato varianta provozuje barevnou kameru na csi.VGA (640x480) a GENX320 v jeho nativním rozlišení 320x320 — homografie promítá menší snímek GENX320 do většího barevného snímku jako součást kreslení, takže faktor zvětšení je zapečen přímo do matice, místo aby se aplikoval samostatně.
Podrobnosti o událostní kameře¶
GENX320 je vizuální senzor založený na událostech — namísto vyčítání celého pole 320x320 na pevném snímkovém hodinovém signálu hlásí každý pixel asynchronní „události“ v okamžiku, kdy detekuje změnu jasu. Každá událost nese souřadnici X/Y, polaritu ON/OFF (světlá→tmavá nebo tmavá→světlá) a mikrosekundovou časovou značku. Odtud pochází mikrosekundová časová přesnost senzoru, absence pohybového rozmazání, velmi vysoký dynamický rozsah a spotřeba škálovaná podle aktivity. Statické scény negenerují žádná data.
Firmware OpenMV zpřístupňuje GENX320 prostřednictvím csi.CSI s cid= csi.GENX320. K dispozici jsou dva provozní režimy:
Režim histogramu (výchozí) — události se na čipu akumulují do binů po jednotlivých pixelech a hlásí se jako snímek 320x320 ve stupních šedi s konfigurovatelnou rychlostí (~20–350 FPS). Senzor se chová jako běžná kamera, takže všechny standardní rutiny zpracování obrazu (
Image.find_blobs, palety atd.) fungují přímo.Režim událostí — surové události proudí do numpy
ndarrays plnými mikrosekundovými časovými značkami, pro aplikace, které potřebují časový detail spíše než předem rozbinovaný snímek.
Režim histogramu¶
V režimu histogramu vydává GENX320 snímky ve stupních šedi, kde každý pixel kóduje nedávnou událostní aktivitu na daném místě. Pixely nad jasovou základní úrovní jsou události ON (rostoucí jas), pod ní jsou události OFF (klesající jas). Výchozí základní jas je 128 a kontrastní krok na událost je 16 — zvyšte kontrast, aby události vynikly:
import csi
import time
csi0 = csi.CSI(cid=csi.GENX320)
csi0.reset()
csi0.pixformat(csi.GRAYSCALE)
csi0.framesize((320, 320))
csi0.brightness(128) # baseline (default 128)
csi0.contrast(16) # per-event step
csi0.framerate(50) # 20-350 FPS
clock = time.clock()
while True:
clock.tick()
img = csi0.snapshot()
print(clock.fps())
csi.CSI.brightness, csi.CSI.contrast a csi.CSI.framerate jsou tři ovládací prvky, které utvářejí výstup histogramu.
Barevný výstup¶
Nastavte csi.CSI.color_palette na image.PALETTE_EVT_LIGHT pro světlé pozadí nebo na image.PALETTE_EVT_DARK pro tmavé — ovladač vydává snímky RGB565 s přímým použitím palety:
csi0.color_palette(image.PALETTE_EVT_LIGHT)
Kalibrace horkých pixelů¶
Událostní senzory hromadí „horké pixely“, které spouští falešně. Spusťte csi.IOCTL_GENX320_CALIBRATE proti statické scéně, abyste je zakázali. Ovladač sestaví počet zásahů 320x320 po jednotlivých pixelech, vypočítá průměr a směrodatnou odchylku a zakáže každý pixel, jehož počet je nad mean + sigma * stddev — poté zakázané pixely přestanou vydávat události na úrovni senzoru.
Kalibraci řídí dva parametry:
event_count— kolik událostí načítat před výpočtem statistik. Smyčka zachycuje snímky, dokud běžící celkový počet událostí nepřekročí tento rozpočet. Vyšší počty dávají spolehlivější odhad za cenu delšího času kalibrace.10000je rozumný výchozí bod.sigma— násobič prahu na směrodatné odchylce. Nižší hodnoty jsou agresivnější (více pixelů zakázáno); vyšší hodnoty jsou konzervativnější.0.5je dobrá výchozí hodnota.
Nejprve namiřte senzor na statickou scénu, aby se žádné události vyvolané pohybem nezapočítaly proti pixelům, které jsou ve skutečnosti v pořádku:
csi0.snapshot(time=5000) # let the user steady the camera
disabled = csi0.ioctl(csi.IOCTL_GENX320_CALIBRATE, 10000, 0.5)
print(f"disabled {disabled} hot pixels")
Filtr proti blikání (AFK)¶
Periodické světelné zdroje (zářivky, displeje řízené LED) generují obrovské množství nadbytečných událostí. Filtr AFK odmítá události, jejichž pixel se přepíná na frekvenci uvnitř pásma — povolte jej pomocí csi.IOCTL_GENX320_SET_AFK s okraji pásma v hertzích:
csi0.ioctl(csi.IOCTL_GENX320_SET_AFK, 1, 130, 160) # 130-160 Hz
csi0.ioctl(csi.IOCTL_GENX320_SET_AFK, 0) # disable
Přednastavení bias hodnot¶
Každý pixel v GenX320 provozuje analogovou vstupní část s několika konfigurovatelnými bias hodnotami. Společně řídí citlivost, šum, šířku pásma pixelu a rychlost událostí — správná kombinace závisí na scéně. Jednotlivé bias hodnoty jsou:
DIFF_ON — kladný kontrastní práh komparátoru. Pixel vydá událost ON, když jeho logaritmické osvětlení vzroste o tuto hodnotu. Nižší = citlivější na světlé přechody.
DIFF_OFF — záporný kontrastní práh komparátoru (symetrický protějšek pro události OFF). Nižší = citlivější na tmavé přechody.
FO — mezní frekvence dolní propusti pixelu. Vyšší = širší šířka pásma pixelu (rychlejší odezva, nižší latence), ale více aktivity z šumu pozadí.
HPF — mezní frekvence horní propusti. Vyšší = silnější odmítání pomalých změn jasu; ke komparátorům se dostanou jen rychlé přechody. Užitečné pro ignorování driftu okolního světla.
REFR — refrakterní perioda. Poté, co pixel spustí, zůstává po tuto dobu v resetu, než může spustit znovu. Vyšší = delší doba nečinnosti, užitečné pro omezení rychlosti událostí na pixel.
Po csi.CSI.reset ovladač použije csi.GENX320_BIASES_LOW_NOISE, nikoli csi.GENX320_BIASES_DEFAULT — výchozí hodnoty z katalogového listu vydávají mnohem vyšší rychlost událostí pozadí, takže LOW_NOISE se používá jako výchozí bod, aby byl stream tichý. Když aplikace potřebuje větší citlivost nebo šířku pásma, zavolejte csi.IOCTL_GENX320_SET_BIASES s jiným přednastavením.
csi.IOCTL_GENX320_SET_BIASES aplikuje jedno z pěti přednastavení:
csi.GENX320_BIASES_DEFAULT— výchozí hodnoty z katalogového listu GenX320. Vyvážená citlivost, šum a šířka pásma pro obecné scény.csi.GENX320_BIASES_LOW_LIGHT— oba kontrastní prahy uvolněny pro vyšší citlivost, FO snížena, aby se udržel šum dole, a HPF nastavena na 0, aby se pomalé změny jasu stále zaznamenávaly — scéna se slabým osvětlením sama o sobě generuje málo událostí, takže chceme, aby jich prošlo co nejvíce.csi.GENX320_BIASES_ACTIVE_MARKER— vyladěno pro sledování vysoce kontrastních blikajících LED. Kontrastní prahy zvýšeny, takže spouští jen ostré přechody; FO a HPF vytočeny vysoko pro maximalizaci šířky pásma pixelu a odmítnutí jakéhokoli pomalého okolního driftu; REFR stažena na 0, takže každá hrana blikání je zachycena bezprostředně za sebou. Výsledek: stream tvořený téměř jen hranami LED, snadno sledovatelný.csi.GENX320_BIASES_LOW_NOISE— výchozí nastavení ovladače. Oba kontrastní prahy zvýšeny oprotiDEFAULT(méně citlivé) a FO snížena (pomalejší pixel = tišší pixel). Nejlepší pro statické nebo pomalé scény, kde by jinak dominovaly falešné události.csi.GENX320_BIASES_HIGH_SPEED— FO zvýšena, aby každý pixel mohl reagovat rychleji, HPF zvýšena pro odmítnutí pomalého driftu jasu a REFR zvýšena, aby jediná rychle se pohybující hrana nezahltila vyčítání — delší doba nečinnosti udržuje objem událostí omezený při silném pohybu.
Jednotlivé bias hodnoty přepište pomocí csi.IOCTL_GENX320_SET_BIAS plus jedné z csi.GENX320_BIAS_DIFF_ON, csi.GENX320_BIAS_DIFF_OFF, csi.GENX320_BIAS_FO, csi.GENX320_BIAS_HPF nebo csi.GENX320_BIAS_REFR a hodnoty DAC. Každá bias hodnota se nastavuje nezávisle — zvolte přednastavení jako výchozí bod a poté upravte ty bias hodnoty, které vaše scéna potřebuje:
csi0.ioctl(csi.IOCTL_GENX320_SET_BIASES, csi.GENX320_BIASES_LOW_LIGHT)
csi0.ioctl(csi.IOCTL_GENX320_SET_BIAS, csi.GENX320_BIAS_HPF, 20)
Sledování¶
Protože výstup režimu histogramu je jen obraz ve stupních šedi, běžné sledování blobů funguje přímo. Pro sledování LED aktivního markeru načtěte přednastavení bias hodnot pro aktivní marker a vyhledejte bloby na jasném konci histogramu:
import csi
import time
csi0 = csi.CSI(cid=csi.GENX320)
csi0.reset()
csi0.pixformat(csi.GRAYSCALE)
csi0.framesize((320, 320))
csi0.brightness(128)
csi0.contrast(16)
csi0.framerate(200)
csi0.ioctl(csi.IOCTL_GENX320_SET_BIASES, csi.GENX320_BIASES_ACTIVE_MARKER)
clock = time.clock()
while True:
clock.tick()
img = csi0.snapshot()
for blob in img.find_blobs([(120, 140)], invert=True,
pixels_threshold=2, area_threshold=4,
merge=True):
img.draw_detection(blob)
print(clock.fps())
Režim událostí¶
Režim událostí obchází histogram na čipu a streamuje surové události do numpy ndarray. Každá událost je řádek šesti sloupců uint16:
[0]typ události — viz níže[1]časová značka sekund[2]časová značka milisekund[3]časová značka mikrosekund[4]souřadnice X, 0-319[5]souřadnice Y, 0-319
Ovladač vydává šest typů událostí ve sloupci [0]:
csi.PIX_OFF_EVENT— pixel detekoval pokles jasu (byl překročen kontrastní práh komparátoruDIFF_OFF). X/Y ukazují na pixel, který spustil.csi.PIX_ON_EVENT— pixel detekoval nárůst jasu (byl překročen práhDIFF_ON). X/Y ukazují na pixel.csi.EXT_TRIGGER_FALLING— externí spouštěcí pin senzoru zaznamenal sestupnou hranu. X/Y se nepoužívají.csi.EXT_TRIGGER_RISING— externí spouštěcí pin senzoru zaznamenal vzestupnou hranu. X/Y se nepoužívají.csi.RST_TRIGGER_FALLING— spouštěč resetu pixelu, sestupná hrana. X/Y se nepoužívají. V tuto chvíli firmware tento typ negeneruje.csi.RST_TRIGGER_RISING— spouštěč resetu pixelu, vzestupná hrana. X/Y se nepoužívají. V tuto chvíli firmware tento typ negeneruje.
Externí spouštěcí vstup GENX320 je propojen s linkou snímkové synchronizace kamery, která je rovněž vedena na P10 jak na procesoru, tak na pinovém konektoru — přivedením signálu na P10 vložíte synchronizační hrany do streamu událostí a zachytíte je jako události EXT_TRIGGER_RISING / EXT_TRIGGER_FALLING spolu s daty pixelů.
Většina aplikací se zajímá pouze o PIX_OFF_EVENT a PIX_ON_EVENT; spouštěcí typy umožňují korelovat události s externími časovacími signály.
Alokujte buffer událostí s tvarem (EVT_res, 6), kde EVT_res je mocnina dvou mezi 1024 a 65536, poté přejděte do režimu událostí pomocí csi.IOCTL_GENX320_SET_MODE s csi.GENX320_MODE_EVENT a velikostí bufferu. Události čtěte pomocí csi.IOCTL_GENX320_READ_EVENTS, který naplní buffer až do jeho kapacity a vrátí počet platných řádků.
Image.draw_event_histogram rasterizuje události do obrazu ve stupních šedi — pro každou událost ON přidá contrast do binu; pro každou událost OFF jej odečte. clear=True nejprve resetuje obraz na brightness; clear=False akumuluje přes mnoho volání:
import csi
import image
import time
from ulab import numpy as np
img = image.Image(320, 320, image.GRAYSCALE)
events = np.zeros((2048, 6), dtype=np.uint16)
csi0 = csi.CSI(cid=csi.GENX320)
csi0.reset()
csi0.ioctl(csi.IOCTL_GENX320_SET_MODE, csi.GENX320_MODE_EVENT, events.shape[0])
clock = time.clock()
while True:
clock.tick()
n = csi0.ioctl(csi.IOCTL_GENX320_READ_EVENTS, events)
img.draw_event_histogram(events[:n], clear=True, brightness=128, contrast=64)
img.flush()
print(n, clock.fps())
Přednastavení bias hodnot režimu histogramu, filtr AFK a ioctly kalibrace horkých pixelů fungují v režimu událostí stejným způsobem — zavolejte je po csi.IOCTL_GENX320_SET_MODE.
Filtrování podle polarity¶
Rozdělte pole událostí pomocí ulab, abyste ponechali jen události ON (pohyb do jasnějšího stavu) nebo jen události OFF:
TARGET = csi.PIX_ON_EVENT # or csi.PIX_OFF_EVENT
events_slice = events[:n]
indices = np.nonzero(events_slice[:, 0] == TARGET)[0]
if len(indices):
target_events = np.take(events_slice, indices, axis=0)
img.draw_event_histogram(target_events, clear=True,
brightness=128, contrast=64)
Akumulace s dlouhou expozicí¶
Nastavte clear=False, abyste přes mnoho snímků stále vrstvili události do téhož obrazu — výsledkem je vizualizace pohybové stopy. Periodicky resetujte, abyste začali novou expozici:
EXPOSURE_FRAMES = 30
i = 0
while True:
n = csi0.ioctl(csi.IOCTL_GENX320_READ_EVENTS, events)
clear = (i % EXPOSURE_FRAMES) == 0
img.draw_event_histogram(events[:n], clear=clear, brightness=128, contrast=64)
img.flush()
i += 1
Vysokorychlostní zpracování¶
Vypusťte vizualizaci, abyste uvolnili CPU pro zpracování událostí. Statistiky tiskněte jen v každé N-té iteraci — vytlačení řádku s tiskem v každé iteraci se při vysokých rychlostech událostí stane úzkým hrdlem:
csi0 = csi.CSI(cid=csi.GENX320)
csi0.reset()
csi0.ioctl(csi.IOCTL_GENX320_SET_MODE, csi.GENX320_MODE_EVENT, events.shape[0])
clock = time.clock()
i = 0
while True:
clock.tick()
n = csi0.ioctl(csi.IOCTL_GENX320_READ_EVENTS, events)
i += 1
if not i % 10:
print(f"{n} events {clock.fps()} fps")
Filtr prostorově-časového kontrastu (STC)¶
Skutečná pohybující se kontrastní hrana má tendenci spustit hlučný výbuch událostí na témže pixelu v krátkém časovém okně — nesoulad pixelů a analogový šum produkují kolem skutečného přechodu další události, které nejsou pro aplikaci užitečné. STC filtr je následné zpracování na čipu, které ponechá jen jednu (nebo několik) událostí na výbuch a zbytek zahodí.
Implementuje tři strategie volené pomocí csi.IOCTL_GENX320_SET_STC a konstanty GENX320_STC_*. Každý režim je definován tím, které události z výbuchu propustí:
Režim |
Ponechává |
Zahazuje |
|---|---|---|
každou událost |
nic |
|
druhou událost výbuchu |
první + pozdější události |
|
první událost výbuchu |
následující události |
|
první + následující hrany |
pouze nadbytečný šum |
Podrobně:
csi.GENX320_STC_DISABLE— filtr vypnut, projde každá událost (výchozí).csi.GENX320_STC_ONLY— ponechává druhou událost výbuchu. Parametr:stc_threshold(ms). Pokud nová událost na pixelu dorazí dostc_thresholdod předchozí události, je považována za „druhou“ výbuchu a je propuštěna — první událost a jakékoli následující události téhož výbuchu jsou odfiltrovány. Nejlepší, když chcete šumem potvrzený přechod spíše než úplně první zásah.csi.GENX320_STC_TRAIL_ONLY— ponechává první událost výbuchu. Parametr:trail_threshold(ms). Poté, co pixel spustí, jsou následující události na témže pixelu zahozeny, dokud neuplynetrail_threshold. Zachovává přesné časování náběžné hrany — užitečné, když na okamžiku přepnutí polarity záleží více než na potvrzení výbuchu.csi.GENX320_STC_TRAIL— kombinuje obojí. Parametry:stc_thresholdatrail_threshold(oba ms). Ponechává náběžnou hranu podle režimu Trail plus následující hrany podle režimu STC, takže více událostí z výbuchu stále projde — vyšší propustnost událostí než u jednorežimových filtrů, ale nejbohatší signál.
Oba prahy musí zůstat zhruba v poměru 13:1 — senzor odmítá konfigurace, kde je jeden více než ~13x větší než druhý:
csi0.ioctl(csi.IOCTL_GENX320_SET_STC, csi.GENX320_STC_TRAIL, 1, 2)
csi0.ioctl(csi.IOCTL_GENX320_SET_STC, csi.GENX320_STC_DISABLE)
Hloubka bufferu¶
Když rychlost událostí prudce vzroste, výchozí trojitě bufferovaný řetězec upřednostňuje nejnovější snímek a staré zahazuje. Zvyšte hloubku FIFO pomocí csi.CSI.framebuffers, abyste místo toho události řadili do fronty — za cenu zpracování o něco starších dat, když host zaostává:
csi0.framebuffers(10) # FIFO depth, > 3 enables queueing
Streamování a vizualizace na počítači¶
Pro vizualizaci v reálném čase v GUI na hostitelském PC párů nástroj GenX320 Event Streaming v repozitáři openmv-projects kameru s frontendem DearPyGui. GUI na PC provozuje dvě vizualizace vedle sebe: plátno akumulace událostí (stejná myšlenka jako Image.draw_event_histogram, ale s volitelnými paletami a režimy posuvného okna vs. automatického mazání) a frekvenční mapu po jednotlivých pixelech řízenou IIR pásmovou propustí — užitečné pro odhalování periodických signálů (rotující ventilátory, blikající LED atd.) přímo ve streamu událostí.
Dodává se se dvěma streamovacími skripty běžícími na kameře:
Zpracovaný režim (
genx320_event_mode_streaming_on_cam.py) — kamera dekóduje události pomocícsi.IOCTL_GENX320_READ_EVENTSa streamuje každý řádek jako 12 bajtů přes USB ([0]typ,[1]s,[2]ms,[3]us,[4]x,[5]y). Snadno konzumovatelný na PC, protože formát na drátě odpovídá formátu ndarray na kameře.Surový režim (
genx320_raw_event_mode_streaming_on_cam.py) — kamera streamuje nativní 32bitová zabalená slova událostí čipu pomocícsi.IOCTL_GENX320_READ_EVENTS_RAW. To jsou 4 bajty na událost oproti 12 ve zpracovaném režimu (přibližně 3x méně dat přes USB), takže ~3x vyšší dosažitelná rychlost událostí, když je úzkým hrdlem linka. PC dekóduje zabalená slova zpět do téhož šestisloupcového rozložení událostí pomocí vektorizovaného numpy, takže navazující kód vizualizéru je identický.
Surový režim je v GUI výchozí, protože propustnost USB je vázající omezení při rychlostech, které GenX320 dokáže produkovat; přepněte do zpracovaného režimu, pokud potřebujete zapojit logiku zpracování do skriptu běžícího na kameře.