用python检测是否打瞌睡并报警提醒

我们在开长途车的时候可能太累要打瞌睡,这是很危险的,很多高端车配备了瞌睡检测系统,那么是怎么实现的呢,今天小编带大家看看python怎么实现一个打瞌睡检测并报警的程序,先看看下面的效果图,

用python检测是否打瞌睡并报警提醒


原理就是使用OpenCV检测视频流中的眨眼行为,并检测眼睛已经闭合了多长时间。如果眼睛已经闭合了超过了一定时间,系统便认为是打瞌睡并发出警报以唤醒他们并引起他们的注意。

▊ 在汽车上安装摄像头

我用于该项目的相机是Logitech C920。我喜欢这款相机,比较实惠。可以全1080p拍摄。即插即用几乎与我尝试过的所有设备(包括Raspberry Pi)兼容 。我拿了这台相机,并用一些双面胶带将其安装在仪表板的顶部,以防止在驱动过程中相机四处移动。然后将相机连接到我旁边座位上的MacBook Pro。

▊ 检测流程

▶首先,我们将设置一个相机来监视人脸流:

用python检测是否打瞌睡并报警提醒

▶如果找到了脸部,我们将应用脸部界标检测并提取眼睛区域:

用python检测是否打瞌睡并报警提醒

▶现在我们有了眼睛区域,我们可以计算眼睛的长宽比以确定眼睛是否闭合:

用python检测是否打瞌睡并报警提醒

▶如果眼睛的纵横比表明眼睛已经闭合了足够长的时间,我们将发出警报以唤醒驾驶员:
用python检测是否打瞌睡并报警提醒

▊ 具体实现代码

我们将使用OpenCV,dlib和Python来实现上面详述的打瞌睡检测算法。

使用OpenCV构建睡意检测器

我们新建一个新文件,命名为 detect_drowsiness。py ,并插入以下代码:

# import the necessary packages
from scipy.spatial import distance as dist
from imutils.video import VideoStream
from imutils import face_utils
from threading import Thread
import numpy as np
import playsound
import argparse
import imutils
import time
import dlib
import cv2


第2-12行导入了我们所需的Python包。

我们将需要SciPy 软件包,以便我们可以在计算眼睛长宽比时计算出面部界标点之间的欧几里得距离(并非严格要求,但是如果您打算在计算机视觉,图像处理中进行任何工作,则应该安装SciPy ,或机器学习空间)。

我们还需要imutils软件包,这是我的一系列计算机视觉和图像处理功能,以简化 OpenCV的使用。

如果您还没有安装imutils在系统上,则可以安装/升级imutils通过:

$ pip install --upgrade imutils


我们还将导入 threading,因此我们可以在与主线程不同的线程中播放警报,以确保在警报响起时脚本不会暂停执行。
为了实际播放WAV / MP3警报,我们需要playound库,这是一个纯Python的跨平台实现,用于播放简单的声音。

playound库可通过以下方式方便地安装:

$ pip install playsound
但是,如果您使用的是macOS(就像我在该项目中所做的那样),则还需要安装pyobjc,否则将出错:

$ pip install pyobjc
为了检测和定位面部标志,我们需要 在第11行中导入 的dlib库。如果您需要在系统上安装dlib。

接下来,我们需要定义我们的 声音警报 函数 参数为音频文件路径,然后播放该文件:

def sound_alarm(path):
	# play an alarm sound
	playsound.playsound(path)


我们还需要定义 eye_aspect_ratio 用于计算垂直眼界标之间的距离与水平眼界标之间的距离之比的函数:
def eye_aspect_ratio(eye):
	# compute the euclidean distances between the two sets of
	# vertical eye landmarks (x, y)-coordinates
	A = dist.euclidean(eye[1], eye[5])
	B = dist.euclidean(eye[2], eye[4])
	# compute the euclidean distance between the horizontal
	# eye landmark (x, y)-coordinates
	C = dist.euclidean(eye[0], eye[3])
	# compute the eye aspect ratio
	ear = (A + B) / (2.0 * C)
	# return the eye aspect ratio
	return ear
睁开眼睛时,眼睛纵横比的返回值将近似恒定。然后,该值将在眨眼期间迅速降低至零。

如果眼睛闭合,则眼睛的长宽比将再次保持近似恒定,但将比睁开眼睛时的长宽比 小得多。

用python检测是否打瞌睡并报警提醒

左上:当眼睛睁开时,眼睛界标的可视化。右上:闭上眼睛时的眼睛地标。底部:绘制随时间变化的眼睛纵横比。眼睛纵横比的下降表示眨眼(Soukupová和Čech的图1)。
在 左上角,我们的眼睛完全张开,并绘制了眼睛的面部轮廓。然后在 右上角,我们的眼睛闭上了。然后, 底部绘制随时间变化的眼睛纵横比。
如我们所见,眼睛的纵横比是恒定的(表示眼睛睁开),然后迅速下降到零,然后再次增加,表明眨眼了。

在睡意检测器的情况下,我们将监视眼睛的宽高比,以查看该值是否 下降但 没有再次增加,从而暗示该人已经闭上了眼睛。

接下来,让我们分析命令行参数:

# construct the argument parse and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-p", "--shape-predictor", required=True,
	help="path to facial landmark predictor")
ap.add_argument("-a", "--alarm", type=str, default="",
	help="path alarm .WAV file")
ap.add_argument("-w", "--webcam", type=int, default=0,
	help="index of webcam on system")
args = vars(ap.parse_args())


我们的打瞌睡检测器需要一个命令行参数,然后是两个可选参数,每个参数在下面进行详细说明:

-shape-predictor 形状预测器 :这是dlib预先训练的面部标志检测器的路径。

- alarm 报警 :在这里,您可以选择指定要用作报警音频文件的路径。

-webcam 摄像头 :此整数控制内...

点击查看剩余70%

{{collectdata}}

网友评论0