Kamera Event Multispektral

Modul Kamera Event Multispektral memadukan sensor event GENX320 dengan sensor warna global-shutter 1 MP PAG7936 dalam satu modul — pipeline event + warna yang tersinkronisasi untuk pelacakan objek kecepatan tinggi, pelacakan LED, aliran fluida, dan adegan dinamis lainnya.

Multispectral Event Camera

Untuk datasheet lengkap, foto, dan pemesanan, lihat halaman produk Multispectral Event Camera.

Catatan

Hanya didukung pada OpenMV N6.

Fitur Unggulan

  • Sensor event 320x320, rentang dinamis >140 dB, histogram 375 Hz+

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

  • Timestamp event tersinkronisasi dengan trigger eksposur bersama

  • Mampu melihat di bawah 5 lux tanpa auto-exposure

  • Konsumsi daya mulai dari ~3 mW untuk streaming event

  • Ditujukan untuk pelacakan kecepatan tinggi, pelacakan LED, dan aliran fluida/partikel

Penggunaan

Sensor warna dan sensor event GENX320 masing-masing mendapatkan instans csi.CSI tersendiri. Pemanggilan pertama secara default menggunakan sensor utama (PAG7936); yang kedua mengikat ke GENX320 dengan memberikan cid= csi.GENX320. Reset keras sensor warna dengan csi.CSI.reset (hard=True) untuk menghidupkan rail, dan konfigurasikan GENX320 dengan hard=False agar drivernya hanya memprogram ulang chip tanpa mengubah kembali status reset.

GENX320 menghasilkan output 320x320 dalam mode histogram; PAG7936 pada csi.QVGA menghasilkan 320x200. Overlay dasar di bawah ini memotong 120 baris bawah dari bingkai GENX320. Gunakan transformasi homografi (di bawah) untuk overlay yang lebih presisi atau ukuran bingkai PAG7936 yang lebih besar.

Dua buffer sementara tetap konstan selama loop bingkai — sebuah palet alfa 256x1 yang disimpan sebagai image.Image sehingga piksel histogram pada garis dasar abu-abu tengah (128) menjadi transparan sedangkan sorotan event ON dan bayangan event OFF menjadi buram, serta sebuah buffer bingkai GENX320 yang dialokasikan sebelumnya dengan image.Image agar csi.CSI.snapshot (blocking=False, image=...) dapat mengisinya langsung di setiap iterasi tanpa realokasi:

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

Setiap iterasi mengambil snapshot warna yang memblokir dan snapshot GENX320 yang tidak memblokir. Image.draw_image kemudian menggabungkan keduanya: color_palette= image.PALETTE_EVT_LIGHT (atau image.PALETTE_EVT_DARK untuk latar belakang gelap) memetakan histogram skala abu-abu GENX320 ke ramp warna, alpha_palette= memadukan setiap piksel menggunakan peta alfa berbentuk-V sehingga area adegan yang tenang menembus ke citra warna, dan hint= image.BILINEAR memperhalus upscale saat sensor warna berjalan pada resolusi lebih tinggi dari GENX320.

Preset bias GENX320, filter AFK, kalibrasi piksel panas, dan ioctl filter STC semuanya bekerja dengan cara yang sama dalam pengaturan kamera ganda ini — panggil mereka pada csi1 setelah csi.CSI.reset. Lihat bagian di bawah untuk detailnya.

Penyelarasan dengan akselerasi GPU

Image.draw_image menerima argumen transform= — sebuah matriks homografi 3x3 sebagai array ulab.numpy 2-D. Pada OpenMV N6, GPU menjalankan proyeksi per-piksel selama draw yang sama, sehingga bingkai GENX320 dapat disejajarkan kembali terhadap perspektif kamera warna tanpa pass warp terpisah — berguna ketika kedua sensor memiliki optik atau medan pandang yang sedikit berbeda, atau ketika kamera warna berjalan pada resolusi lebih tinggi. Kalibrasi matriks per kamera menggunakan alat Kalibrasi Overlay GenX320, yang menampilkan checkerboard berkedip agar sensor event menghasilkan event sudut tanpa pergerakan fisik apapun:

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

Varian ini menjalankan kamera warna pada csi.VGA (640x480) dan GENX320 pada resolusi aslinya 320x320 — homografi memproyeksikan bingkai GENX320 yang lebih kecil ke dalam bingkai warna yang lebih besar sebagai bagian dari draw, sehingga faktor upscale sudah tertanam dalam matriks itu sendiri daripada diterapkan secara terpisah.

