genx320_event_mode_set_stc.py
# Dieses Werk ist unter der MIT-Lizenz lizenziert.
# Copyright (c) 2026 OpenMV LLC. Alle Rechte vorbehalten.
# https://github.com/openmv/openmv/blob/master/LICENSE
#
# Dieses Beispiel zeigt die Verwendung des räumlich-zeitlichen Kontrastfilters (STC) des genx320.
# Enthält Beispiele zur Verwendung des STC-Modus, des Trail-Modus und des STC + Trail-Modus
import csi
import time
# https://micropython-ulab.readthedocs.io/en/latest/index.html
from ulab import numpy as np
import image
# Fläche, auf der das Histogrammbild gezeichnet wird.
img = image.Image(320, 320, image.GRAYSCALE)
# Speichert Kamera-Events # Form: (EVT_res, 6), wobei EVT_res die Event-Auflösung ist
# EVT_res: muss eine Zweierpotenz zwischen 1024 und 65536 sein.
# Spalten:
# [0] Event-Typ
# [1] Zeitstempel in Sekunden
# [2] Zeitstempel in Millisekunden
# [3] Zeitstempel in Mikrosekunden
# [4] X-Koordinate 0 bis 319 für GENX320
# [5] Y-Koordinate 0 bis 319 für GENX320
events = np.zeros((8192, 6), dtype=np.uint16)
# Sensor initialisieren.
csi0 = csi.CSI(cid=csi.GENX320)
csi0.reset()
csi0.ioctl(csi.IOCTL_GENX320_SET_MODE, csi.GENX320_MODE_EVENT, events.shape[0])
# Setzt den STC-Filter des GENX320 auf einen von drei verfügbaren Modi:
# GENX320_STC_DISABLE - Deaktiviert den STC-Filter vollständig
# - Parameter: Keine
# GENX320_STC_ONLY - Modus, der das zweite Event eines Event-Bursts einer Kontrastkante beibehält
# - Parameter: stc_threshold
# GENX320_STC_TRAIL_ONLY - Modus, der das erste Event eines Event-Bursts einer Kontrastkante beibehält
# - Parameter: trail_threshold
# GENX320_STC_TRAIL - Modus, der mehrere Events eines Event-Bursts einer Kontrastkante beibehält
# - Parameter: stc_threshold, trail_threshold
stc_threshold = 1 # 1 ms Schwellenwert
trail_threshold = 2 # 2 ms Schwellenwert
csi0.ioctl(csi.IOCTL_GENX320_SET_STC, csi.GENX320_STC_TRAIL, stc_threshold, trail_threshold)
# STC-Filter deaktivieren
# csi0.ioctl(csi.IOCTL_GENX320_SET_STC, csi.GENX320_STC_DISABLE)
clock = time.clock()
# FIFO-Pufferung aktivieren, um Ereignisverluste während der Verarbeitung zu vermeiden.
# Der Triple-Buffer-Modus priorisiert die neuesten Daten, während der FIFO-Modus
# (Pufferanzahl > 3) Ereignisse stattdessen in eine Warteschlange einreiht und Verluste vermeidet, wenn der
# Prozessor mithält, dabei aber möglicherweise ältere Daten verarbeitet.
FIFO_DEPTH = 10
csi0.framebuffers(FIFO_DEPTH)
while True:
clock.tick()
# Liest bis zu 8192 Ereignisse von der Kamera.
# Gibt die Anzahl gültiger Ereignisse (0-8192) oder einen negativen Fehlercode zurück.
# Beachten Sie, dass alte Events im Puffer nicht gelöscht werden, um CPU-Zeit zu sparen.
event_count = csi0.ioctl(csi.IOCTL_GENX320_READ_EVENTS, events)
# Events in ein Histogrammbild rendern.
# Wenn clear=True, wird das Bild vor dem Zeichnen auf "brightness" zurückgesetzt.
# Für jedes PIX_ON_EVENT wird "contrast" zum Bin-Wert addiert;
# für jedes PIX_OFF_EVENT wird er subtrahiert und auf [0, 255] begrenzt.
# Wenn clear=False, akkumuliert sich das Histogramm über mehrere Aufrufe.
img.draw_event_histogram(events[:event_count], clear=True, brightness=128, contrast=64)
# Das Bild in den JPEG-Puffer schreiben, damit die IDE es abrufen und anzeigen kann.
# Die IDE ruft Frames von der Kamera mit einer viel geringeren Rate ab als die
# unten ausgegebene Framerate der Onboard-Kamera.
img.flush()
print(event_count, clock.fps())