Multispektralna kamera s događajima

Modul multispektralne kamere s događajima kombinira GENX320 senzor događaja s 1 MP PAG7936 kolornim senzorom s globalnim zatvaračem na jednom modulu — sinkronizirani cjevovod za događaje i boju namijenjen brzom praćenju objekata, praćenju LED dioda, protoku fluida i drugim dinamičnim scenama.

Multispektralna kamera s događajima

Za potpunu tehničku dokumentaciju, fotografije i naručivanje pogledajte stranicu proizvoda Multispectral Event Camera.

Napomena

Podržano samo na OpenMV N6.

Istaknute značajke

  • 320x320 senzor događaja, >140 dB dinamičkog raspona, histogrami od 375 Hz+

  • PAG7936 boja: 1280x800 @ 120 FPS, 640x400 @ 240 FPS

  • Sinkronizirani vremenski žigovi događaja sa zajedničkim okidačem ekspozicije

  • Vidi ispod 5 luksa bez automatske ekspozicije

  • Potrošnja počinje od ~3 mW za prijenos događaja

  • Namijenjeno brzom praćenju, praćenju LED dioda te protoku fluida/čestica

Korištenje

Kolorni senzor i GENX320 senzor događaja svaki dobivaju vlastitu csi.CSI instancu. Prvi poziv prema zadanim postavkama koristi primarni senzor (PAG7936); drugi se veže na GENX320 prosljeđivanjem cid= csi.GENX320. Izvedite tvrdo resetiranje kolornog senzora pomoću csi.CSI.reset (hard=True) kako biste podigli napajanje, a GENX320 konfigurirajte s hard=False tako da njegov upravljački program samo ponovno programira čip bez ponovnog uključivanja reseta.

GENX320 daje izlaz 320x320 u histogramskom načinu rada; PAG7936 na csi.QVGA daje izlaz 320x200. Osnovni preklop u nastavku odsijeca donjih 120 redaka GENX320 sličice. Za prilagođeni preklop ili veću veličinu sličice PAG7936 koristite homografsku transformaciju (u nastavku).

Dva pomoćna međuspremnika ostaju konstantna kroz petlju sličica — paleta prozirnosti 256x1 pohranjena kao image.Image tako da histogramski pikseli na srednjesivoj osnovici (128) postaju prozirni, dok i isticanja ON-događaja i sjene OFF-događaja postaju neprozirni, te GENX320 međuspremnik slike unaprijed alociran pomoću image.Image tako da ga csi.CSI.snapshot (blocking=False, image=...) može popunjavati na mjestu u svakoj iteraciji bez ponovne alokacije:

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())

Svaka iteracija uzima blokirajuću kolornu snimku i neblokirajuću GENX320 snimku. Image.draw_image zatim slaže njih dvije: color_palette= image.PALETTE_EVT_LIGHT (ili image.PALETTE_EVT_DARK za tamnu pozadinu) preslikava GENX320 histogram u sivim tonovima u kolornu rampu, alpha_palette= miješa svaki piksel pomoću alfa mape u obliku slova v tako da mirne regije scene propuštaju kroz kolornu sliku, a hint= image.BILINEAR izglađuje povećanje kada kolorni senzor radi na većoj razlučivosti od GENX320.

Unaprijed postavljene vrijednosti biasa GENX320, AFK filtar, kalibracija vrućih piksela i ioctl-ovi STC filtra svi rade na isti način u ovoj postavci s dvije kamere — pozovite ih na csi1 nakon csi.CSI.reset. Pogledajte odjeljke u nastavku za detalje.

Poravnanje s GPU ubrzanjem

Image.draw_image prihvaća argument transform= — homografsku matricu 3x3 kao 2-D ulab.numpy polje. Na OpenMV N6 GPU izvodi projekciju po pikselu tijekom istog crtanja, pa se GENX320 sličica može ponovno poravnati prema perspektivi kolorne kamere bez zasebnog prolaza iskrivljenja — korisno kada dva senzora imaju malo različitu optiku ili vidno polje, ili kada kolorna kamera radi na većoj razlučivosti. Kalibrirajte matricu za svaku kameru pomoću alata GenX320 Overlay Calibration, koji prikazuje treperavu šahovnicu tako da senzor događaja proizvodi događaje u uglovima bez ikakvog fizičkog pomicanja:

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())

Ova varijanta pokreće kolornu kameru na csi.VGA (640x480), a GENX320 na njegovoj nativnoj razlučivosti 320x320 — homografija projicira manju GENX320 sličicu u veću kolornu sličicu kao dio crtanja, pa je faktor povećanja ugrađen u samu matricu umjesto da se primjenjuje zasebno.

