กล้อง GENX320 Event Camera¶
โมดูลกล้อง GENX320 Event Camera เป็น sensor วิชันแบบ event-based ของ Prophesee มีความละเอียด 320x320 และความแม่นยำด้านเวลาระดับไมโครวินาที
สำหรับ 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— พิกเซลตรวจพบความสว่างลดลง (ค่าขีดแบ่งของ comparatorDIFF_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 ที่มันส่งต่อจากชุด:
โหมด |
เก็บ |
ทิ้ง |
|---|---|---|
ทุก event |
ไม่มีอะไร |
|
event ที่สองของชุด |
event แรก + event หลัง |
|
event แรกของชุด |
event ที่ตามมา |
|
ขอบแรก + ขอบที่ตามมา |
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