กล้อง GENX320 Event Camera

โมดูลกล้อง GENX320 Event Camera เป็น sensor วิชันแบบ event-based ของ Prophesee มีความละเอียด 320x320 และความแม่นยำด้านเวลาระดับไมโครวินาที

GENX320 Event Camera

สำหรับ datasheet ฉบับเต็ม รูปภาพ และการสั่งซื้อ ดูได้ที่ หน้าผลิตภัณฑ์ GENX320 Event Camera

Note

รองรับบน OpenMV H7 Plus, RT1062 และ N6

จุดเด่น

  • sensor วิชันแบบ event-based ความละเอียด 320x320

  • ช่วงไดนามิก 140 dB ไม่มี motion blur

  • อัตราเอาต์พุต event-histogram 375 Hz ขึ้นไป

  • การใช้พลังงานปรับตามกิจกรรมในฉาก — เริ่มต้นที่ ~3 mW

  • ทำงานได้ตั้งแต่ <5 lux ถึงแสงแดดสว่างจ้าโดยไม่ต้องปรับ auto-exposure

  • เอาต์พุตเป็นเฟรมระดับสีเทาหรือ raw event streams

การใช้งาน

GENX320 เป็น sensor วิชันแบบ event-based — แทนที่จะอ่านค่าอาร์เรย์ 320x320 ทั้งหมดตาม frame clock คงที่ แต่ละพิกเซลจะรายงาน "events" แบบ asynchronous ทันทีที่ตรวจจับการเปลี่ยนแปลงความสว่าง ทุก event จะมีพิกัด X/Y ขั้วของ ON/OFF (สว่าง→มืด หรือ มืด→สว่าง) และ timestamp ระดับไมโครวินาที นี่คือที่มาของความแม่นยำด้านเวลาระดับไมโครวินาที การไม่มี motion blur ช่วงไดนามิกสูง และการใช้พลังงานตามกิจกรรมของ sensor นี้ ฉากที่ไม่มีการเคลื่อนไหวจะไม่สร้างข้อมูลใดๆ

เฟิร์มแวร์ OpenMV เปิดเผย GENX320 ผ่าน csi.CSI ด้วย cid= csi.GENX320 มีโหมดการทำงานให้เลือกสองโหมด:

  • โหมด Histogram (ค่าเริ่มต้น) — events จะถูกสะสมบนชิปเป็น bins ต่อพิกเซลและรายงานเป็นเฟรมระดับสีเทา 320x320 ที่อัตราที่ปรับได้ (~20-350 FPS) sensor จะทำงานเหมือนกล้องทั่วไป ดังนั้น routines การประมวลผลภาพมาตรฐานทั้งหมด (Image.find_blobs, palettes ฯลฯ) จึงทำงานได้โดยตรง

  • โหมด Event — raw events จะสตรีมเข้า numpy ndarray พร้อม timestamp ระดับไมโครวินาทีเต็มรูปแบบ สำหรับแอปพลิเคชันที่ต้องการรายละเอียดด้านเวลามากกว่าเฟรมที่ pre-binned แล้ว

โหมด Histogram

ในโหมด Histogram GENX320 จะเอาต์พุตเฟรมระดับสีเทาซึ่งแต่ละพิกเซลเข้ารหัสกิจกรรม event ล่าสุดที่ตำแหน่งนั้น พิกเซลที่สว่างกว่าค่า baseline คือ ON events (ความสว่างเพิ่มขึ้น) ที่มืดกว่าคือ OFF events (ความสว่างลดลง) ค่า baseline ความสว่างเริ่มต้นคือ 128 และขั้น contrast ต่อ event คือ 16 — เพิ่ม contrast เพื่อให้ events โดดเด่นขึ้น:

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 และ csi.CSI.framerate เป็นสามตัวปรับที่กำหนดรูปแบบเอาต์พุต histogram

เอาต์พุตแบบมีสี

ตั้งค่า csi.CSI.color_palette เป็น image.PALETTE_EVT_LIGHT สำหรับพื้นหลังสว่าง หรือ image.PALETTE_EVT_DARK สำหรับพื้นหลังมืด — ไดรเวอร์จะเปล่งเฟรม RGB565 โดยใช้ palette โดยตรง:

csi0.color_palette(image.PALETTE_EVT_LIGHT)

การสอบเทียบ hot-pixel

sensor เหตุการณ์จะสะสม "hot pixels" ที่ยิง events โดยไม่มีสาเหตุ ใช้ csi.IOCTL_GENX320_CALIBRATE กับฉากที่ไม่มีการเคลื่อนไหวเพื่อปิดการใช้งาน hot pixels ไดรเวอร์จะสร้าง hit count ต่อพิกเซลขนาด 320x320 คำนวณค่าเฉลี่ยและส่วนเบี่ยงเบนมาตรฐาน แล้วปิดพิกเซลใดก็ตามที่มีค่าสูงกว่า mean + sigma * stddev — จากนั้นพิกเซลที่ปิดแล้วจะหยุดส่ง events ที่ระดับ sensor

พารามิเตอร์สองตัวควบคุมการสอบเทียบ:

  • event_count — จำนวน events ที่ต้องนับก่อนคำนวณสถิติ ลูปจะจับเฟรมจนกว่ายอด events รวมจะถึงงบประมาณนี้ ค่าสูงกว่าให้ค่าประมาณที่เชื่อถือได้มากกว่าแต่ใช้เวลาสอบเทียบนานกว่า 10000 เป็นจุดเริ่มต้นที่เหมาะสม

  • sigma — ตัวคูณค่าขีดแบ่งบนส่วนเบี่ยงเบนมาตรฐาน ค่าต่ำกว่าจะก้าวร้าวกว่า (ปิดพิกเซลมากกว่า) ค่าสูงกว่าจะอนุรักษ์มากกว่า 0.5 เป็นค่าเริ่มต้นที่ดี

เล็งกล้องไปที่ฉากที่ไม่มีการเคลื่อนไหวก่อน เพื่อไม่ให้ events ที่เกิดจากการเคลื่อนไหวนับรวมกับพิกเซลที่ทำงานได้ปกติ:

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

ฟิลเตอร์ Anti-flicker (AFK)

แหล่งกำเนิดแสงแบบ periodic (หลอดฟลูออเรสเซนต์ จอ LED) สร้าง events ซ้ำซ้อนจำนวนมาก ฟิลเตอร์ AFK จะปฏิเสธ events ที่พิกเซลสลับที่ความถี่ภายในช่วงที่กำหนด — เปิดใช้งานผ่าน csi.IOCTL_GENX320_SET_AFK พร้อมขอบเขตช่วงในหน่วยเฮิร์ตซ์:

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

ค่าล่วงหน้าของ Bias

แต่ละพิกเซลใน GenX320 รัน analog front-end ที่มี biases ที่ปรับแต่งได้หลายตัว ทั้งหมดควบคุมความไวต่อสัญญาณ ความเสียหายจากสัญญาณรบกวน แบนด์วิดท์พิกเซล และอัตรา event ร่วมกัน — การผสมผสานที่เหมาะสมขึ้นอยู่กับฉาก biases แต่ละตัวคือ:

  • DIFF_ON — ค่าขีดแบ่ง contrast ของ comparator เชิงบวก พิกเซลจะส่ง ON event เมื่อ log-illumination เพิ่มขึ้นเท่านี้ ค่าต่ำ = ไวต่อการเปลี่ยนผ่านที่สว่างมากขึ้น

  • DIFF_OFF — ค่าขีดแบ่ง contrast ของ comparator เชิงลบ (คู่สมมาตรสำหรับ OFF events) ค่าต่ำ = ไวต่อการเปลี่ยนผ่านที่มืดมากขึ้น

  • FO — ความถี่ cut-off แบบ low-pass ของพิกเซล ค่าสูง = แบนด์วิดท์พิกเซลกว้างกว่า (ตอบสนองเร็วกว่า เวลาแฝงต่ำกว่า) แต่มีกิจกรรม noise พื้นหลังมากขึ้น

  • HPF — ความถี่ cut-off แบบ high-pass ค่าสูง = การปฏิเสธการเปลี่ยนแปลงความสว่างช้าแข็งแกร่งกว่า มีเพียงการเปลี่ยนผ่านเร็วเท่านั้นที่ถึง comparators มีประโยชน์สำหรับการละเว้น ambient drift

  • REFR — ระยะเวลา refractory หลังจากพิกเซลยิง มันจะอยู่ใน reset นี้ก่อนที่จะยิงได้อีก ค่าสูง = dead time นานกว่า มีประโยชน์สำหรับการจำกัดอัตรา event ต่อพิกเซล

หลังจาก csi.CSI.reset ไดรเวอร์จะใช้ csi.GENX320_BIASES_LOW_NOISE ไม่ใช่ csi.GENX320_BIASES_DEFAULT — ค่าเริ่มต้นของ datasheet จะส่ง background event rate ที่สูงกว่ามาก ดังนั้น LOW_NOISE จึงใช้เป็นจุดเริ่มต้นเพื่อให้ stream เงียบ เรียก csi.IOCTL_GENX320_SET_BIASES พร้อม preset ที่แตกต่างกันเมื่อแอปพลิเคชันต้องการความไวหรือแบนด์วิดท์มากขึ้น

csi.IOCTL_GENX320_SET_BIASES ใช้หนึ่งใน preset ห้าแบบ:

  • csi.GENX320_BIASES_DEFAULT — ค่าเริ่มต้นของ GenX320 datasheet ความไว ความเสียหายจากสัญญาณรบกวน และแบนด์วิดท์สมดุลสำหรับฉากทั่วไป

  • csi.GENX320_BIASES_LOW_LIGHT — ค่าขีดแบ่ง contrast ทั้งสองถูกขยายออกเพื่อความไวสูงขึ้น FO ลดลงเพื่อลด noise และ HPF ตั้งเป็น 0 เพื่อให้การเปลี่ยนแปลงความสว่างช้ายังคงลงทะเบียน — ฉากแสงน้อยสร้าง events น้อยมากเอง ดังนั้นเราต้องการให้ผ่านมาได้มากที่สุด

  • csi.GENX320_BIASES_ACTIVE_MARKER — ปรับแต่งสำหรับการติดตาม LED กะพริบ high-contrast ค่าขีดแบ่ง contrast เพิ่มขึ้นเพื่อให้เฉพาะการเปลี่ยนผ่านที่คมเท่านั้นที่ trigger; FO และ HPF เพิ่มสูงเพื่อเพิ่มแบนด์วิดท์พิกเซลและปฏิเสธ ambient drift ช้า; REFR ดึงลงเป็น 0 เพื่อให้จับขอบแต่ละกะพริบได้ต่อเนื่อง ผลลัพธ์: stream ที่เกือบทั้งหมดเป็น LED edges ติดตามได้ง่าย

  • csi.GENX320_BIASES_LOW_NOISE — ค่าเริ่มต้นของไดรเวอร์ ค่าขีดแบ่ง contrast ทั้งสองเพิ่มขึ้นเทียบกับ DEFAULT (ความไวน้อยลง) และ FO ลดลง (พิกเซลช้าลง = เงียบลง) ดีที่สุดสำหรับฉากนิ่งหรือช้าที่ false events อาจครองได้

  • csi.GENX320_BIASES_HIGH_SPEED — FO เพิ่มขึ้นเพื่อให้แต่ละพิกเซลตอบสนองเร็วขึ้น HPF เพิ่มขึ้นเพื่อปฏิเสธ brightness drift ช้า และ REFR เพิ่มขึ้นเพื่อไม่ให้ขอบที่เคลื่อนที่เร็วขอบเดียวท่วม readout — dead time ที่ยาวขึ้นจะจำกัดปริมาณ event ไว้ภายใต้การเคลื่อนไหวหนัก

แทนที่ biases แต่ละตัวด้วย csi.IOCTL_GENX320_SET_BIAS บวกกับหนึ่งใน csi.GENX320_BIAS_DIFF_ON, csi.GENX320_BIAS_DIFF_OFF, csi.GENX320_BIAS_FO, csi.GENX320_BIAS_HPF หรือ csi.GENX320_BIAS_REFR และค่า DAC แต่ละ bias ตั้งค่าอิสระ — เลือก preset เป็นจุดเริ่มต้น แล้วปรับแต่ง biases ที่ฉากของคุณต้องการ:

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

การติดตาม

เนื่องจากเอาต์พุตโหมด histogram เป็นเพียงภาพระดับสีเทา การติดตาม blob ปกติจึงทำงานได้โดยตรง หากต้องการติดตาม LED active-marker ให้โหลด bias preset สำหรับ active-marker และค้นหา blobs ที่ปลายสว่างของ 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())

โหมด Event

โหมด Event จะข้าม on-chip histogram และสตรีม raw events เข้า numpy ndarray แต่ละ event คือแถวของหกคอลัมน์ uint16:

  • [0] ประเภท event — ดูด้านล่าง

  • [1] timestamp วินาที

  • [2] timestamp มิลลิวินาที

  • [3] timestamp ไมโครวินาที

  • [4] พิกัด X, 0-319

  • [5] พิกัด Y, 0-319

ไดรเวอร์จะส่ง event หกประเภทในคอลัมน์ [0]:

  • csi.PIX_OFF_EVENT — พิกเซลตรวจพบความสว่างลดลง (ค่าขีดแบ่งของ comparator DIFF_OFF ถูกข้าม) X/Y ชี้ไปที่พิกเซลที่ยิง

  • csi.PIX_ON_EVENT — พิกเซลตรวจพบความสว่างเพิ่มขึ้น (ค่าขีดแบ่ง DIFF_ON ถูกข้าม) X/Y ชี้ไปที่พิกเซล

  • csi.EXT_TRIGGER_FALLING — พิน external trigger ของ sensor พบ falling edge X/Y ไม่ได้ใช้งาน

  • csi.EXT_TRIGGER_RISING — พิน external trigger ของ sensor พบ rising edge X/Y ไม่ได้ใช้งาน

  • csi.RST_TRIGGER_FALLING — pixel-reset trigger, falling edge X/Y ไม่ได้ใช้งาน ยังไม่สร้างโดยเฟิร์มแวร์ในขณะนี้

  • csi.RST_TRIGGER_RISING — pixel-reset trigger, rising edge X/Y ไม่ได้ใช้งาน ยังไม่สร้างโดยเฟิร์มแวร์ในขณะนี้

อินพุต external trigger ของ GENX320 ต่อสายเข้ากับสาย frame-sync ของกล้อง ซึ่งยังเชื่อมต่อไปยัง P10 ทั้งบนโปรเซสเซอร์และ pin header — ขับ P10 เพื่อ inject sync edges เข้า event stream และรับเป็น EXT_TRIGGER_RISING / EXT_TRIGGER_FALLING events ควบคู่กับข้อมูลพิกเซล

แอปพลิเคชันส่วนใหญ่สนใจเฉพาะ PIX_OFF_EVENT และ PIX_ON_EVENT; ประเภท trigger ช่วยให้คุณเชื่อมโยง events กับสัญญาณ timing ภายนอกได้

จัดสรร event buffer ด้วย shape (EVT_res, 6) โดยที่ EVT_res เป็นกำลังสองระหว่าง 1024 ถึง 65536 จากนั้นเข้าสู่โหมด event ผ่าน csi.IOCTL_GENX320_SET_MODE พร้อม csi.GENX320_MODE_EVENT และขนาดบัฟเฟอร์ อ่าน events ด้วย csi.IOCTL_GENX320_READ_EVENTS ซึ่งจะเติมบัฟเฟอร์จนเต็มความจุและส่งคืนจำนวนแถวที่ถูกต้อง

