genx320_event_mode_calibration.py
# この作品はMITライセンスの下で提供されています。
# Copyright (c) 2013-2025 OpenMV LLC. 全著作権所有。
# https://github.com/openmv/openmv/blob/master/LICENSE
#
# この例では、Prophesee製のgenx320イベントカメラを
# イベントストリーミングモードを使用してカメラを校正します。
import csi
import image
import time
# https://micropython-ulab.readthedocs.io/en/latest/index.html
from ulab import numpy as np
CAL_EVENT_COUNT = 10000 # 校正のために収集するイベント数。
CAL_SIGMA = 0.5 # ホットピクセル検出のための標準偏差。
# ヒストグラム画像を描画するためのサーフェス。
img = image.Image(320, 320, image.GRAYSCALE)
# カメラのイベントを格納します
# 形状: (EVT_res, 6)。EVT_resはイベント解像度です
# EVT_res: 1024から65536の間の2のべき乗である必要があります。
# 列:
# [0] イベントタイプ
# [1] 秒単位のタイムスタンプ
# [2] ミリ秒単位のタイムスタンプ
# [3] マイクロ秒単位のタイムスタンプ
# [4] GENX320でのX座標 0~319
# [5] GENX320でのY座標 0~319
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()
t = time.ticks_ms()
calibrated = False
while True:
clock.tick()
# カメラから2048件のイベントを読み取ります。
# 有効なイベント数(0~2048)または負のエラーコードを返します。
event_count = csi0.ioctl(csi.IOCTL_GENX320_READ_EVENTS, events)
# イベントをヒストグラム画像として描画します。
# clear=Trueの場合、描画前に画像は"brightness"にリセットされます。
# PIX_ON_EVENTごとに、ビンの値に"contrast"を加算します。
# PIX_OFF_EVENTごとに減算し、[0, 255]の範囲にクランプします。
# clear=Falseの場合、ヒストグラムは複数回の呼び出しにわたって累積されます。
img.draw_event_histogram(events[:event_count], clear=True, brightness=128, contrast=64)
# IDEが取得・表示できるように、画像をjpegバッファにプッシュします。
# IDEは、以下に表示されるオンボードカメラのフレームレートよりも
# はるかに低いレートでカメラからフレームを取得します。
img.flush()
# 最初に未校正の画像を表示します。
if not calibrated and time.ticks_diff(time.ticks_ms(), t) > 5000:
disabled_pixels = csi0.ioctl(csi.IOCTL_GENX320_CALIBRATE, CAL_EVENT_COUNT, CAL_SIGMA)
print(f'Disabled {disabled_pixels} hot pixels.')
calibrated = True
print(event_count, clock.fps())