居眠り防止

ゆうき( @BASEBALLY15 )です^^

最近, 『居眠り』によって事故を引き起こしたというニュースを目にすることがありませんか?

よくニュースで見ます!
この問題を解決するために, 様々な企業が『居眠り防止装置』を作っていますよね・・・

そうなんですよね^^

そこで,今回はPythonを使って,実際に居眠り防止機能を作ってみました^^

居眠り運転ってそんなに多いの?

車を運転する方の中には,「運転をしていて眠くなった」という経験があるのではないでしょうか?

仕事終わりで疲れていたり,高速道路で単調な運転を続けていると,眠くなりますよね.

(画像をクリックすると,引用元を確認できます.)

上のグラフを見てもらうと,緑色の『漫然運転』というのが居眠り運転に該当します.

また,このグラフには載っていないのですが,『過労運転』も居眠り運転に含まれます.

全体に比べて,居眠り運転は少ないかもしれませんが,27年時点で『漫然運転』が約4万件で,『過労運転』が約500件なので,改善する必要がありますね.

引用:SmartDrive Magazine「居眠り運転の原因と防止策」

そこで,今回は,Pythonを使って簡易的な『居眠り防止機能』を作ってみました^^

Pythonで居眠り防止機能を作ってみた!

おおまかな流れはこのようになります.

居眠り防止機能の概略図
(PowerPointで作成)

まず,目をカスケードファイルで検出します.

そして, 目が読み取れた時は,何も表示せず ,

目が読み取れなかった時に,「寝るな!」と表示します.

それでは,コードを見ていきましょう⤵

ライブラリ

import cv2

import time

コード

まずは,カメラを起動します.

カメラを起動しよう!

cap = cv2.VideoCapture(0)

そして今回は,3秒以上,目が読み取れなかった時に,警告を表示したいので,time関数を使います.

time関数を使って,目の検出時間を求めよう!

time関数を使って,始まりの時間と途中経過の時間を求めて,その差が3になった時に,警告を表示します.

time関数を使って,時間差を求める
(PowerPointで作成)
#始まりの時間を指定
start_time = time.time()

「寝るな!」と表示してみよう!

そして,while文を使って,目を3秒以上読み取れなかった時に,「寝るな!」と表示します.

    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:
            
                #「寝るな!」と表示
                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)

        #もし,エンターが押されたら終了
        key = cv2.waitKey(1)
        if key == 13:
            break
        
    cap.release()
    
    cv2.destroyAllWindows()

これを実行すると,カメラが起動し,

目が3秒以上読み取れなかった時に,このように表示されます.

居眠り防止機能

無事,居眠り防止機能を作ることができました^^

終わりに

今回は,目を検出するカスケードファイルを使ったり,

time関数を使ったりして,居眠り防止機能を作ってみました.

今後は,Pythonを使って,目が一定時間読み取れなかった時に,警告音を出したり,

目以外の情報から居眠りを防止する機能を作っていきます.

それでは・・・

Q &A

参考記事

コメントを残す

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

CAPTCHA