
ゆうき( @BASEBALLY15 )です^^
最近, 『居眠り』によって事故を引き起こしたというニュースを目にすることがありませんか?
よくニュースで見ます!
この問題を解決するために, 様々な企業が『居眠り防止装置』を作っていますよね・・・
そうなんですよね^^
そこで,今回はPythonを使って,実際に居眠り防止機能を作ってみました^^

目次
居眠り運転ってそんなに多いの?
車を運転する方の中には,「運転をしていて眠くなった」という経験があるのではないでしょうか?
仕事終わりで疲れていたり,高速道路で単調な運転を続けていると,眠くなりますよね.
上のグラフを見てもらうと,緑色の『漫然運転』というのが居眠り運転に該当します.
また,このグラフには載っていないのですが,『過労運転』も居眠り運転に含まれます.
全体に比べて,居眠り運転は少ないかもしれませんが,27年時点で『漫然運転』が約4万件で,『過労運転』が約500件なので,改善する必要がありますね.
そこで,今回は,Pythonを使って簡易的な『居眠り防止機能』を作ってみました^^
Pythonで居眠り防止機能を作ってみた!
おおまかな流れはこのようになります.

まず,目をカスケードファイルで検出します.
そして, 目が読み取れた時は,何も表示せず ,
目が読み取れなかった時に,「寝るな!」と表示します.
それでは,コードを見ていきましょう⤵
ライブラリ
import cv2
import time
コード
まずは,カメラを起動します.
カメラを起動しよう!
cap = cv2.VideoCapture(0)
そして今回は,3秒以上,目が読み取れなかった時に,警告を表示したいので,time関数を使います.
time関数を使って,目の検出時間を求めよう!
time関数を使って,始まりの時間と途中経過の時間を求めて,その差が3になった時に,警告を表示します.

#始まりの時間を指定
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を使って,目が一定時間読み取れなかった時に,警告音を出したり,
目以外の情報から居眠りを防止する機能を作っていきます.
それでは・・・