Detail kamera event

GENX320 adalah sensor visi berbasis event — alih-alih membaca seluruh array 320x320 pada clock bingkai tetap, setiap piksel melaporkan "event" secara asinkron pada saat mendeteksi perubahan kecerahan. Setiap event membawa koordinat X/Y, polaritas ON/OFF (terang→gelap atau gelap→terang), dan timestamp dalam mikrodetik. Itulah sumber dari presisi temporal mikrodetik sensor, ketiadaan motion blur, rentang dinamis sangat tinggi, dan konsumsi daya yang berskala sesuai aktivitas. Adegan statis tidak menghasilkan data.

Firmware OpenMV mengekspos GENX320 melalui csi.CSI dengan cid= csi.GENX320. Dua mode operasi tersedia:

  • Mode Histogram (default) — event diakumulasikan di chip ke dalam bin per-piksel dan dilaporkan sebagai bingkai skala abu-abu 320x320 pada laju yang dapat dikonfigurasi (~20-350 FPS). Sensor berperilaku seperti kamera biasa, sehingga semua rutinitas pemrosesan citra standar (Image.find_blobs, palet, dll.) bekerja langsung.

  • Mode Event — event mentah dialirkan ke dalam numpy ndarray dengan timestamp mikrodetik penuh, untuk aplikasi yang membutuhkan detail temporal daripada bingkai yang sudah dibin sebelumnya.

Mode Histogram

Dalam mode histogram, GENX320 menghasilkan bingkai skala abu-abu di mana setiap piksel mengkodekan aktivitas event terbaru di lokasi tersebut. Piksel di atas garis dasar kecerahan adalah event ON (kecerahan meningkat), di bawah adalah event OFF (kecerahan menurun). Kecerahan garis dasar default adalah 128 dan langkah kontras per-event adalah 16 — naikkan kontras untuk membuat event lebih menonjol:

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, dan csi.CSI.framerate adalah tiga kontrol yang membentuk output histogram.

Output berwarna

Atur csi.CSI.color_palette ke image.PALETTE_EVT_LIGHT untuk latar belakang terang atau image.PALETTE_EVT_DARK untuk latar belakang gelap — driver menghasilkan bingkai RGB565 menggunakan palet secara langsung:

csi0.color_palette(image.PALETTE_EVT_LIGHT)

Kalibrasi piksel panas

Sensor event mengakumulasi "piksel panas" yang memicu secara tidak sengaja. Jalankan csi.IOCTL_GENX320_CALIBRATE terhadap adegan statis untuk menonaktifkannya. Driver membuat hitungan tumbukan per-piksel 320x320, menghitung rata-rata dan deviasi standar, dan menonaktifkan piksel yang hitungannya melebihi mean + sigma * stddev — kemudian piksel yang dinonaktifkan berhenti menghasilkan event di tingkat sensor.

Dua parameter mengontrol kalibrasi:

  • event_count — berapa banyak event yang dihitung sebelum menghitung statistik. Loop menangkap bingkai hingga total event yang berjalan mencapai batas ini. Hitungan yang lebih tinggi memberikan estimasi yang lebih andal dengan biaya waktu kalibrasi yang lebih lama. 10000 adalah titik awal yang wajar.

  • sigma — pengali ambang batas pada deviasi standar. Nilai lebih rendah lebih agresif (lebih banyak piksel dinonaktifkan); nilai lebih tinggi lebih konservatif. 0.5 adalah default yang baik.

Arahkan sensor ke adegan statis terlebih dahulu agar event yang didorong gerakan tidak dihitung terhadap piksel yang sebenarnya baik-baik saja:

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

Filter Anti-flicker (AFK)

Sumber cahaya periodik (fluoresen, layar berbasis LED) menghasilkan volume besar event yang redundan. Filter AFK menolak event yang pikselnya bertogle pada frekuensi dalam suatu band — aktifkan melalui csi.IOCTL_GENX320_SET_AFK dengan tepi band dalam hertz:

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

Preset bias

