在白天和晚上长途运输货物和重物的卡车司机,经常会缺乏睡眠。疲劳和困倦是高速公路重大事故的一些主要原因。汽车工业正在研究一些技术,这些技术可以检测到睡意并提醒驾驶员。
在该项目中,我们将使用Raspberry Pi,OpenCV和Pi摄像头模块为驾驶员构建睡眠感应和警报系统。该系统的基本目的是跟踪驾驶员的面部状况和眼睛运动,如果驾驶员感到困倦,则该系统将触发警告消息。这是我们以前的面部标志检测和面部识别应用程序的扩展。
所需组件
硬件部件
- 树莓派3
- Pi相机模组
- 微型USB电缆
- 蜂鸣器
软件和在线服务
- OpenCV的
- Dlib
- Python3
在继续进行此 驱动程序嗜睡检测项目之前, 首先,我们需要在该项目中安装OpenCV,imutils,dlib,Numpy和其他一些依赖项。OpenCV在这里用于数字图像处理。数字图像处理的最常见应用是对象检测,面部识别和人员计数器。
在这里,我们仅使用Raspberry Pi,Pi相机和蜂鸣器来构建此睡眠检测系统。
在Raspberry Pi中安装OpenCV
在安装OpenCV和其他依赖项之前,需要对Raspberry Pi进行完全更新。使用以下命令将Raspberry Pi更新到最新版本:
sudo apt-get更新
然后使用以下命令安装在Raspberry Pi上安装OpenCV所需的依赖项。
sudo apt-get install libhdf5-dev -y sudo apt-get install libhdf5-serial-dev -y sudo apt-get install libatlas-base-dev -y sudo apt-get install libjasper-dev -y sudo apt-get install libqtgui4 –y sudo apt-get安装libqt4-test –y
最后,使用以下命令在Raspberry Pi上安装OpenCV。
pip3安装opencv-contrib-python == 4.1.0.25
如果您不熟悉OpenCV,请查看我们以前的Raspberry pi OpenCV教程:
- 使用CMake在Raspberry Pi上安装OpenCV
- 使用Raspberry Pi和OpenCV进行实时人脸识别
- 使用Raspberry Pi和OpenCV进行车牌识别
- 使用OpenCV和Raspberry Pi进行人群估计
我们还从初学者开始创建了一系列OpenCV教程。
安装其他必需的软件包
在对Raspberry Pi进行Drowsiness Detector编程之前,让我们安装其他必需的软件包。
安装dlib: dlib是现代工具包,其中包含针对实际问题的机器学习算法和工具。使用以下命令安装dlib。
pip3安装dlib
安装NumPy: NumPy是科学计算的核心库,其中包含一个功能强大的n维数组对象,提供了用于集成C,C ++等的工具。
pip3安装numpy
安装face_recognition模块:该库用于从Python或命令行识别和处理面部。使用以下命令安装人脸识别库。
Pip3安装face_recognition
最后,使用以下命令安装 eye_game 库:
pip3安装眼睛游戏
对Raspberry Pi进行编程
页面末尾提供了使用OpenCV的驾驶员嗜睡检测器的完整代码。在这里,我们正在解释代码的一些重要部分,以更好地理解。
因此,像往常一样,通过包含所有必需的库来启动代码。
import face_recognition import cv2 import numpy as np import time import cv2 import RPi.GPIO as GPIO import eye_game
之后,创建一个实例以从pi摄像机获取视频源。如果使用的摄像机不止一台,则在 cv2.VideoCapture(0) 函数 中将 零替换为一。
video_capture = cv2.VideoCapture(0)
现在,在接下来的几行中,输入文件名和文件路径。就我而言,代码和文件都在同一文件夹中。然后使用面部编码获取图片中的面部位置。
img_image = face_recognition.load_image_file(“ img.jpg”)img_face_encoding = face_recognition.face_encodings(img_image)
之后,创建两个数组以保存面部及其名称。我只使用一张图片;您可以在代码中添加更多图像及其路径。
known_face_encodings = known_face_names =
然后创建一些变量来存储面部部位的位置,面部名称和编码。
face_locations = face_encodings = face_names = process_this_frame = True
在 while 函数中,从流中捕获视频帧,并将帧调整为较小的尺寸,还将捕获的帧转换为RGB颜色以进行面部识别。
ret,frame = video_capture.read()small_frame = cv2.resize(frame,(0,0),fx = 0.25,fy = 0.25)rgb_small_frame = small_frame
之后,运行面部识别过程以将视频中的面部与图像进行比较。并获得面部部位的位置。
如果process_this_frame:face_locations = face_recognition.face_locations(rgb_small_frame)face_encodings = face_recognition.face_encodings(rgb_small_frame,face_locations)cv2.imwrite(file,small_frame)
如果识别出的脸部与图像中的脸部相匹配,则调用 eyegame函数 来跟踪眼睛的运动。该代码将反复跟踪眼睛和眼球的位置。
face_distances = face_recognition.face_distance(known_face_encodings,face_encoding)best_match_index = np.argmin(face_distances)如果匹配:name = known_face_names direction = eye_game.get_eyeball_direction(file)print(direction)
如果代码在10秒钟内未检测到任何眼动,则它将触发警报以唤醒人员。
否则:count = 1 + count print(count)if(count> = 10):GPIO.output(BUZZER,GPIO.HIGH)time.sleep(2)GPIO.output(BUZZER,GPIO.LOW)print(“警告! !警报!!检测到驾驶员困倦“)
然后使用OpenCV函数在脸部周围绘制一个矩形,并在其上放置文本。另外,使用 cv2.imshow 函数显示视频帧。
cv2.rectangle(frame,(left,top),(right,bottom),(0,255,0),2)cv2.rectangle(frame,(left,bottom-35),(right,bottom),(0 ,255、0),cv2.FILLED)字体= cv2.FONT_HERSHEY_DUPLEX cv2.putText(frame,name,(left + 6,bottom-6),font,1.0,(0,0,255),1)cv2.imshow (“视频”,框架)将键“ S”设置为停止代码。如果cv2.waitKey(1)和0xFF == ord('s'):中断
测试驾驶员嗜睡检测系统
代码准备就绪后,将Pi摄像头和蜂鸣器连接到Raspberry Pi并运行代码。大约10秒钟后,将出现一个窗口,其中包含Raspberry Pi摄像机的实时流。当设备识别出面部时,它将在框上打印您的名字并开始跟踪眼睛的运动。现在,闭上眼睛7至8秒钟以测试警报。当计数超过10时,它将触发警报,提醒您有关情况。
这是您可以使用OpenCV和Raspberry Pi构建睡意检测器的方法。向下滚动以查看有效的视频和代码。