
ゆうき( @BASEBALLY15 )です^^
前回は,Pythonで『居眠り防止機能』を作ったのですが,
画面に「Don’t Sleep」と表示されるだけでした.
そこで,今回は,3秒以上,目が検出されなかった時に,『音』を出す機能を追加しました.
(Spyder(python3.7)を使用)

目次
Pythonで居眠り防止機能を作ってみた!ver2
今回,ご紹介する機能は,以下の通りです.

まず,カスケードファイルで目を検出します.
そして,目が読み取れないときに,「Don’t Sleep」と表示させると同時に,
警告音を出します.
それでは,コードを見ていきましょう⤵
ライブラリ
import cv2
import time
#音を出すために使う
import pygame
今回は,『pygame』というライブラリを使うことで,音を出します.
コード
使う音源
以下のサイトの音源を使って,警告音を出したいと思います.
『無料効果音』
↓(※音量が大きいので,小さくしてから再生してください.)
音源をダウンロードしたら,コードを書いていきます.
(本題)音を出すための関数を作ろう!
まずは,音を出すための関数を作ります.
#mp3ファイルの音源を再生するための関数
def add_sound():
#再生したいmp3ファイル
soundfile = "beam4.mp3"
pygame.mixer.init()
#mp3ファイルを読み込む
pygame.mixer.music.load(soundfile)
#再生開始
pygame.mixer.music.play(1)
#再生開始後,音源の長さだけ待つ(0.25秒)
time.sleep(0.25)
#停止
pygame.mixer.music.stop()
先ほどダウンロードした音源(.mp3)を読み込みます.
そして,再生開始時間と継続時間を指定して,最後に停止させます.
メインとなる関数を作ろう!
次に,目を検出し,読み取れなかった時に,
音を出すための関数(メインとなる関数)を作ります.
def snooz_alery():
#カメラを起動する
cap = cv2.VideoCapture(0)
#始まりの時間を指定
start_time = time.time()
while True:
#----------------------------------------------------------------------------------------------------
#カスケードファイルを用意
cascade_file = "haarcascade_eye_tree_eyeglasses.xml"
#カスケードファイルを読み込む
cascade = cv2.CascadeClassifier(cascade_file)
#----------------------------------------------------------------------------------------------------
#1フレームずつ取得する
ret, frame = cap.read()
#左右を反転する
frame = cv2.flip(frame, 1)
#もし,取得できなかったら,
if not ret:
#終了
break
#画像を縮小
frame = cv2.resize(frame, (500, 300))
#グレイスケールに変換
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
#目の認識を実行
eyes_list = cascade.detectMultiScale(gray, minNeighbors=10)
#----------------------------------------------------------------------------------------------------
#目の部分を四角で囲む
for (x,y,w,h) in eyes_list:
#赤色を用意
red = (0,0,255)
#赤色の枠で囲む
cv2.rectangle(frame, (x,y), (x+w,y+h),red, 1)
#----------------------------------------------------------------------------------------------------
#もし,目が検出できなかった時,
if len(eyes_list) == 0:
#経過時間を指定する
end_time = time.time()
#始まりの時間から経過時間を表示する
print(end_time-start_time)
#もし,3秒経過したら,
if end_time - start_time >= 3:
#mp3ファイルの音源を再生(今回作った関数を読み込む)
add_sound()
#「寝るな!」と表示
cv2.putText(frame,"Don't Sleep!",(10,70),cv2.FONT_HERSHEY_PLAIN,1.5,(0,0,255),2,cv2.LINE_AA)
#もし,目を検出したら,
elif len(eyes_list) > 0:
#時間をもとに戻す
start_time = end_time
#----------------------------------------------------------------------------------------------------
#結果を出力
cv2.imshow("human_body_detect", frame)
#frame_diffの結果を描写
#cv2.imshow("the_difference", frame_diff)
#もし,エンターが押されたら終了
key = cv2.waitKey(1)
if key == 13:
break
cap.release()
cv2.destroyAllWindows()
if __name__ == "__main__":
snooz_alery()
実行してみよう!
そして,実行すると,このように警告音が鳴ります.

終わりに
今回は,3秒以上,目が読み取れなかった時に警告音を出す機能を追加しました.
これで,居眠りを防止するだけでなく,わき見運転も防止できるのではないでしょうか^^
今後は,『目の動き』によって,処理を行う機能を作りたいと思います.
それでは・・・