Multispektrális eseménykamera¶
A multispektrális eseménykamera modul a GENX320 eseményérzékelőt egyetlen modulon párosítja egy 1 MP-es PAG7936 global-shutter színes érzékelővel — egy szinkronizált esemény + szín feldolgozási lánc nagy sebességű objektumkövetéshez, LED-követéshez, folyadékáramláshoz és más dinamikus jelenetekhez.
A teljes adatlapért, fényképekért és rendeléshez lásd a Multispectral Event Camera termékoldalt.
Megjegyzés
Csak az OpenMV N6 modellen támogatott.
Kiemelt jellemzők¶
320x320 eseményérzékelő, >140 dB dinamikatartomány, 375 Hz+ hisztogramok
PAG7936 színes: 1280x800 @ 120 FPS, 640x400 @ 240 FPS
Szinkronizált esemény-időbélyegek közös expozíciós triggerrel
5 lux alatt is lát automatikus expozíció nélkül
A teljesítményfelvétel eseményfolyamhoz ~3 mW-ról indul
Nagy sebességű követéshez, LED-követéshez és folyadék-/részecskeáramláshoz célzott
Használat¶
A színes érzékelő és a GENX320 eseményérzékelő egyaránt saját csi.CSI példányt kap. Az első hívás alapértelmezésben az elsődleges érzékelőhöz (a PAG7936-hoz) kötődik; a második a GENX320-hoz kötődik a cid= csi.GENX320 átadásával. A színes érzékelőt hardveresen reseteld a csi.CSI.reset (hard=True) hívással, hogy a tápsínt felhozd, a GENX320-at pedig hard=False beállítással konfiguráld, így a meghajtója csak újraprogramozza a chipet anélkül, hogy újra váltogatná a resetet.
A GENX320 hisztogram módban 320x320-at ad ki; a PAG7936 csi.QVGA mellett 320x200-at ad ki. Az alábbi alapszintű rávetítés levágja a GENX320 képkocka alsó 120 sorát. Használd a homográfiás transzformációt (lentebb) az illesztett rávetítéshez vagy nagyobb PAG7936 képkockamérethez.
Két ideiglenes puffer állandó marad a képkocka-cikluson keresztül — egy 256x1-es alfa-paletta image.Image formátumban tárolva, így a középszürke alapszinten (128) lévő hisztogram-képpontok átlátszóvá válnak, az ON-esemény kiemelések és az OFF-esemény árnyékok pedig átlátszatlanná válnak, valamint egy GENX320 képkocka-puffer, amelyet előre lefoglaltunk az image.Image segítségével, így a csi.CSI.snapshot (blocking=False, image=...) minden iterációban helyben töltheti fel azt újrafoglalás nélkül:
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())
Minden iteráció egy blokkoló színes pillanatképet és egy nem blokkoló GENX320 pillanatképet készít. Az Image.draw_image ezután összeállítja a kettőt: a color_palette= image.PALETTE_EVT_LIGHT (vagy image.PALETTE_EVT_DARK sötét háttérhez) a GENX320 szürkeárnyalatos hisztogramját egy színátmenetre képezi le, az alpha_palette= minden képpontot a V-alakú alfa-térkép segítségével kever, így a jelenet csendes területei áthatnak a színes képre, a hint= image.BILINEAR pedig simítja a felskálázást, amikor a színes érzékelő nagyobb felbontáson fut, mint a GENX320.
A GENX320 bias előbeállításai, AFK szűrője, hot-pixel kalibrációja és STC szűrője ioctl-jei mind ugyanúgy működnek ebben a kétkamerás elrendezésben — hívd meg őket a csi1 példányon a csi.CSI.reset után. A részletekért lásd az alábbi szakaszokat.
GPU-gyorsított igazítás¶
Az Image.draw_image elfogad egy transform= argumentumot — egy 3x3-as homográfiás mátrixot 2D-s ulab.numpy tömbként. Az OpenMV N6 modellen a GPU a képpontonkénti projekciót ugyanazon rajzolás során futtatja, így a GENX320 képkockája újraigazítható a színes kamera perspektívájához egy külön torzítási menet nélkül — hasznos, amikor a két érzékelő optikája vagy látómezeje kissé eltér, vagy amikor a színes kamera nagyobb felbontáson fut. Kalibráld a mátrixot kameránként a GenX320 Overlay Calibration eszközzel, amely egy villogó sakktáblamintát jelenít meg, így az eseményérzékelő bármilyen fizikai mozgás nélkül sarokeseményeket állít elő:
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())
Ez a változat a színes kamerát csi.VGA (640x480) felbontáson, a GENX320-at pedig natív 320x320-on futtatja — a homográfia a kisebb GENX320 képkockát a nagyobb színes képkockába vetíti a rajzolás részeként, így a felskálázási tényező magába a mátrixba van beépítve, nem pedig külön alkalmazva.
Az eseménykamera részletei¶
A GENX320 egy eseményalapú látóérzékelő — ahelyett, hogy a teljes 320x320-as tömböt fix képkocka-órajelen olvasná ki, minden képpont aszinkron „eseményeket” jelent abban a pillanatban, amikor fényerőváltozást észlel. Minden esemény hordoz egy X/Y koordinátát, egy ON/OFF polaritást (világos→sötét vagy sötét→világos) és egy mikroszekundumos időbélyeget. Innen ered az érzékelő mikroszekundumos időbeli pontossága, a mozgási elmosódás hiánya, a nagyon nagy dinamikatartomány és az aktivitással skálázódó teljesítményfelvétel. A statikus jelenetek nem generálnak adatot.
Az OpenMV firmware a GENX320-at a csi.CSI osztályon keresztül teszi elérhetővé a cid= csi.GENX320 beállítással. Két üzemmód érhető el:
Hisztogram mód (alapértelmezett) — az eseményeket a chip képpontonkénti binekbe gyűjti, és 320x320-as szürkeárnyalatos képkockaként jelenti egy konfigurálható sebességgel (~20-350 FPS). Az érzékelő úgy viselkedik, mint egy hagyományos kamera, így az összes szabványos képfeldolgozó rutin (
Image.find_blobs, paletták stb.) közvetlenül működik.Esemény mód — a nyers események egy numpy
ndarraytömbbe áramlanak teljes mikroszekundumos időbélyegekkel, azokhoz az alkalmazásokhoz, amelyeknek az időbeli részletre van szükségük, nem pedig egy előre binekbe gyűjtött képkockára.
Hisztogram mód¶
Hisztogram módban a GENX320 olyan szürkeárnyalatos képkockákat ad ki, ahol minden képpont az adott helyen a közelmúltbeli eseményaktivitást kódolja. A fényerő-alapszint feletti képpontok ON események (emelkedő fényerő), az alattiak OFF események (csökkenő fényerő). Az alapértelmezett alapszint-fényerő 128, az eseményenkénti kontrasztlépés pedig 16 — emeld meg a kontrasztot, hogy az események kiugorjanak:
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())
A csi.CSI.brightness, a csi.CSI.contrast és a csi.CSI.framerate az a három szabályozó, amely a hisztogram kimenetét alakítja.
Színezett kimenet¶
Állítsd a csi.CSI.color_palette értékét image.PALETTE_EVT_LIGHT-re világos háttérhez vagy image.PALETTE_EVT_DARK-ra sötéthez — a meghajtó közvetlenül a palettát használva RGB565 képkockákat ad ki:
csi0.color_palette(image.PALETTE_EVT_LIGHT)
Hot-pixel kalibráció¶
Az eseményérzékelők „hot pixeleket” halmoznak fel, amelyek hibásan tüzelnek. Futtasd a csi.IOCTL_GENX320_CALIBRATE parancsot egy statikus jelenettel szemben, hogy letiltsd őket. A meghajtó felépít egy 320x320-as képpontonkénti találatszámlálót, kiszámítja az átlagot és a szórást, majd letilt minden olyan képpontot, amelynek a száma mean + sigma * stddev fölött van — ezután a letiltott képpontok már nem bocsátanak ki eseményeket az érzékelő szintjén.
Két paraméter vezérli a kalibrációt:
event_count— hány eseményt számláljon meg a statisztika kiszámítása előtt. A ciklus addig rögzít képkockákat, amíg a futó eseményösszeg át nem lépi ezt a keretet. A nagyobb számok megbízhatóbb becslést adnak, de hosszabb kalibrációs idő árán. A10000ésszerű kiindulópont.sigma— a szóráson alkalmazott küszöbszorzó. Az alacsonyabb értékek agresszívabbak (több képpont letiltva); a magasabbak konzervatívabbak. A0.5jó alapértelmezés.
Először irányítsd az érzékelőt egy statikus jelenetre, hogy a mozgás vezérelte események ne számítsanak bele olyan képpontokba, amelyek valójában rendben vannak:
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")
Villogásgátló (AFK) szűrő¶
A periodikus fényforrások (fénycsövek, LED-vezérelt kijelzők) hatalmas mennyiségű redundáns eseményt generálnak. Az AFK szűrő elutasítja azokat az eseményeket, amelyek képpontja egy sávon belüli frekvencián váltakozik — engedélyezd a csi.IOCTL_GENX320_SET_AFK segítségével a sávhatárokkal hertzben megadva:
csi0.ioctl(csi.IOCTL_GENX320_SET_AFK, 1, 130, 160) # 130-160 Hz
csi0.ioctl(csi.IOCTL_GENX320_SET_AFK, 0) # disable
Bias előbeállítások¶
A GenX320 minden képpontja egy analóg előtagolóval fut, több konfigurálható biasszal. Ezek együttesen szabályozzák az érzékenységet, a zajt, a képpont sávszélességét és az eseménysebességet — a megfelelő kombináció a jelenettől függ. Az egyes biasok:
DIFF_ON — a pozitív komparátor kontraszt-küszöbértéke. Egy képpont ON eseményt bocsát ki, ha a log-megvilágítása ennyivel emelkedett. Alacsonyabb = érzékenyebb a világos átmenetekre.
DIFF_OFF — a negatív komparátor kontraszt-küszöbértéke (az OFF események szimmetrikus megfelelője). Alacsonyabb = érzékenyebb a sötét átmenetekre.
FO — a képpont aluláteresztő levágási frekvenciája. Magasabb = szélesebb képpont-sávszélesség (gyorsabb válasz, alacsonyabb késleltetés), de több háttérzaj-aktivitás.
HPF — a felüláteresztő levágási frekvencia. Magasabb = erősebb elutasítása a lassú fényerőváltozásoknak; csak a gyors átmenetek érik el a komparátorokat. Hasznos a környezeti elsodródás figyelmen kívül hagyásához.
REFR — a refrakter periódus. Miután egy képpont tüzelt, ennyi ideig reset állapotban marad, mielőtt újra tüzelhetne. Magasabb = hosszabb holtidő, hasznos a képpontonkénti eseménysebesség korlátozásához.
A csi.CSI.reset után a meghajtó a csi.GENX320_BIASES_LOW_NOISE előbeállítást alkalmazza, nem a csi.GENX320_BIASES_DEFAULT-ot — az adatlap alapértelmezései sokkal magasabb háttéresemény-sebességet bocsátanak ki, ezért a LOW_NOISE kiindulópontként szolgál, hogy a folyam csendes maradjon. Hívd meg a csi.IOCTL_GENX320_SET_BIASES parancsot egy másik előbeállítással, amikor az alkalmazásnak nagyobb érzékenységre vagy sávszélességre van szüksége.
A csi.IOCTL_GENX320_SET_BIASES az öt előbeállítás egyikét alkalmazza:
csi.GENX320_BIASES_DEFAULT— GenX320 adatlap-alapértelmezések. Kiegyensúlyozott érzékenység, zaj és sávszélesség általános jelenetekhez.csi.GENX320_BIASES_LOW_LIGHT— mindkét kontraszt-küszöbérték lazítva a nagyobb érzékenységért, az FO leszállítva a zaj alacsonyan tartásához, és a HPF 0-ra állítva, így a lassú fényerőváltozások is regisztrálódnak — egy gyenge fényű jelenet önmagában kevés eseményt generál, ezért azt akarjuk, hogy minél több jusson át.csi.GENX320_BIASES_ACTIVE_MARKER— nagy kontrasztú villogó LED-ek követéséhez hangolva. A kontraszt-küszöbértékek megemelve, így csak az éles átmenetek váltanak ki; az FO és a HPF magasra tekerve a képpont-sávszélesség maximalizálásához és bármilyen lassú környezeti elsodródás elutasításához; a REFR 0-ra húzva, így minden villanási él egymás után rögzül. Az eredmény: egy szinte teljesen LED-élekből álló folyam, amelyet könnyű követni.csi.GENX320_BIASES_LOW_NOISE— a meghajtó alapértelmezése. Mindkét kontraszt-küszöbérték megemelve aDEFAULT-hoz képest (kevésbé érzékeny), az FO pedig leszállítva (lassabb képpont = csendesebb képpont). A legjobb statikus vagy lassú jelenetekhez, ahol a hamis események egyébként dominálnának.csi.GENX320_BIASES_HIGH_SPEED— az FO megemelve, így minden képpont gyorsabban tud reagálni, a HPF megemelve a lassú fényerő-elsodródás elutasításához, a REFR pedig megemelve, így egyetlen gyorsan mozgó él nem árasztja el a kiolvasást — a hosszabb holtidő korlátok között tartja az eseménymennyiséget erős mozgás esetén.
Az egyes biasokat a csi.IOCTL_GENX320_SET_BIAS segítségével írhatod felül, a csi.GENX320_BIAS_DIFF_ON, csi.GENX320_BIAS_DIFF_OFF, csi.GENX320_BIAS_FO, csi.GENX320_BIAS_HPF vagy csi.GENX320_BIAS_REFR egyikével és egy DAC értékkel együtt. Minden bias függetlenül állítható be — válassz egy előbeállítást kiindulópontként, majd finomhangold azokat a biasokat, amelyekre a jelenetednek szüksége van:
csi0.ioctl(csi.IOCTL_GENX320_SET_BIASES, csi.GENX320_BIASES_LOW_LIGHT)
csi0.ioctl(csi.IOCTL_GENX320_SET_BIAS, csi.GENX320_BIAS_HPF, 20)
Követés¶
Mivel a hisztogram módú kimenet csupán egy szürkeárnyalatos kép, a hagyományos folt-követés közvetlenül működik. Egy aktív-marker LED követéséhez töltsd be az aktív-marker bias előbeállítást, és keress foltokat a hisztogram világos végén:
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())
Esemény mód¶
Az esemény mód megkerüli a chipen lévő hisztogramot, és a nyers eseményeket egy numpy ndarray tömbbe áramoltatja. Minden esemény hat uint16 oszlopból álló sor:
[0]eseménytípus — lásd lentebb[1]másodperc időbélyeg[2]ezredmásodperc időbélyeg[3]mikroszekundum időbélyeg[4]X koordináta, 0-319[5]Y koordináta, 0-319
A meghajtó hat eseménytípust bocsát ki a [0] oszlopban:
csi.PIX_OFF_EVENT— egy képpont fényerőcsökkenést észlelt (aDIFF_OFFkomparátor küszöbértékét átlépte). Az X/Y a tüzelő képpontra mutat.csi.PIX_ON_EVENT— egy képpont fényerőnövekedést észlelt (aDIFF_ONküszöbértéket átlépte). Az X/Y a képpontra mutat.csi.EXT_TRIGGER_FALLING— az érzékelő külső trigger lába lefutó élt látott. Az X/Y nincs használatban.csi.EXT_TRIGGER_RISING— az érzékelő külső trigger lába felfutó élt látott. Az X/Y nincs használatban.csi.RST_TRIGGER_FALLING— képpont-reset trigger, lefutó él. Az X/Y nincs használatban. A firmware jelenleg nem generálja.csi.RST_TRIGGER_RISING— képpont-reset trigger, felfutó él. Az X/Y nincs használatban. A firmware jelenleg nem generálja.
A GENX320 külső trigger bemenete a kamera képkocka-szinkron vonalához van bekötve, amely a processzoron és a tűsoron egyaránt a P10-re is van vezetve — vezéreld a P10-et, hogy szinkron éleket injektálj az eseményfolyamba, és felvedd őket EXT_TRIGGER_RISING / EXT_TRIGGER_FALLING eseményekként a képpontadatok mellett.
A legtöbb alkalmazást csak a PIX_OFF_EVENT és a PIX_ON_EVENT érdekli; a trigger típusok lehetővé teszik, hogy az eseményeket külső időzítési jelekkel korreláld.
Foglald le az eseménypuffert (EVT_res, 6) alakkal, ahol az EVT_res egy kettő hatvány 1024 és 65536 között, majd lépj be az esemény módba a csi.IOCTL_GENX320_SET_MODE parancson keresztül a csi.GENX320_MODE_EVENT értékkel és a puffer méretével. Az eseményeket a csi.IOCTL_GENX320_READ_EVENTS parancssal olvasd, amely a puffert a kapacitásáig tölti fel, és visszaadja az érvényes sorok számát.
Az Image.draw_event_histogram az eseményeket egy szürkeárnyalatos képpé raszterizálja — minden ON eseményhez hozzáadja a contrast értéket a binhez; minden OFF eseménynél kivonja. A clear=True először visszaállítja a képet a brightness értékre; a clear=False sok hívás során halmoz fel:
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())
A hisztogram módú bias előbeállítások, az AFK szűrő és a hot-pixel kalibráció ioctl-jei mind ugyanúgy működnek esemény módban — hívd meg őket a csi.IOCTL_GENX320_SET_MODE után.
Szűrés polaritás szerint¶
Szeleteld az eseménytömböt az ulab segítségével, hogy csak az ON eseményeket (mozgás világosabb állapotba) vagy csak az OFF eseményeket tartsd meg:
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)
Hosszú expozíciós felhalmozás¶
Állítsd a clear=False értéket, hogy sok képkockán keresztül ugyanabba a képbe halmozd az eseményeket — az eredmény egy mozgásnyom-vizualizáció. Időszakosan reseteld, hogy új expozíciót kezdj:
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
Nagy sebességű feldolgozás¶
Hagyd el a vizualizációt, hogy CPU-t szabadíts fel az eseményfeldolgozáshoz. Csak minden N-edik iterációban írj ki statisztikát — egy nyomtatási sor minden iterációban való kiküldése válik a szűk keresztmetszetté nagy eseménysebességeknél:
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")
Tér-időbeli kontraszt (STC) szűrő¶
Egy valódi mozgó kontrasztél hajlamos egy zajos esemény-kitörést kiváltani ugyanazon a képponton egy rövid időablakon belül — a képpont-eltérés és az analóg zaj extra eseményeket hoz létre a valódi átmenet körül, amelyek nem hasznosak az alkalmazás számára. Az STC szűrő egy chipen lévő utófeldolgozás, amely kitörésenként csak egy (vagy néhány) eseményt tart meg, a többit eldobja.
Három stratégiát valósít meg, amelyek a csi.IOCTL_GENX320_SET_STC parancson és egy GENX320_STC_* konstansson keresztül választhatók ki. Minden módot az határoz meg, hogy egy kitörésből mely eseményeket továbbítja:
Mód |
Megtartja |
Eldobja |
|---|---|---|
minden eseményt |
semmit |
|
a kitörés második eseményét |
az első + későbbi eseményeket |
|
a kitörés első eseményét |
a későbbi eseményeket |
|
az első + későbbi éleket |
csak a redundáns zajt |
Részletesen:
csi.GENX320_STC_DISABLE— a szűrő kikapcsolva, minden esemény áthalad (alapértelmezett).csi.GENX320_STC_ONLY— a kitörés második eseményét tartja meg. Paraméter:stc_threshold(ms). Ha egy képponton egy új esemény egy korábbi eseményhez képeststc_thresholdidőn belül érkezik, akkor egy kitörés „másodikjának” tekinti, és továbbítja — az első esemény és az ugyanazon kitörésben lévő bármely későbbi esemény kiszűrésre kerül. A legjobb, amikor egy zaj-megerősített átmenetet szeretnél a legelső találat helyett.csi.GENX320_STC_TRAIL_ONLY— a kitörés első eseményét tartja meg. Paraméter:trail_threshold(ms). Miután egy képpont tüzelt, az ugyanazon a képponton lévő későbbi események eldobásra kerülnek, amíg el nem telt atrail_threshold. Megőrzi a felfutó él pontos időzítését — hasznos, amikor a polaritásváltás pillanata fontosabb, mint a kitörés megerősítése.csi.GENX320_STC_TRAIL— kombinálja a kettőt. Paraméterek:stc_thresholdéstrail_threshold(mindkettő ms). Megtartja a felfutó élt a Trail mód szerint, plusz a későbbi éleket az STC mód szerint, így egy kitörésből több esemény is átjut — nagyobb esemény-átviteli teljesítmény, mint az egymódú szűrőknél, de a leggazdagabb jellel.
A két küszöbértéknek nagyjából 13:1 arányon belül kell maradnia — az érzékelő elutasítja azokat a konfigurációkat, ahol az egyik több mint ~13-szorosa a másiknak:
csi0.ioctl(csi.IOCTL_GENX320_SET_STC, csi.GENX320_STC_TRAIL, 1, 2)
csi0.ioctl(csi.IOCTL_GENX320_SET_STC, csi.GENX320_STC_DISABLE)
Puffermélység¶
Amikor az eseménysebesség megugrik, az alapértelmezett hármas pufferes feldolgozási lánc a legújabb képkockát részesíti előnyben, és a régieket eldobja. Növeld a FIFO mélységét a csi.CSI.framebuffers segítségével, hogy ehelyett sorba állítsd az eseményeket — annak árán, hogy kissé régebbi adatokat dolgozol fel, amikor a gazda lemarad:
csi0.framebuffers(10) # FIFO depth, > 3 enables queueing
Asztali streamelés és vizualizáció¶
Egy gazda PC-n történő valós idejű grafikus felületű vizualizációhoz a GenX320 Event Streaming eszköz az openmv-projects tárolóban a kamerát egy DearPyGui frontenddel párosítja. A PC grafikus felülete két vizualizációt futtat egymás mellett: egy eseményfelhalmozási vásznat (ugyanaz az elv, mint az Image.draw_event_histogram, de választható palettákkal és csúszóablakos vs. automatikus törlés módokkal) és egy képpontonkénti frekvenciatérképet, amelyet egy IIR sáváteresztő szűrő hajt — hasznos a periodikus jelek (forgó ventilátorok, villogó LED-ek stb.) közvetlenül az eseményfolyamban való felismeréséhez.
Két, a kamerán futó streamelő szkriptet tartalmaz:
Feldolgozott mód (
genx320_event_mode_streaming_on_cam.py) — a kamera acsi.IOCTL_GENX320_READ_EVENTSsegítségével dekódolja az eseményeket, és minden sort 12 bájtként streamel USB-n keresztül ([0]típus,[1]mp,[2]ms,[3]us,[4]x,[5]y). Könnyű feldolgozni a PC-n, mert a vezetékes formátum megegyezik a kamerán lévő ndarray formátummal.Nyers mód (
genx320_raw_event_mode_streaming_on_cam.py) — a kamera a chip natív 32 bites tömörített eseményszavait streameli acsi.IOCTL_GENX320_READ_EVENTS_RAWsegítségével. Ez eseményenként 4 bájt a feldolgozott mód 12 bájtjával szemben (körülbelül 3-szor kevesebb adat USB-n keresztül), így ~3-szor nagyobb elérhető eseménysebesség, amikor a kapcsolat a szűk keresztmetszet. A PC a tömörített szavakat visszadekódolja ugyanarra a 6 oszlopos eseményelrendezésre vektorizált numpy segítségével, így a downstream vizualizáló kódja azonos.
A nyers mód az alapértelmezett a grafikus felületen, mert az USB átviteli teljesítménye a kötő korlát azokon a sebességeken, amelyeket a GenX320 elő tud állítani; válts feldolgozott módra, ha feldolgozási logikát kell beépítened a kamerán futó szkriptbe.