Image.draw_event_histogram จะ rasterize events เป็นภาพระดับสีเทา — สำหรับแต่ละ ON event มันจะเพิ่ม contrast ให้กับ bin; สำหรับแต่ละ OFF event มันจะลบออก clear=True จะรีเซ็ตภาพเป็น brightness ก่อน; clear=False จะสะสมข้ามการเรียกหลายครั้ง:

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

bias presets ของโหมด histogram ฟิลเตอร์ AFK และ ioctls การสอบเทียบ hot-pixel ทำงานในแบบเดียวกันในโหมด event — เรียกหลังจาก csi.IOCTL_GENX320_SET_MODE

การกรองตามขั้ว

Slice อาร์เรย์ events ด้วย ulab เพื่อเก็บเฉพาะ ON events (การเคลื่อนไหวสู่สถานะสว่างกว่า) หรือเฉพาะ OFF events:

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)

การสะสม long-exposure

ตั้ง clear=False เพื่อสะสม events เข้าภาพเดิมข้ามหลายเฟรม — ผลลัพธ์คือการแสดงภาพ motion-trail รีเซ็ตเป็นระยะเพื่อเริ่ม exposure ใหม่:

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

การประมวลผลความเร็วสูง

ลบ visualization ออกเพื่อเพิ่ม CPU สำหรับการประมวลผล event พิมพ์สถิติทุก N รอบเท่านั้น — การพิมพ์ทุกรอบจะกลายเป็น bottleneck ที่อัตรา event สูง:

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

ฟิลเตอร์ Spatio-temporal contrast (STC)

ขอบ contrast จริงที่เคลื่อนที่มักจะ trigger ชุด ของ events บนพิกเซลเดิมภายในหน้าต่างเวลาสั้น — pixel mismatch และ analog noise สร้าง events เพิ่มเติมรอบๆ การเปลี่ยนผ่านจริงที่ไม่มีประโยชน์ต่อแอปพลิเคชัน ฟิลเตอร์ STC เป็น post-process บนชิปที่เก็บเฉพาะหนึ่ง (หรือสองสาม) event ต่อชุดและทิ้งส่วนที่เหลือ

มันมีสามกลยุทธ์ เลือกผ่าน csi.IOCTL_GENX320_SET_STC และค่าคงที่ GENX320_STC_* แต่ละโหมดกำหนดโดย events ที่มันส่งต่อจากชุด:

โหมด

เก็บ

ทิ้ง

csi.GENX320_STC_DISABLE

ทุก event

ไม่มีอะไร

csi.GENX320_STC_ONLY

event ที่สองของชุด

event แรก + event หลัง

csi.GENX320_STC_TRAIL_ONLY

event แรกของชุด

event ที่ตามมา

csi.GENX320_STC_TRAIL

ขอบแรก + ขอบที่ตามมา

noise ซ้ำซ้อนเท่านั้น

รายละเอียด:

  • csi.GENX320_STC_DISABLE — ฟิลเตอร์ปิด ทุก event ผ่านได้ (ค่าเริ่มต้น)

  • csi.GENX320_STC_ONLY — เก็บ event ที่สอง ของชุด พารามิเตอร์: stc_threshold (ms) หาก event ใหม่บนพิกเซลมาถึงภายใน stc_threshold ของ event ก่อนหน้า จะถูกนับเป็น "ที่สอง" ของชุดและส่งต่อ — event แรกและ events ที่ตามมาในชุดเดียวกันจะถูกกรองออก ดีที่สุดเมื่อต้องการการเปลี่ยนผ่านที่ได้รับการยืนยันจาก noise มากกว่า hit แรก

  • csi.GENX320_STC_TRAIL_ONLY — เก็บ event แรก ของชุด พารามิเตอร์: trail_threshold (ms) หลังจากพิกเซลยิง events ที่ตามมาบนพิกเซลเดิมจะถูกทิ้งจนกว่า trail_threshold จะผ่าน รักษา timing ที่แม่นยำของ leading edge — มีประโยชน์เมื่อช่วงเวลา polarity-switch สำคัญมากกว่าการยืนยันชุด

  • csi.GENX320_STC_TRAIL — รวมทั้งสอง พารามิเตอร์: stc_threshold และ trail_threshold (ทั้ง ms) เก็บ leading edge ตาม Trail mode บวกกับขอบที่ตามมาตาม STC mode ดังนั้น events หลายตัวจากชุดยังผ่านได้ — ปริมาณงาน event สูงกว่าฟิลเตอร์โหมดเดี่ยวแต่สัญญาณสมบูรณ์ที่สุด