Setiap piksel dalam GenX320 menjalankan front-end analog dengan beberapa bias yang dapat dikonfigurasi. Mereka secara bersama mengatur sensitivitas, noise, bandwidth piksel, dan laju event — kombinasi yang tepat bergantung pada adegan. Bias individual adalah:

  • DIFF_ON — ambang batas kontras komparator positif. Sebuah piksel menghasilkan event ON ketika iluminasi logaritmiknya telah naik sebesar ini. Lebih rendah = lebih sensitif terhadap transisi terang.

  • DIFF_OFF — ambang batas kontras komparator negatif (mitra simetris untuk event OFF). Lebih rendah = lebih sensitif terhadap transisi gelap.

  • FO — frekuensi cut-off low-pass piksel. Lebih tinggi = bandwidth piksel lebih lebar (respons lebih cepat, latensi lebih rendah) tetapi lebih banyak aktivitas noise latar belakang.

  • HPF — frekuensi cut-off high-pass. Lebih tinggi = penolakan perubahan kecerahan lambat yang lebih kuat; hanya transisi cepat yang mencapai komparator. Berguna untuk mengabaikan pergeseran ambien.

  • REFR — periode refrakter. Setelah piksel memicu, piksel tersebut tetap dalam reset selama ini sebelum dapat memicu lagi. Lebih tinggi = dead time lebih lama, berguna untuk membatasi laju event per-piksel.

Setelah csi.CSI.reset, driver menerapkan csi.GENX320_BIASES_LOW_NOISE, bukan csi.GENX320_BIASES_DEFAULT — default datasheet menghasilkan laju event latar belakang yang jauh lebih tinggi, sehingga LOW_NOISE digunakan sebagai titik awal untuk menjaga aliran tetap tenang. Panggil csi.IOCTL_GENX320_SET_BIASES dengan preset berbeda ketika aplikasi membutuhkan lebih banyak sensitivitas atau bandwidth.

csi.IOCTL_GENX320_SET_BIASES menerapkan salah satu dari lima preset:

  • csi.GENX320_BIASES_DEFAULT — default datasheet GenX320. Sensitivitas, noise, dan bandwidth yang seimbang untuk adegan umum.

  • csi.GENX320_BIASES_LOW_LIGHT — kedua ambang batas kontras dilonggarkan untuk sensitivitas lebih tinggi, FO diturunkan untuk menjaga noise tetap rendah, dan HPF diatur ke 0 sehingga perubahan kecerahan lambat tetap teregistrasi — adegan cahaya rendah menghasilkan sedikit event sendiri, jadi kita ingin sebanyak mungkin event yang masuk.

  • csi.GENX320_BIASES_ACTIVE_MARKER — disetel untuk melacak LED berkedip berkontras tinggi. Ambang batas kontras dinaikkan sehingga hanya transisi tajam yang memicu; FO dan HPF dioptimalkan tinggi untuk memaksimalkan bandwidth piksel dan menolak pergeseran ambien lambat; REFR ditarik ke 0 sehingga setiap tepi kedipan ditangkap berturut-turut. Hasilnya: aliran yang hampir seluruhnya berisi tepi LED, mudah dilacak.

  • csi.GENX320_BIASES_LOW_NOISE — default driver. Kedua ambang batas kontras dinaikkan vs. DEFAULT (kurang sensitif) dan FO diturunkan (piksel lebih lambat = piksel lebih tenang). Terbaik untuk adegan statis atau lambat di mana false event dapat mendominasi.

  • csi.GENX320_BIASES_HIGH_SPEED — FO dinaikkan agar setiap piksel dapat merespons lebih cepat, HPF dinaikkan untuk menolak pergeseran kecerahan lambat, dan REFR dinaikkan agar tepi bergerak cepat yang tunggal tidak membanjiri readout — dead time yang lebih lama menjaga volume event tetap terbatas di bawah gerakan berat.

Override bias individual dengan csi.IOCTL_GENX320_SET_BIAS ditambah salah satu dari csi.GENX320_BIAS_DIFF_ON, csi.GENX320_BIAS_DIFF_OFF, csi.GENX320_BIAS_FO, csi.GENX320_BIAS_HPF, atau csi.GENX320_BIAS_REFR dan nilai DAC. Setiap bias diatur secara independen — pilih preset sebagai titik awal, lalu sesuaikan bias yang dibutuhkan adegan Anda:

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

Pelacakan

Karena output mode histogram hanyalah citra skala abu-abu, pelacakan blob biasa bekerja langsung. Untuk melacak LED active-marker, muat preset bias active-marker dan temukan blob di ujung terang histogram:

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

