Kamera Event GENX320

Modul Kamera Event GENX320 adalah sensor visi berbasis event dari Prophesee dengan resolusi 320x320 dan presisi temporal skala mikrodetik.

Kamera Event GENX320

Untuk datasheet lengkap, foto, dan pemesanan lihat halaman produk Kamera Event GENX320.

Catatan

Didukung pada OpenMV H7 Plus, RT1062, dan N6.

Fitur Unggulan

  • Sensor visi berbasis event 320x320

  • Rentang dinamis 140 dB, tanpa motion blur

  • Laju keluaran histogram event 375 Hz+

  • Daya yang digunakan sesuai aktivitas pemandangan — mulai dari ~3 mW

  • Beroperasi dari <5 lux hingga sinar matahari terang tanpa auto-eksposur

  • Menghasilkan bingkai skala abu-abu atau aliran event mentah

Penggunaan

GENX320 adalah sensor visi berbasis event — alih-alih membaca seluruh array 320x320 pada clock bingkai tetap, setiap piksel melaporkan "event" asinkron secara langsung saat mendeteksi perubahan kecerahan. Setiap event membawa koordinat X/Y, polaritas ON/OFF (terang→gelap atau gelap→terang), dan timestamp mikrodetik. Itulah sumber presisi temporal skala mikrodetik sensor ini, ketiadaan motion blur, rentang dinamis yang sangat tinggi, dan konsumsi daya yang disesuaikan aktivitas. Pemandangan 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 ndarray numpy dengan timestamp mikrodetik penuh, untuk aplikasi yang membutuhkan detail temporal daripada bingkai yang sudah di-bin.

Mode histogram

Dalam mode histogram, GENX320 menghasilkan bingkai skala abu-abu di mana setiap piksel mengenkode aktivitas event terkini di lokasi tersebut. Piksel di atas kecerahan dasar adalah event ON (kecerahan naik), di bawah adalah event OFF (kecerahan turun). Kecerahan 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 pengatur yang membentuk keluaran histogram.

Keluaran 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 hot-pixel

Sensor event mengakumulasi "hot pixel" yang menyala secara tidak wajar. Jalankan csi.IOCTL_GENX320_CALIBRATE terhadap pemandangan statis untuk menonaktifkannya. Driver membangun hitungan per-piksel 320x320, menghitung rata-rata dan deviasi standar, lalu menonaktifkan piksel yang hitungannya di atas mean + sigma * stddev — 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 kumulatif melewati anggaran ini. Nilai 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 pemandangan statis terlebih dahulu agar event yang dihasilkan oleh 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 berubah pada frekuensi dalam sebuah pita — aktifkan melalui csi.IOCTL_GENX320_SET_AFK dengan tepi pita 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. Secara bersama mereka mengatur sensitivitas, noise, bandwidth piksel, dan laju event — kombinasi yang tepat tergantung pada pemandangan. Bias individual adalah:

  • DIFF_ON — ambang batas kontras komparator positif. Piksel menghasilkan event ON ketika log-iluminasinya telah naik sebanyak ini. Lebih rendah = lebih sensitif terhadap transisi terang.

  • DIFF_OFF — ambang batas kontras komparator negatif (padanan 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 lebih kuat terhadap perubahan kecerahan lambat; hanya transisi cepat yang mencapai komparator. Berguna untuk mengabaikan pergeseran ambient.

  • REFR — periode refrakter. Setelah piksel aktif, piksel tetap dalam reset selama ini sebelum dapat aktif lagi. Lebih tinggi = waktu mati 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 seimbang untuk pemandangan umum.

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

  • csi.GENX320_BIASES_ACTIVE_MARKER — disetel untuk melacak LED berkedip kontras tinggi. Ambang batas kontras dinaikkan agar hanya transisi tajam yang memicu; FO dan HPF dinaikkan tinggi untuk memaksimalkan bandwidth piksel dan menolak pergeseran ambient lambat; REFR diturunkan ke 0 agar setiap tepi kedipan ditangkap secara berurutan. 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 pemandangan statis atau lambat di mana event palsu sebaliknya akan 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 tunggal tidak membanjiri pembacaan — waktu mati yang lebih lama menjaga volume event tetap terbatas di bawah gerakan berat.

Timpa 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 pemandangan 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 keluaran 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 ndarray numpy. Setiap event adalah baris 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 dalam kolom [0]:

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

  • csi.PIX_ON_EVENT — sebuah piksel mendeteksi kenaikan kecerahan (ambang batas DIFF_ON dilewati). 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 terhubung ke jalur frame-sync kamera, yang juga diarahkan ke P10 pada prosesor dan header pin — kendalikan P10 untuk menyuntikkan tepi sync ke dalam aliran event dan ambil sebagai event EXT_TRIGGER_RISING / EXT_TRIGGER_FALLING bersama data piksel.

Sebagian besar aplikasi hanya memerlukan 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, lalu 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 menambahkan contrast ke bin; untuk setiap event OFF mengurangi. clear=True mengatur ulang citra ke brightness terlebih dahulu; clear=False mengakumulasi selama banyak panggilan:

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 hot-pixel semuanya bekerja dengan cara yang sama dalam mode event — panggil setelah csi.IOCTL_GENX320_SET_MODE.

Pemfilteran berdasarkan polaritas

Iris array event dengan ulab untuk hanya menyimpan event ON (gerakan menuju keadaan 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

Lepaskan visualisasi untuk membebaskan CPU bagi pemrosesan event. Cetak statistik setiap iterasi ke-N saja — 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 bergerak nyata cenderung memicu burst event yang berisik 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 pasca-proses 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

Disimpan

Dibuang

csi.GENX320_STC_DISABLE

setiap event

tidak ada

csi.GENX320_STC_ONLY

event kedua dari burst

event pertama + event berikutnya

csi.GENX320_STC_TRAIL_ONLY

event pertama dari burst

event berikutnya

csi.GENX320_STC_TRAIL

tepi pertama + tepi berikutnya

hanya noise redundan

Secara rinci:

  • csi.GENX320_STC_DISABLE — filter dinonaktifkan, setiap event lolos (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 sebagai "kedua" dari burst dan diteruskan — event pertama dan event berikutnya dalam burst yang sama difilter. Terbaik ketika 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 piksel aktif, event berikutnya pada piksel yang sama dibuang hingga trail_threshold 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 burst tetap masuk — throughput event lebih tinggi dari filter mode tunggal tetapi sinyal paling kaya.

Dua 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 mengantri event — dengan biaya memproses data yang sedikit lebih lama ketika host tertinggal:

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

Streaming dan visualisasi desktop

Untuk visualisasi GUI real-time di PC host, alat GenX320 Event Streaming di repo openmv-projects menggabungkan cam dengan front-end DearPyGui. GUI PC menjalankan dua visualisasi secara berdampingan: canvas akumulasi event (ide 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 melihat sinyal periodik (kipas berputar, LED berkedip, dll.) langsung dalam aliran event.

Ini dilengkapi dua skrip streaming on-cam:

  • Mode terproses (genx320_event_mode_streaming_on_cam.py) — cam 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 wire cocok dengan format ndarray on-cam.

  • Mode mentah (genx320_raw_event_mode_streaming_on_cam.py) — cam mengalirkan kata event 32-bit packed native chip melalui csi.IOCTL_GENX320_READ_EVENTS_RAW. Itu 4 byte per event dibandingkan 12 dalam mode terproses (sekitar 3x lebih sedikit data melalui USB), sehingga ~3x laju event yang dapat dicapai lebih tinggi ketika tautan menjadi bottleneck. PC mendekode kata packed kembali ke layout event 6-kolom yang sama menggunakan numpy vektorisasi, sehingga kode visualisasi downstream identik.

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