ค่าขีดแบ่งสองตัวต้องอยู่ในอัตราส่วน ~13:1 — sensor จะปฏิเสธการกำหนดค่าที่ค่าหนึ่งมากกว่า ~13 เท่าของอีกค่า:

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

ความลึกของบัฟเฟอร์

เมื่ออัตรา event เพิ่มสูง pipeline triple-buffer ค่าเริ่มต้นจะให้ความสำคัญกับเฟรมล่าสุดและทิ้งเฟรมเก่า เพิ่มความลึก FIFO ผ่าน csi.CSI.framebuffers เพื่อจัดคิว events แทน — โดยแลกกับการประมวลผลข้อมูลที่เก่ากว่าเล็กน้อยเมื่อ host ตามไม่ทัน:

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

การสตรีมและแสดงภาพบน Desktop

สำหรับการแสดงภาพ GUI แบบ real-time บน PC ของ host เครื่องมือ GenX320 Event Streaming ใน repo openmv-projects จับคู่กล้องกับ DearPyGui front-end PC GUI รันการแสดงภาพสองแบบเคียงกัน: canvas สะสม event (แนวคิดเดียวกับ Image.draw_event_histogram แต่มี palettes ให้เลือกและโหมด sliding-window กับ auto-clear) และแผนที่ความถี่ต่อพิกเซลที่ขับเคลื่อนด้วย IIR band-pass filter — มีประโยชน์สำหรับการตรวจจับสัญญาณ periodic (พัดลมหมุน, LED กะพริบ ฯลฯ) โดยตรงใน event stream

มี on-cam streaming scripts สองแบบ:

  • โหมด Processed (genx320_event_mode_streaming_on_cam.py) — กล้องถอดรหัส events ด้วย csi.IOCTL_GENX320_READ_EVENTS และสตรีมแต่ละแถวเป็น 12 bytes ผ่าน USB ([0] type, [1] sec, [2] ms, [3] us, [4] x, [5] y) ใช้งานง่ายบน PC เนื่องจากรูปแบบ wire ตรงกับรูปแบบ ndarray บนกล้อง

  • โหมด Raw (genx320_raw_event_mode_streaming_on_cam.py) — กล้องสตรีม native 32-bit packed event words ของชิปผ่าน csi.IOCTL_GENX320_READ_EVENTS_RAW นั่นคือ 4 bytes ต่อ event เทียบกับ 12 ในโหมด processed (ข้อมูลน้อยกว่าประมาณ 3 เท่าผ่าน USB) ดังนั้นอัตรา event สูงสุดที่บรรลุได้ ~3 เท่าเมื่อลิงก์เป็น bottleneck PC ถอดรหัส packed words กลับเป็น 6-column event layout โดยใช้ vectorized numpy ดังนั้น code visualizer downstream จึงเหมือนกัน

โหมด Raw เป็นค่าเริ่มต้นใน GUI เนื่องจาก USB throughput เป็นข้อจำกัดหลักที่อัตราที่ GenX320 สามารถผลิตได้; เปลี่ยนไปโหมด processed หากต้องการเชื่อม processing logic เข้ากับ on-cam script