Pythonで居眠り防止を作ってみたver2

ゆうき( @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秒以上,目が読み取れなかった時に警告音を出す機能を追加しました.

これで,居眠りを防止するだけでなく,わき見運転も防止できるのではないでしょうか^^

今後は,『目の動き』によって,処理を行う機能を作りたいと思います.

それでは・・・

Q &A

参考資料

https://qiita.com/kekeho/items/a0b93695d8a8ac6f1028

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA