Çok Spektrumlu Olay Kamerası¶
Çok Spektrumlu Olay Kamerası Modülü, GENX320 olay sensörünü tek bir modül üzerinde 1 MP’lik PAG7936 global-shutter renkli sensörle eşleştirir — yüksek hızlı nesne takibi, LED takibi, akışkan akışı ve diğer dinamik sahneler için senkronize bir olay + renk işlem hattı.
Tam veri sayfası, fotoğraflar ve sipariş bilgileri için Çok Spektrumlu Olay Kamerası ürün sayfasına bakın.
Not
Yalnızca OpenMV N6 üzerinde desteklenir.
Öne Çıkanlar¶
320x320 olay sensörü, >140 dB dinamik aralık, 375 Hz+ histogramlar
PAG7936 renk: 1280x800 @ 120 FPS, 640x400 @ 240 FPS
Paylaşılan pozlama tetikleyicisiyle senkronize olay zaman damgaları
Otomatik pozlama olmadan 5 lux altında görür
Olay akışı için güç ~3 mW’tan başlar
Yüksek hızlı takip, LED takibi ve akışkan/parçacık akışı için hedeflenmiştir
Kullanım¶
Renkli sensör ve GENX320 olay sensörünün her biri kendi csi.CSI örneğini alır. İlk çağrı varsayılan olarak birincil sensöre (PAG7936) gider; ikincisi ise cid= csi.GENX320 geçirerek GENX320’ye bağlanır. Rayı yükseltmek için renkli sensörü csi.CSI.reset (hard=True) ile donanım sıfırlaması yapın ve GENX320’yi hard=False ile yapılandırın; böylece sürücüsü, sıfırlamayı yeniden değiştirmeden yalnızca yongayı yeniden programlar.
GENX320 histogram modunda 320x320 çıktı verir; PAG7936 ise csi.QVGA çözünürlükte 320x200 çıktı verir. Aşağıdaki temel bindirme, GENX320 çerçevesinin alttaki 120 satırını kırpar. Sığdırılmış bir bindirme veya daha büyük bir PAG7936 çerçeve boyutu için homografi dönüşümünü (aşağıda) kullanın.
Çerçeve döngüsü boyunca iki yazma (scratch) arabelleği sabit kalır — image.Image olarak depolanan 256x1 boyutunda bir alfa paleti, böylece orta-gri taban çizgisindeki (128) histogram pikselleri saydam olur, hem ON-olay vurguları hem de OFF-olay gölgeleri ise opak olur; ve image.Image ile önceden ayrılmış bir GENX320 çerçeve arabelleği (frame buffer), böylece csi.CSI.snapshot (blocking=False, image=...) her yinelemede yeniden ayırma yapmadan onu yerinde doldurabilir:
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())
Her yineleme, bloklayan bir renkli anlık görüntü ve bloklamayan bir GENX320 anlık görüntüsü alır. Image.draw_image ardından ikisini birleştirir: color_palette= image.PALETTE_EVT_LIGHT (veya koyu bir arka plan için image.PALETTE_EVT_DARK) GENX320’nin gri tonlamalı histogramını bir renk rampasına eşler, alpha_palette= her pikseli v-şeklindeki alfa haritasını kullanarak harmanlar, böylece sahnenin sessiz bölgeleri renkli görüntüye düşer ve hint= image.BILINEAR renkli sensör GENX320’den daha yüksek çözünürlükte çalıştığında ölçek büyütmeyi yumuşatır.
GENX320’nin önyargı (bias) ön ayarları, AFK filtresi, sıcak piksel kalibrasyonu ve STC filtresi ioctl’lerinin tümü bu çift kameralı kurulumda aynı şekilde çalışır — bunları csi.CSI.reset sonrasında csi1 üzerinde çağırın. Ayrıntılar için aşağıdaki bölümlere bakın.
GPU hızlandırmalı hizalama¶
Image.draw_image, bir transform= argümanı kabul eder — 2 boyutlu bir ulab.numpy dizisi olarak 3x3 homografi matrisi. OpenMV N6 üzerinde GPU, aynı çizim sırasında piksel başına yansıtmayı çalıştırır, böylece GENX320 çerçevesi ayrı bir çarpıtma geçişi olmadan renkli kameranın perspektifine göre yeniden hizalanabilir — iki sensörün biraz farklı optikleri veya görüş alanları olduğunda ya da renkli kamera daha yüksek çözünürlükte çalıştığında kullanışlıdır. Matrisi her kamera için, hareket olmadan köşe olayları üretmesi amacıyla titreşen bir dama tahtası görüntüleyen GenX320 Bindirme Kalibrasyon aracı ile kalibre edin:
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())
Bu varyant, renkli kamerayı csi.VGA (640x480) ve GENX320’yi yerel 320x320 çözünürlüğünde çalıştırır — homografi, çizimin bir parçası olarak daha küçük GENX320 çerçevesini daha büyük renkli çerçeveye yansıtır, böylece ölçek büyütme faktörü ayrı olarak uygulanmak yerine matrisin kendisine işlenmiş olur.
Olay kamerası ayrıntıları¶
GENX320, olay tabanlı bir görüş sensörüdür — tüm 320x320 diziyi sabit bir çerçeve saatinde okumak yerine, her piksel bir parlaklık değişikliği algıladığı anda asenkron “olaylar” bildirir. Her olay bir X/Y koordinatı, bir ON/OFF polaritesi (parlak→koyu veya koyu→parlak) ve mikrosaniye düzeyinde bir zaman damgası taşır. Sensörün mikrosaniye zamansal hassasiyeti, hareket bulanıklığının olmaması, çok yüksek dinamik aralığı ve etkinliğe göre ölçeklenen güç tüketimi buradan gelir. Statik sahneler hiç veri üretmez.
OpenMV aygıt yazılımı (firmware), GENX320’yi cid= csi.GENX320 ile csi.CSI üzerinden sunar. İki çalışma modu mevcuttur:
Histogram modu (varsayılan) — olaylar yonga üzerinde piksel başına kovalara biriktirilir ve yapılandırılabilir bir hızda (~20-350 FPS) 320x320 gri tonlamalı bir çerçeve olarak bildirilir. Sensör normal bir kamera gibi davranır, dolayısıyla standart görüntü işleme rutinlerinin tümü (
Image.find_blobs, paletler vb.) doğrudan çalışır.Olay modu — ham olaylar, önceden kovalanmış bir çerçeve yerine zamansal ayrıntıya ihtiyaç duyan uygulamalar için tam mikrosaniye zaman damgalarıyla bir numpy
ndarrayiçine akar.
Histogram modu¶
Histogram modunda GENX320, her pikselin o konumdaki son olay etkinliğini kodladığı gri tonlamalı çerçeveler çıkarır. Parlaklık taban çizgisinin üzerindeki pikseller ON olaylarıdır (parlaklık yükseliyor), altındakiler OFF olaylarıdır (parlaklık düşüyor). Varsayılan taban çizgisi parlaklığı 128 ve olay başına kontrast adımı 16’dır — olayları öne çıkarmak için kontrastı artırın:
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 ve csi.CSI.framerate, histogram çıktısını şekillendiren üç ayar düğmesidir.
Renklendirilmiş çıktı¶
Açık bir arka plan için csi.CSI.color_palette değerini image.PALETTE_EVT_LIGHT olarak, koyu bir arka plan için ise image.PALETTE_EVT_DARK olarak ayarlayın — sürücü, paleti doğrudan kullanarak RGB565 çerçeveler üretir:
csi0.color_palette(image.PALETTE_EVT_LIGHT)
Sıcak piksel kalibrasyonu¶
Olay sensörleri, sahte şekilde ateşlenen “sıcak pikseller” biriktirir. Bunları devre dışı bırakmak için statik bir sahneye karşı csi.IOCTL_GENX320_CALIBRATE çalıştırın. Sürücü, piksel başına 320x320 bir vuruş sayımı oluşturur, ortalama ve standart sapmayı hesaplar ve sayımı mean + sigma * stddev değerinin üzerinde olan herhangi bir pikseli devre dışı bırakır — ardından devre dışı bırakılan pikseller sensör düzeyinde olay yaymayı durdurur.
Kalibrasyonu iki parametre kontrol eder:
event_count— istatistikleri hesaplamadan önce kaç olayın sayılacağı. Döngü, çalışan olay toplamı bu bütçeyi aşana kadar çerçeve yakalar. Daha yüksek sayımlar, daha uzun kalibrasyon süresi pahasına daha güvenilir bir tahmin verir.10000makul bir başlangıç noktasıdır.sigma— standart sapma üzerindeki eşik çarpanı. Daha düşük değerler daha agresiftir (daha fazla piksel devre dışı bırakılır); daha yüksek değerler daha tutucudur.0.5iyi bir varsayılandır.
Aslında sorunsuz olan piksellere karşı hareket kaynaklı olayların sayılmaması için önce sensörü statik bir sahneye yöneltin:
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")
Titreşim önleme (AFK) filtresi¶
Periyodik ışık kaynakları (floresan, LED tahrikli ekranlar) çok büyük hacimlerde gereksiz olay üretir. AFK filtresi, pikseli bir bant içindeki bir frekansta değişen olayları reddeder — bant kenarlarını hertz cinsinden vererek csi.IOCTL_GENX320_SET_AFK aracılığıyla etkinleştirin:
csi0.ioctl(csi.IOCTL_GENX320_SET_AFK, 1, 130, 160) # 130-160 Hz
csi0.ioctl(csi.IOCTL_GENX320_SET_AFK, 0) # disable
Önyargı (bias) ön ayarları¶
GenX320’deki her piksel, birkaç yapılandırılabilir önyargıya (bias) sahip analog bir ön uç çalıştırır. Bunlar birlikte duyarlılığı, gürültüyü, piksel bant genişliğini ve olay hızını yönetir — doğru kombinasyon sahneye bağlıdır. Bireysel önyargılar şunlardır:
DIFF_ON — pozitif karşılaştırıcı kontrast eşiği. Bir piksel, logaritmik aydınlanması bu kadar yükseldiğinde bir ON olayı yayar. Daha düşük = parlak geçişlere daha duyarlı.
DIFF_OFF — negatif karşılaştırıcı kontrast eşiği (OFF olayları için simetrik karşılığı). Daha düşük = koyu geçişlere daha duyarlı.
FO — pikselin alçak geçiren kesme frekansı. Daha yüksek = daha geniş piksel bant genişliği (daha hızlı yanıt, daha düşük gecikme) ancak daha fazla arka plan gürültü etkinliği.
HPF — yüksek geçiren kesme frekansı. Daha yüksek = yavaş parlaklık değişikliklerinin daha güçlü reddedilmesi; karşılaştırıcılara yalnızca hızlı geçişler ulaşır. Ortam kaymasını yok saymak için kullanışlıdır.
REFR — refrakter dönem. Bir piksel ateşlendikten sonra, tekrar ateşlenebilmeden önce bu süre boyunca sıfırlanmış durumda kalır. Daha yüksek = daha uzun ölü süre, piksel başına olay hızını sınırlamak için kullanışlıdır.
csi.CSI.reset sonrasında sürücü, csi.GENX320_BIASES_DEFAULT değil, csi.GENX320_BIASES_LOW_NOISE uygular — veri sayfası varsayılanları çok daha yüksek bir arka plan olay hızı yaydığından, akışı sessiz tutmak için başlangıç noktası olarak LOW_NOISE kullanılır. Uygulama daha fazla duyarlılık veya bant genişliği gerektirdiğinde csi.IOCTL_GENX320_SET_BIASES öğesini farklı bir ön ayarla çağırın.
csi.IOCTL_GENX320_SET_BIASES beş ön ayardan birini uygular:
csi.GENX320_BIASES_DEFAULT— GenX320 veri sayfası varsayılanları. Genel sahneler için dengeli duyarlılık, gürültü ve bant genişliği.csi.GENX320_BIASES_LOW_LIGHT— daha yüksek duyarlılık için her iki kontrast eşiği de gevşetilmiş, gürültüyü düşük tutmak için FO azaltılmış ve yavaş parlaklık değişikliklerinin yine de kaydedilmesi için HPF 0 olarak ayarlanmış — düşük ışıklı bir sahne kendi başına az olay üretir, bu nedenle olabildiğince çoğunun geçmesini isteriz.csi.GENX320_BIASES_ACTIVE_MARKER— yüksek kontrastlı yanıp sönen LED’leri takip etmek için ayarlanmıştır. Yalnızca keskin geçişlerin tetiklemesi için kontrast eşikleri yükseltilmiş; piksel bant genişliğini en üst düzeye çıkarmak ve herhangi bir yavaş ortam kaymasını reddetmek için FO ve HPF yüksek tutulmuş; her yanıp sönme kenarının ardı ardına yakalanması için REFR 0’a çekilmiştir. Sonuç: neredeyse tamamen LED kenarlarından oluşan, takip etmesi kolay bir akış.csi.GENX320_BIASES_LOW_NOISE— sürücü varsayılanı. Her iki kontrast eşiği deDEFAULTdeğerine göre yükseltilmiş (daha az duyarlı) ve FO azaltılmıştır (daha yavaş piksel = daha sessiz piksel). Sahte olayların aksi takdirde baskın olacağı statik veya yavaş sahneler için en iyisidir.csi.GENX320_BIASES_HIGH_SPEED— her pikselin daha hızlı yanıt verebilmesi için FO artırılmış, yavaş parlaklık kaymasını reddetmek için HPF yükseltilmiş ve tek bir hızlı hareket eden kenarın okumayı taşırmaması için REFR yükseltilmiştir — daha uzun ölü süre, yoğun hareket altında olay hacmini sınırlı tutar.
Bireysel önyargıları, csi.GENX320_BIAS_DIFF_ON, csi.GENX320_BIAS_DIFF_OFF, csi.GENX320_BIAS_FO, csi.GENX320_BIAS_HPF veya csi.GENX320_BIAS_REFR değerlerinden biri ve bir DAC değeri ile birlikte csi.IOCTL_GENX320_SET_BIAS kullanarak geçersiz kılın. Her önyargı bağımsız olarak ayarlanır — başlangıç noktası olarak bir ön ayar seçin, ardından sahnenizin ihtiyaç duyduğu önyargıları ince ayarlayın:
csi0.ioctl(csi.IOCTL_GENX320_SET_BIASES, csi.GENX320_BIASES_LOW_LIGHT)
csi0.ioctl(csi.IOCTL_GENX320_SET_BIAS, csi.GENX320_BIAS_HPF, 20)
Takip¶
Histogram modu çıktısı yalnızca bir gri tonlamalı görüntü olduğundan, normal nokta (blob) takibi doğrudan çalışır. Bir aktif işaretleyici LED’ini takip etmek için aktif işaretleyici önyargı ön ayarını yükleyin ve histogramın parlak ucundaki noktaları bulun:
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())
Olay modu¶
Olay modu, yonga üzerindeki histogramı atlar ve ham olayları bir numpy ndarray içine akıtır. Her olay, altı uint16 sütundan oluşan bir satırdır:
[0]olay türü — aşağıya bakın[1]saniye zaman damgası[2]milisaniye zaman damgası[3]mikrosaniye zaman damgası[4]X koordinatı, 0-319[5]Y koordinatı, 0-319
Sürücü, [0] sütununda altı olay türü yayar:
csi.PIX_OFF_EVENT— bir piksel bir parlaklık azalması algıladı (DIFF_OFFkarşılaştırıcı eşiği aşıldı). X/Y, ateşlenen pikseli gösterir.csi.PIX_ON_EVENT— bir piksel bir parlaklık artışı algıladı (DIFF_ONeşiği aşıldı). X/Y, pikseli gösterir.csi.EXT_TRIGGER_FALLING— sensörün harici tetikleyici pini bir düşen kenar gördü. X/Y kullanılmaz.csi.EXT_TRIGGER_RISING— sensörün harici tetikleyici pini bir yükselen kenar gördü. X/Y kullanılmaz.csi.RST_TRIGGER_FALLING— piksel sıfırlama tetikleyicisi, düşen kenar. X/Y kullanılmaz. Şu anda aygıt yazılımı tarafından üretilmiyor.csi.RST_TRIGGER_RISING— piksel sıfırlama tetikleyicisi, yükselen kenar. X/Y kullanılmaz. Şu anda aygıt yazılımı tarafından üretilmiyor.
GENX320’nin harici tetikleyici girişi, kameranın çerçeve senkronizasyon hattına bağlıdır; bu hat aynı zamanda hem işlemci hem de pin başlığı üzerindeki P10‘a yönlendirilir — senkronizasyon kenarlarını olay akışına enjekte etmek için P10’u sürün ve bunları piksel verisinin yanında EXT_TRIGGER_RISING / EXT_TRIGGER_FALLING olayları olarak yakalayın.
Çoğu uygulama yalnızca PIX_OFF_EVENT ve PIX_ON_EVENT ile ilgilenir; tetikleyici türleri, olayları harici zamanlama sinyalleriyle ilişkilendirmenize olanak tanır.
Olay arabelleğini (EVT_res, 6) şekliyle ayırın; burada EVT_res 1024 ile 65536 arasında ikinin bir kuvvetidir, ardından csi.GENX320_MODE_EVENT ve arabellek boyutuyla csi.IOCTL_GENX320_SET_MODE aracılığıyla olay moduna girin. Arabelleği kapasitesine kadar dolduran ve geçerli satır sayısını döndüren csi.IOCTL_GENX320_READ_EVENTS ile olayları okuyun.
Image.draw_event_histogram, olayları bir gri tonlamalı görüntüye rasterleştirir — her ON olayı için kovaya contrast ekler; her OFF olayı için çıkarır. clear=True önce görüntüyü brightness değerine sıfırlar; clear=False birçok çağrı boyunca birikim yapar:
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())
Histogram modu önyargı ön ayarları, AFK filtresi ve sıcak piksel kalibrasyonu ioctl’lerinin tümü olay modunda da aynı şekilde çalışır — bunları csi.IOCTL_GENX320_SET_MODE sonrasında çağırın.
Polariteye göre filtreleme¶
Yalnızca ON olaylarını (daha parlak bir duruma doğru hareket) veya yalnızca OFF olaylarını tutmak için olaylar dizisini ulab ile dilimleyin:
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)
Uzun pozlama birikimi¶
Olayları birçok çerçeve boyunca aynı görüntüde yığmaya devam etmek için clear=False ayarlayın — sonuç bir hareket-izi görselleştirmesidir. Yeni bir pozlama başlatmak için düzenli olarak sıfırlayın:
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
Yüksek hızlı işleme¶
Olay işleme için CPU’yu serbest bırakmak amacıyla görselleştirmeyi bırakın. İstatistikleri yalnızca her N’inci yinelemede yazdırın — her yinelemede bir yazdırma satırı göndermek, yüksek olay hızlarında darboğaz haline gelir:
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")
Uzamsal-zamansal kontrast (STC) filtresi¶
Gerçek bir hareketli kontrast kenarı, kısa bir zaman penceresi içinde aynı pikselde gürültülü bir olay patlaması tetikleme eğilimindedir — piksel uyumsuzluğu ve analog gürültü, gerçek geçişin çevresinde uygulamaya yararlı olmayan ekstra olaylar üretir. STC filtresi, bir patlamadan yalnızca bir (veya birkaç) olayı tutan ve geri kalanını düşüren bir yonga üzeri son işlemedir.
csi.IOCTL_GENX320_SET_STC ve bir GENX320_STC_* sabiti aracılığıyla seçilen üç strateji uygular. Her mod, bir patlamadan hangi olayları ilettiğiyle tanımlanır:
Mod |
Tutar |
Düşürür |
|---|---|---|
her olay |
hiçbir şey |
|
bir patlamanın ikinci olayı |
ilk + sonraki olaylar |
|
bir patlamanın ilk olayı |
sonraki olaylar |
|
ilk + sonraki kenarlar |
yalnızca gereksiz gürültü |
Ayrıntılı olarak:
csi.GENX320_STC_DISABLE— filtre kapalı, her olay geçer (varsayılan).csi.GENX320_STC_ONLY— bir patlamanın ikinci olayını tutar. Parametre:stc_threshold(ms). Bir piksel üzerindeki yeni bir olay, önceki bir olayınstc_thresholdsüresi içinde gelirse, bir patlamanın “ikincisi” olarak kabul edilir ve iletilir — ilk olay ve aynı patlamadaki sonraki olaylar filtrelenir. İlk vuruş yerine gürültüyle doğrulanmış bir geçiş istediğinizde en iyisidir.csi.GENX320_STC_TRAIL_ONLY— bir patlamanın ilk olayını tutar. Parametre:trail_threshold(ms). Bir piksel ateşlendikten sonra,trail_thresholdgeçene kadar aynı piksel üzerindeki sonraki olaylar düşürülür. Öncü kenarın hassas zamanlamasını korur — polarite değişim anının patlama doğrulamasından daha önemli olduğu durumlarda kullanışlıdır.csi.GENX320_STC_TRAIL— her ikisini birleştirir. Parametreler:stc_thresholdvetrail_threshold(her ikisi de ms). Trail moduna göre öncü kenarı, STC moduna göre sonraki kenarları tutar, böylece bir patlamadan birden fazla olay yine de geçer — tek modlu filtrelerden daha yüksek olay iş hacmi ancak en zengin sinyal.
İki eşik kabaca 13:1 oranı içinde kalmalıdır — sensör, birinin diğerinden ~13 kat fazla olduğu yapılandırmaları reddeder:
csi0.ioctl(csi.IOCTL_GENX320_SET_STC, csi.GENX320_STC_TRAIL, 1, 2)
csi0.ioctl(csi.IOCTL_GENX320_SET_STC, csi.GENX320_STC_DISABLE)
Arabellek derinliği¶
Olay hızları aniden yükseldiğinde, varsayılan üçlü arabellek işlem hattı en son çerçeyi tercih eder ve eskileri atar. Bunun yerine olayları kuyruğa almak için FIFO derinliğini csi.CSI.framebuffers aracılığıyla artırın — ana bilgisayar geride kaldığında biraz daha eski verileri işleme pahasına:
csi0.framebuffers(10) # FIFO depth, > 3 enables queueing
Masaüstü akışı ve görselleştirme¶
Bir ana bilgisayar PC’sinde gerçek zamanlı GUI görselleştirmesi için openmv-projects deposundaki GenX320 Olay Akışı aracı kamerayı bir DearPyGui ön ucuyla eşleştirir. PC GUI’si yan yana iki görselleştirme çalıştırır: bir olay birikim tuvali (Image.draw_event_histogram ile aynı fikir ama seçilebilir paletler ve kayan-pencere vs. otomatik-temizleme modlarıyla) ve bir IIR bant geçiren filtresi tarafından sürülen piksel başına frekans haritası — olay akışında periyodik sinyalleri (dönen fanlar, yanıp sönen LED’ler vb.) doğrudan tespit etmek için kullanışlıdır.
Kamera üzerinde çalışan iki akış betiğiyle gelir:
İşlenmiş mod (
genx320_event_mode_streaming_on_cam.py) — kamera, olaylarıcsi.IOCTL_GENX320_READ_EVENTSile çözer ve her satırı USB üzerinden 12 bayt olarak akıtır ([0]tür,[1]sn,[2]ms,[3]us,[4]x,[5]y). Tel formatı kamera üzerindeki ndarray formatıyla eşleştiği için PC’de tüketmesi kolaydır.Ham mod (
genx320_raw_event_mode_streaming_on_cam.py) — kamera, yonganın yerel 32 bitlik paketlenmiş olay sözcüklerinicsi.IOCTL_GENX320_READ_EVENTS_RAWaracılığıyla akıtır. Bu, işlenmiş moddaki 12 bayta karşı olay başına 4 bayttır (USB üzerinden yaklaşık 3 kat daha az veri), bu nedenle bağlantı darboğaz olduğunda ~3 kat daha yüksek ulaşılabilir olay hızı sağlar. PC, paketlenmiş sözcükleri vektörleştirilmiş numpy kullanarak aynı 6 sütunlu olay düzenine geri çözer, böylece akış aşağısındaki görselleştirici kodu aynıdır.
GenX320’nin üretebileceği hızlarda bağlayıcı kısıt USB iş hacmi olduğundan, GUI’de varsayılan olarak ham mod kullanılır; kamera üzerindeki betiğe işleme mantığı eklemeniz gerekiyorsa işlenmiş moda geçin.