Detalji kamere s događajima

GENX320 je senzor vida temeljen na događajima — umjesto očitavanja cijelog polja 320x320 na fiksnom taktu sličica, svaki piksel prijavljuje asinkrone „događaje” u trenutku kada otkrije promjenu svjetline. Svaki događaj nosi X/Y koordinatu, ON/OFF polaritet (svijetlo→tamno ili tamno→svijetlo) i vremenski žig u mikrosekundama. Odatle dolaze mikrosekundna vremenska preciznost senzora, izostanak zamućenja zbog pokreta, vrlo visok dinamički raspon i potrošnja energije skalirana prema aktivnosti. Statične scene ne generiraju podatke.

OpenMV ugrađeni program (firmware) izlaže GENX320 putem csi.CSI s cid= csi.GENX320. Dostupna su dva načina rada:

  • Histogramski način (zadani) — događaji se akumuliraju na čipu u spremnike po pikselu i prijavljuju kao sličica u sivim tonovima 320x320 pri podesivoj brzini (~20-350 FPS). Senzor se ponaša kao obična kamera, pa sve standardne rutine obrade slike (Image.find_blobs, palete itd.) rade izravno.

  • Način događaja — sirovi događaji prenose se u numpy ndarray s punim vremenskim žigovima u mikrosekundama, za primjene kojima je potreban vremenski detalj umjesto unaprijed razvrstane sličice.

Histogramski način

U histogramskom načinu GENX320 daje izlaz u sivim tonovima gdje svaki piksel kodira nedavnu aktivnost događaja na tom mjestu. Pikseli iznad osnovice svjetline su ON događaji (svjetlina raste), oni ispod su OFF događaji (svjetlina pada). Zadana osnovica svjetline je 128, a korak kontrasta po događaju je 16 — povećajte kontrast da bi se događaji isticali:

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 i csi.CSI.framerate tri su regulatora koja oblikuju histogramski izlaz.

Obojeni izlaz

Postavite csi.CSI.color_palette na image.PALETTE_EVT_LIGHT za svijetlu pozadinu ili na image.PALETTE_EVT_DARK za tamnu — upravljački program emitira RGB565 sličice koristeći paletu izravno:

csi0.color_palette(image.PALETTE_EVT_LIGHT)

Kalibracija vrućih piksela

Senzori događaja akumuliraju „vruće piksele” koji lažno okidaju. Pokrenite csi.IOCTL_GENX320_CALIBRATE nad statičnom scenom da ih onemogućite. Upravljački program izgrađuje broj pogodaka po pikselu 320x320, izračunava srednju vrijednost i standardnu devijaciju te onemogućuje svaki piksel čiji je broj iznad mean + sigma * stddev — nakon toga onemogućeni pikseli prestaju emitirati događaje na razini senzora.

Dva parametra upravljaju kalibracijom:

  • event_count — koliko događaja prebrojati prije izračuna statistike. Petlja hvata sličice dok tekući ukupni broj događaja ne prijeđe ovaj proračun. Veće vrijednosti daju pouzdaniju procjenu po cijenu dužeg vremena kalibracije. 10000 je razumna početna točka.

  • sigma — množitelj praga na standardnu devijaciju. Niže vrijednosti su agresivnije (više onemogućenih piksela); više vrijednosti su konzervativnije. 0.5 je dobra zadana vrijednost.

Prvo usmjerite senzor na statičnu scenu kako se događaji uzrokovani pokretom ne bi pribrojili pikselima koji su zapravo ispravni:

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")

Filtar protiv treperenja (AFK)

Periodični izvori svjetla (fluorescentni, zasloni s LED pozadinskim osvjetljenjem) generiraju ogromne količine suvišnih događaja. AFK filtar odbacuje događaje čiji piksel prebacuje stanje na frekvenciji unutar pojasa — omogućite ga putem csi.IOCTL_GENX320_SET_AFK s rubovima pojasa u hercima:

csi0.ioctl(csi.IOCTL_GENX320_SET_AFK, 1, 130, 160)  # 130-160 Hz
csi0.ioctl(csi.IOCTL_GENX320_SET_AFK, 0)            # disable

Unaprijed postavljene vrijednosti biasa