Mode Event

Mode event melewati histogram on-chip dan mengalirkan event mentah ke dalam numpy ndarray. Setiap event adalah baris dari enam kolom uint16:

  • [0] tipe event — lihat di bawah

  • [1] timestamp detik

  • [2] timestamp milidetik

  • [3] timestamp mikrodetik

  • [4] koordinat X, 0-319

  • [5] koordinat Y, 0-319

Driver menghasilkan enam tipe event di kolom [0]:

  • csi.PIX_OFF_EVENT — sebuah piksel mendeteksi penurunan kecerahan (ambang batas komparator DIFF_OFF terlewati). X/Y menunjuk ke piksel yang memicu.

  • csi.PIX_ON_EVENT — sebuah piksel mendeteksi peningkatan kecerahan (ambang batas DIFF_ON terlewati). X/Y menunjuk ke piksel.

  • csi.EXT_TRIGGER_FALLING — pin trigger eksternal sensor melihat tepi turun. X/Y tidak digunakan.

  • csi.EXT_TRIGGER_RISING — pin trigger eksternal sensor melihat tepi naik. X/Y tidak digunakan.

  • csi.RST_TRIGGER_FALLING — trigger reset piksel, tepi turun. X/Y tidak digunakan. Tidak dihasilkan oleh firmware saat ini.

  • csi.RST_TRIGGER_RISING — trigger reset piksel, tepi naik. X/Y tidak digunakan. Tidak dihasilkan oleh firmware saat ini.

Input trigger eksternal GENX320 dihubungkan ke jalur frame-sync kamera, yang juga dirouting ke P10 pada prosesor maupun header pin — drive P10 untuk menyuntikkan tepi sinkronisasi ke dalam aliran event dan ambil sebagai event EXT_TRIGGER_RISING / EXT_TRIGGER_FALLING bersama data piksel.

Sebagian besar aplikasi hanya peduli dengan PIX_OFF_EVENT dan PIX_ON_EVENT; tipe trigger memungkinkan Anda mengkorelasikan event dengan sinyal timing eksternal.

Alokasikan buffer event dengan bentuk (EVT_res, 6) di mana EVT_res adalah pangkat dua antara 1024 dan 65536, kemudian masuk ke mode event melalui csi.IOCTL_GENX320_SET_MODE dengan csi.GENX320_MODE_EVENT dan ukuran buffer. Baca event dengan csi.IOCTL_GENX320_READ_EVENTS, yang mengisi buffer hingga kapasitasnya dan mengembalikan jumlah baris yang valid.

Image.draw_event_histogram merasterisasi event ke dalam citra skala abu-abu — untuk setiap event ON, ia menambahkan contrast ke bin; untuk setiap event OFF, ia mengurangi. clear=True mereset citra ke brightness terlebih dahulu; clear=False mengakumulasikan selama banyak pemanggilan:

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

Preset bias mode histogram, filter AFK, dan ioctl kalibrasi piksel panas semuanya bekerja dengan cara yang sama dalam mode event — panggil mereka setelah csi.IOCTL_GENX320_SET_MODE.

Pemfilteran berdasarkan polaritas

Iris array event dengan ulab untuk menyimpan hanya event ON (gerakan menuju kondisi lebih terang) atau hanya event 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)

Akumulasi eksposur panjang

Atur clear=False untuk terus menumpuk event ke dalam citra yang sama selama banyak bingkai — hasilnya adalah visualisasi jejak gerakan. Reset secara berkala untuk memulai eksposur baru:

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

Pemrosesan kecepatan tinggi

Hapus visualisasi untuk membebaskan CPU untuk pemrosesan event. Cetak statistik hanya setiap iterasi ke-N — mendorong baris print pada setiap iterasi menjadi bottleneck pada laju event tinggi:

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

Filter Spatio-temporal contrast (STC)

Tepi kontras yang benar-benar bergerak cenderung memicu burst event yang bising pada piksel yang sama dalam jendela waktu singkat — ketidakcocokan piksel dan noise analog menghasilkan event tambahan di sekitar transisi asli yang tidak berguna bagi aplikasi. Filter STC adalah post-process on-chip yang hanya menyimpan satu (atau beberapa) event per burst dan membuang sisanya.

Filter ini mengimplementasikan tiga strategi, dipilih melalui csi.IOCTL_GENX320_SET_STC dan konstanta GENX320_STC_*. Setiap mode didefinisikan oleh event mana yang diteruskan dari sebuah burst:

