snapshot_on_face_detection.py
# この作品はMITライセンスの下で提供されています。
# Copyright (c) 2013-2023 OpenMV LLC. 全著作権所有。
# https://github.com/openmv/openmv/blob/master/LICENSE
#
# 顔検出時のスナップショットの例
#
# 注意: この例を実行するにはSDカードが必要です。
#
# この例では、OpenMV Camの顔追跡機能を使って
# 写真を撮影します。
import csi
import image
import random
import machine
csi0 = csi.CSI()
csi0.reset() # センサーをリセットして初期化します。
csi0.pixformat(csi.GRAYSCALE) # ピクセルフォーマットをRGB565(またはGRAYSCALE)に設定します
csi0.framesize(csi.QVGA) # フレームサイズをQVGAに設定します
csi0.snapshot(time=2000) # 設定が反映されるまで待ちます。
led = machine.LED("LED_RED")
# 顔検出用のHaarCascadeを読み込みます。これはOpenMV Camが
# 以下のfind_features()メソッドで顔を検出するために使用するオブジェクトです。OpenMV
# Camにはfrontalface用のHaarCascadeが内蔵されています。デフォルトでは
# HaarCascadeの全ステージが読み込まれます。ただし、処理速度を上げるために
# 精度を犠牲にしてステージ数を調整することもできます。frontalface用HaarCascadeには25の
# ステージがあります。
face_cascade = image.HaarCascade("/rom/haarcascade_frontalface.cascade", stages=25)
while True:
print("About to start detecting faces...")
csi0.snapshot(time=2000) # ユーザーが準備するための時間を与えます。
print("Now detecting faces!")
diff = 10 # 10フレーム連続で検出できたら顔を検出したとみなします。
while diff:
img = csi0.snapshot()
# しきい値は0.0から1.0の間で設定できます。しきい値を高くすると
# 検出率は上がりますが誤検出も増えます。scale値は
# マッチングスケールを制御し、より小さな顔を検出できるようにします。
faces = img.find_features(face_cascade, threshold=0.5, scale=1.5)
if faces:
diff -= 1
for r in faces:
img.draw_rectangle(r)
led.on()
print("Face detected! Saving image...")
csi0.snapshot().save("snapshot-%d.jpg" % random.getrandbits(32)) # 写真を保存します。
led.off()