Svaki piksel u GenX320 pokreće analognu ulaznu stupnjeve s nekoliko podesivih biasa. Oni zajednički upravljaju osjetljivošću, šumom, propusnošću piksela i brzinom događaja — prava kombinacija ovisi o sceni. Pojedinačni biasi su:

  • DIFF_ON — pozitivni prag kontrasta komparatora. Piksel emitira ON događaj kada njegova logaritamska osvijetljenost poraste za ovoliko. Niže = osjetljivije na svijetle prijelaze.

  • DIFF_OFF — negativni prag kontrasta komparatora (simetrični parnjak za OFF događaje). Niže = osjetljivije na tamne prijelaze.

  • FO — niskopropusna granična frekvencija piksela. Više = šira propusnost piksela (brži odziv, niže kašnjenje) ali više aktivnosti pozadinskog šuma.

  • HPF — visokopropusna granična frekvencija. Više = snažnije odbacivanje sporih promjena svjetline; samo brzi prijelazi dopiru do komparatora. Korisno za zanemarivanje ambijentalnog odmicanja.

  • REFR — refraktorno razdoblje. Nakon što piksel okine, ostaje u resetu ovoliko dugo prije nego što ponovno može okinuti. Više = duže mrtvo vrijeme, korisno za ograničavanje brzine događaja po pikselu.

Nakon csi.CSI.reset upravljački program primjenjuje csi.GENX320_BIASES_LOW_NOISE, a ne csi.GENX320_BIASES_DEFAULT — zadane vrijednosti iz tehničke dokumentacije emitiraju znatno višu brzinu pozadinskih događaja, pa se LOW_NOISE koristi kao početna točka kako bi se prijenos održao tihim. Pozovite csi.IOCTL_GENX320_SET_BIASES s drugačijom unaprijed postavljenom vrijednošću kada primjena treba veću osjetljivost ili propusnost.

csi.IOCTL_GENX320_SET_BIASES primjenjuje jednu od pet unaprijed postavljenih vrijednosti:

  • csi.GENX320_BIASES_DEFAULT — zadane vrijednosti iz GenX320 tehničke dokumentacije. Uravnotežena osjetljivost, šum i propusnost za opće scene.

  • csi.GENX320_BIASES_LOW_LIGHT — oba praga kontrasta olabavljena za veću osjetljivost, FO snižen kako bi se šum držao niskim, a HPF postavljen na 0 tako da se spore promjene svjetline i dalje registriraju — scena slabog osvjetljenja sama po sebi generira malo događaja, pa želimo da ih što više prođe.

  • csi.GENX320_BIASES_ACTIVE_MARKER — podešeno za praćenje trepćućih LED dioda visokog kontrasta. Pragovi kontrasta podignuti tako da okidaju samo oštri prijelazi; FO i HPF maksimalno povišeni kako bi se maksimizirala propusnost piksela i odbacilo svako sporo ambijentalno odmicanje; REFR svučen na 0 tako da se svaki rub treptaja hvata jedan za drugim. Rezultat: prijenos koji je gotovo sav od LED rubova, jednostavan za praćenje.

  • csi.GENX320_BIASES_LOW_NOISE — zadana vrijednost upravljačkog programa. Oba praga kontrasta podignuta u odnosu na DEFAULT (manje osjetljivo) i FO snižen (sporiji piksel = tiši piksel). Najbolje za statične ili spore scene gdje bi lažni događaji inače prevladali.

  • csi.GENX320_BIASES_HIGH_SPEED — FO povišen tako da svaki piksel može brže reagirati, HPF podignut radi odbacivanja sporog odmicanja svjetline, a REFR podignut tako da jedan brzo pokretni rub ne preplavi očitavanje — duže mrtvo vrijeme drži količinu događaja ograničenom pri snažnom pokretu.

Nadjačajte pojedinačne biase s csi.IOCTL_GENX320_SET_BIAS plus jednom od csi.GENX320_BIAS_DIFF_ON, csi.GENX320_BIAS_DIFF_OFF, csi.GENX320_BIAS_FO, csi.GENX320_BIAS_HPF ili csi.GENX320_BIAS_REFR i DAC vrijednošću. Svaki bias se postavlja neovisno — odaberite unaprijed postavljenu vrijednost kao početnu točku, zatim podesite koje god biase vaša scena treba:

csi0.ioctl(csi.IOCTL_GENX320_SET_BIASES, csi.GENX320_BIASES_LOW_LIGHT)
csi0.ioctl(csi.IOCTL_GENX320_SET_BIAS, csi.GENX320_BIAS_HPF, 20)

Praćenje

Budući da je izlaz histogramskog načina samo slika u sivim tonovima, uobičajeno praćenje mrlja radi izravno. Za praćenje LED diode aktivnog markera, učitajte unaprijed postavljenu vrijednost biasa za aktivni marker i pronađite mrlje na svijetlom kraju histograma:

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())

Način događaja

Način događaja zaobilazi histogram na čipu i prenosi sirove događaje u numpy ndarray. Svaki događaj je redak od šest uint16 stupaca:

  • [0] tip događaja — pogledajte u nastavku

  • [1] vremenski žig u sekundama

  • [2] vremenski žig u milisekundama

  • [3] vremenski žig u mikrosekundama

  • [4] X koordinata, 0-319

  • [5] Y koordinata, 0-319

Upravljački program emitira šest tipova događaja u stupcu [0]:

  • csi.PIX_OFF_EVENT — piksel je otkrio smanjenje svjetline (prijeđen je prag komparatora DIFF_OFF). X/Y pokazuju na piksel koji je okinuo.

  • csi.PIX_ON_EVENT — piksel je otkrio povećanje svjetline (prijeđen je prag DIFF_ON). X/Y pokazuju na piksel.

  • csi.EXT_TRIGGER_FALLING — vanjski okidački pin senzora vidio je padajući rub. X/Y se ne koriste.

  • csi.EXT_TRIGGER_RISING — vanjski okidački pin senzora vidio je rastući rub. X/Y se ne koriste.

  • csi.RST_TRIGGER_FALLING — okidač resetiranja piksela, padajući rub. X/Y se ne koriste. Trenutno ga ugrađeni program ne generira.

  • csi.RST_TRIGGER_RISING — okidač resetiranja piksela, rastući rub. X/Y se ne koriste. Trenutno ga ugrađeni program ne generira.

Vanjski okidački ulaz GENX320 ožičen je na liniju sinkronizacije sličica kamere, koja je također usmjerena na P10 na procesoru i na zaglavlju pinova — pobuđujte P10 da biste ubrizgali sinkronizacijske rubove u tok događaja i pokupili ih kao EXT_TRIGGER_RISING / EXT_TRIGGER_FALLING događaje uz podatke piksela.

Većini primjena stalo je samo do PIX_OFF_EVENT i PIX_ON_EVENT; okidački tipovi omogućuju vam da korelirate događaje s vanjskim vremenskim signalima.

Alocirajte međuspremnik događaja s oblikom (EVT_res, 6) gdje je EVT_res potencija broja dva između 1024 i 65536, zatim uđite u način događaja putem csi.IOCTL_GENX320_SET_MODE s csi.GENX320_MODE_EVENT i veličinom međuspremnika. Čitajte događaje pomoću csi.IOCTL_GENX320_READ_EVENTS, koji puni međuspremnik do njegovog kapaciteta i vraća broj valjanih redaka.

Image.draw_event_histogram rasterizira događaje u sliku u sivim tonovima — za svaki ON događaj dodaje contrast u spremnik; za svaki OFF događaj oduzima. clear=True najprije resetira sliku na brightness; clear=False akumulira kroz mnogo poziva:

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())

Unaprijed postavljene vrijednosti biasa histogramskog načina, AFK filtar i ioctl-ovi kalibracije vrućih piksela svi rade na isti način u načinu događaja — pozovite ih nakon csi.IOCTL_GENX320_SET_MODE.

Filtriranje po polaritetu

Izrežite polje događaja pomoću ulab kako biste zadržali samo ON događaje (pokret u svjetlije stanje) ili samo OFF događaje:

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)

Akumulacija duge ekspozicije

Postavite clear=False kako biste nastavili slagati događaje u istu sliku kroz mnogo sličica — rezultat je vizualizacija traga pokreta. Periodički resetirajte za pokretanje nove ekspozicije:

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

Brza obrada

Izbacite vizualizaciju kako biste oslobodili CPU za obradu događaja. Ispisujte statistiku samo svaku N-tu iteraciju — guranje retka ispisa u svakoj iteraciji postaje usko grlo pri visokim brzinama događaja:

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")

Prostorno-vremenski filtar kontrasta (STC)

Stvarni pokretni rub kontrasta obično pokrene šumoviti rafal događaja na istom pikselu unutar kratkog vremenskog prozora — neslaganje piksela i analogni šum proizvode dodatne događaje oko stvarnog prijelaza koji nisu korisni primjeni. STC filtar je naknadna obrada na čipu koja zadržava samo jedan (ili nekoliko) događaja po rafalu i odbacuje ostale.

Implementira tri strategije, odabrane putem csi.IOCTL_GENX320_SET_STC i konstante GENX320_STC_*. Svaki način definiran je time koje događaje prosljeđuje iz rafala:

Način