Mode

Menyimpan

Membuang

csi.GENX320_STC_DISABLE

setiap event

tidak ada

csi.GENX320_STC_ONLY

event kedua dari sebuah burst

event pertama + event berikutnya

csi.GENX320_STC_TRAIL_ONLY

event pertama dari sebuah burst

event selanjutnya

csi.GENX320_STC_TRAIL

tepi pertama + tepi berikutnya

hanya noise redundan

Secara rinci:

  • csi.GENX320_STC_DISABLE — filter mati, setiap event melewati (default).

  • csi.GENX320_STC_ONLY — menyimpan event kedua dari sebuah burst. Parameter: stc_threshold (ms). Jika event baru pada sebuah piksel tiba dalam stc_threshold dari event sebelumnya, event tersebut dianggap "kedua" dari sebuah burst dan diteruskan — event pertama dan event berikutnya dalam burst yang sama difilter keluar. Terbaik saat Anda menginginkan transisi yang dikonfirmasi noise daripada hit pertama.

  • csi.GENX320_STC_TRAIL_ONLY — menyimpan event pertama dari sebuah burst. Parameter: trail_threshold (ms). Setelah sebuah piksel memicu, event berikutnya pada piksel yang sama dibuang hingga trail_threshold telah berlalu. Mempertahankan timing tepat dari tepi terdepan — berguna ketika momen pergantian polaritas lebih penting daripada konfirmasi burst.

  • csi.GENX320_STC_TRAIL — menggabungkan keduanya. Parameter: stc_threshold dan trail_threshold (keduanya ms). Menyimpan tepi terdepan per mode Trail ditambah tepi berikutnya per mode STC, sehingga beberapa event dari sebuah burst tetap masuk — throughput event lebih tinggi dari filter mode tunggal tetapi sinyal paling kaya.

Kedua ambang batas harus tetap dalam rasio sekitar 13:1 — sensor menolak konfigurasi di mana salah satunya lebih dari ~13x yang lain:

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

Kedalaman buffer

Ketika laju event melonjak, pipeline triple-buffer default mengutamakan bingkai terbaru dan membuang yang lama. Naikkan kedalaman FIFO melalui csi.CSI.framebuffers untuk mengantrekan event sebagai gantinya — dengan biaya memproses data yang sedikit lebih lama ketika host tertinggal:

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

Streaming desktop dan visualisasi

Untuk visualisasi GUI real-time pada PC host, alat GenX320 Event Streaming di repo openmv-projects memadukan kamera dengan front-end DearPyGui. GUI PC menjalankan dua visualisasi berdampingan: kanvas akumulasi event (konsep yang sama dengan Image.draw_event_histogram tetapi dengan palet yang dapat dipilih dan mode sliding-window vs. auto-clear) dan peta frekuensi per-piksel yang digerakkan oleh filter band-pass IIR — berguna untuk mendeteksi sinyal periodik (kipas berputar, LED berkedip, dll.) langsung dalam aliran event.

Aplikasi ini dilengkapi dua skrip streaming on-cam:

  • Mode Processed (genx320_event_mode_streaming_on_cam.py) — kamera mendekode event dengan csi.IOCTL_GENX320_READ_EVENTS dan mengalirkan setiap baris sebagai 12 byte melalui USB ([0] tipe, [1] detik, [2] ms, [3] us, [4] x, [5] y). Mudah dikonsumsi di PC karena format kabel cocok dengan format ndarray on-cam.

  • Mode Raw (genx320_raw_event_mode_streaming_on_cam.py) — kamera mengalirkan kata event 32-bit terpaket asli chip melalui csi.IOCTL_GENX320_READ_EVENTS_RAW. Itu 4 byte per event versus 12 dalam mode processed (sekitar 3x lebih sedikit data melalui USB), sehingga laju event yang dapat dicapai ~3x lebih tinggi saat link menjadi bottleneck. PC mendekode kata terpaket kembali ke layout event 6-kolom yang sama menggunakan numpy tervektorisasi, sehingga kode visualizer downstream identik.

Mode Raw adalah default dalam GUI karena throughput USB adalah batasan utama pada laju yang dapat dihasilkan GenX320; beralih ke mode processed jika Anda perlu menyambungkan logika pemrosesan ke skrip on-cam.