in_memory_advanced_frame_differencing.py
# この作品はMITライセンスの下で提供されています。
# Copyright (c) 2013-2023 OpenMV LLC. 全著作権所有。
# https://github.com/openmv/openmv/blob/master/LICENSE
#
# 高度なフレーム差分の例
#
# この例は、OpenMV Cam でフレーム差分を使用する方法を示します。この
# 例が高度である理由は、時間とともに変化する背景画像に対応するため
# 背景画像の更新を行うからです。
import csi
import image
import time
TRIGGER_THRESHOLD = 5
BG_UPDATE_FRAMES = 50 # ブレンドを行うまでのフレーム数。
BG_UPDATE_BLEND = 128 # どの程度ブレンドするか…([0-255]==[0.0-1.0])。
csi0 = csi.CSI()
csi0.reset() # センサーをリセットして初期化します。
csi0.pixformat(csi.RGB565) # または csi.RGB565
csi0.framesize(csi.QVGA) # または csi.QQVGA (またはその他)
csi0.snapshot(time=2000) # 新しい設定を反映させます。
csi0.auto_whitebal(False) # ホワイトバランスをオフにします。
clock = time.clock() # FPSを計測します。
# ヒープ上に2つ目のフレームバッファを作成します。
extra_fb = image.Image(csi0.width(), csi0.height(), csi0.pixformat())
print("About to save background image...")
csi0.snapshot(time=2000) # ユーザーが準備するための時間を与えます。
extra_fb.draw_image(csi0.snapshot())
print("Saved background image - Now frame differencing!")
triggered = False
frame_count = 0
while True:
clock.tick() # snapshot()呼び出し間の経過ミリ秒を計測します。
img = csi0.snapshot() # 画像を撮影して返します。
frame_count += 1
if frame_count > BG_UPDATE_FRAMES:
frame_count = 0
# 新しいフレームをブレンドします。ここで 255-alpha を使うのは
# 新しいフレームを背景にブレンドしたいためで、背景を
# 新しいフレームにブレンドする (それは単に alpha になります) のではありません。ブレンドは各ピクセルを
# ((NEW*(alpha))+(OLD*(255-alpha)))/255 で置き換えます。そのため、alpha が小さいと
# 新しい画像のブレンドが弱くなり、alpha が大きいと
# 新しい画像のブレンドが強くなります。この更新ではそれを逆にする必要があります。
img.blend(extra_fb, alpha=(255 - BG_UPDATE_BLEND))
extra_fb.draw_image(img)
# 画像を「abs(NEW-OLD)」のフレーム差分に置き換えます。
img.difference(extra_fb)
hist = img.get_histogram()
# 以下のコードは、99 パーセンタイル値 (例えば
# 外れ値を除いた最大値) を 90 パーセンタイル値 (例えば非最大の値) と比較することで動作します。
# 2 つの値の差は、差分
# 画像でより多くのピクセルが変化しているように見えるほど大きくなります。
diff = hist.get_percentile(0.99).l_value - hist.get_percentile(0.90).l_value
triggered = diff > TRIGGER_THRESHOLD
print(clock.fps(), triggered) # 注: OpenMV Camは接続時、速度が約半分になります
# コンピュータに接続されている間。切断するとFPSは向上します。