Zadržava

Odbacuje

csi.GENX320_STC_DISABLE

svaki događaj

ništa

csi.GENX320_STC_ONLY

drugi događaj rafala

prvi + kasnije događaje

csi.GENX320_STC_TRAIL_ONLY

prvi događaj rafala

naredne događaje

csi.GENX320_STC_TRAIL

prvi + naredne rubove

samo suvišan šum

Detaljno:

  • csi.GENX320_STC_DISABLE — filtar isključen, svaki događaj prolazi (zadano).

  • csi.GENX320_STC_ONLY — zadržava drugi događaj rafala. Parametar: stc_threshold (ms). Ako novi događaj na pikselu stigne unutar stc_threshold od prethodnog događaja, smatra se „drugim” rafala i prosljeđuje se — prvi događaj i svi naredni događaji u istom rafalu se filtriraju. Najbolje kada želite šumom potvrđeni prijelaz umjesto samog prvog pogotka.

  • csi.GENX320_STC_TRAIL_ONLY — zadržava prvi događaj rafala. Parametar: trail_threshold (ms). Nakon što piksel okine, naredni događaji na istom pikselu se odbacuju dok ne protekne trail_threshold. Čuva preciznu vremensku usklađenost vodećeg ruba — korisno kada je trenutak prebacivanja polariteta važniji od potvrde rafala.

  • csi.GENX320_STC_TRAIL — kombinira oboje. Parametri: stc_threshold i trail_threshold (oba u ms). Zadržava vodeći rub prema načinu Trail plus naredne rubove prema načinu STC, tako da više događaja iz rafala i dalje prolazi — viša propusnost događaja od filtara s jednim načinom, ali najbogatiji signal.

Dva praga moraju ostati unutar otprilike omjera 13:1 — senzor odbacuje konfiguracije gdje je jedan više od ~13x veći od drugog:

csi0.ioctl(csi.IOCTL_GENX320_SET_STC, csi.GENX320_STC_TRAIL, 1, 2)
csi0.ioctl(csi.IOCTL_GENX320_SET_STC, csi.GENX320_STC_DISABLE)

Dubina međuspremnika

Kada brzine događaja naglo skoče, zadani trostruki cjevovod međuspremnika daje prednost najnovijoj sličici i odbacuje stare. Povećajte dubinu FIFO-a putem csi.CSI.framebuffers kako biste umjesto toga stavili događaje u red — po cijenu obrade nešto starijih podataka kada domaćin zaostane:

csi0.framebuffers(10)  # FIFO depth, > 3 enables queueing

Streaming i vizualizacija na računalu

Za vizualizaciju u stvarnom vremenu u GUI-ju na računalu domaćinu, alat GenX320 Event Streaming u repozitoriju openmv-projects uparuje kameru s DearPyGui sučeljem. GUI na računalu pokreće dvije vizualizacije jednu pokraj druge: platno akumulacije događaja (ista ideja kao Image.draw_event_histogram ali s odabirom paleta i načinima kliznog prozora odn. automatskog brisanja) i frekvencijsku mapu po pikselu pogonjenu IIR pojasnopropusnim filtrom — korisno za uočavanje periodičnih signala (rotirajući ventilatori, trepćuće LED diode itd.) izravno u toku događaja.

Isporučuje dvije skripte za streaming na kameri:

  • Obrađeni način (genx320_event_mode_streaming_on_cam.py) — kamera dekodira događaje pomoću csi.IOCTL_GENX320_READ_EVENTS i prenosi svaki redak kao 12 bajtova preko USB-a ([0] tip, [1] sek, [2] ms, [3] us, [4] x, [5] y). Lako se konzumira na računalu jer žičani format odgovara formatu ndarray na kameri.

  • Sirovi način (genx320_raw_event_mode_streaming_on_cam.py) — kamera prenosi nativne 32-bitne pakirane riječi događaja čipa putem csi.IOCTL_GENX320_READ_EVENTS_RAW. To je 4 bajta po događaju naspram 12 u obrađenom načinu (otprilike 3x manje podataka preko USB-a), pa ~3x viša ostvariva brzina događaja kada je veza usko grlo. Računalo dekodira pakirane riječi natrag u isti raspored događaja sa 6 stupaca koristeći vektorizirani numpy, tako da je kod nizvodnog vizualizatora identičan.

Sirovi način je zadani u GUI-ju jer je propusnost USB-a vezujuće ograničenje pri brzinama koje GenX320 može proizvesti; prebacite se na obrađeni način ako trebate priključiti logiku obrade u skriptu na kameri.