一、介绍

我国近些年来由于交通行业不断发展,汽车保有量不断上升,众多车辆在行驶的过程中,经常会发生碰撞、追尾等现象,情节严重的就会导致交通安全事故发生。而且在调查研究中发现目前发生交通事故比较多的交通工具就是大型客车,不仅仅因为大型客车体型比较大,而且其自身的安全监管体系还没有得到全面建立,这就加大了客车发生交通事故的可能,对人们的生命和经济都造成非常严重的威胁。
2017年3月7日,交通运输部发出关于贯彻落实交通运输行业标准《营运客车安全技术条件》(JT/T 1094-2016)的通知。《营运客车安全技术条件》下的技术要求第4.1.5条明确规定:9M以上的营运客车要求加装车道偏离预警系统(LDWS)以及符合标准的前碰撞预警(FCW)功能,并在第5条标准实施的过渡期要求里明确规定了13个月的过渡期限。

二、商业需求分析

城市经济不断的发展、范围不断的扩张,运输公司也将走向高速发展。随着政策层面对公共交通安全越来越重视。虽然车辆安装了车载视频监控系统,能够实现车辆实时预览和调度,但是行车的安全得不到保障,司机的操作规范、司机的驾驶行为无法监督,超速、疲劳驾驶、交通违规、开车抽烟、注意力不集中、打电话等不良行为导致的交通意外事故高达95%,车辆损耗是正常损耗的5-10倍,燃油消耗增长10%-50%。

三、本项目介绍与技术

3.1 介绍

本项目开源,是一个比较简单的需求分析,仅仅是用于检测眼睛疲劳,其它需求我暂时不开源,当你可以根据商业需求分析这样做下去,本项目主要给大家一个简单的引导思考。

3.2 技术

采用开源的人脸识别haarcascade_frontalface_default.xml和眼睛识别haarcascade_eye.xml,这是已经训练好的模型,我们可以直接调用。
调用方式也很简单:

face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')

所谓实时检测,我们可以先简单的理解成一段视频,视频又是一帧一帧的,你可以把一帧理解成就是一张图片,我们要检测一个人是否疲劳,就是检测这个人在短时间的眼睛状况,就是分析这段时间每一帧的眼睛图片变化,设定一个标准来判断是否疲劳,这个标准是已经有人实验好了的。

要实时开启摄像头,使用如下函数:

cap = cv2.VideoCapture(0)

传参数为0代表使用一个摄像头,因为我们笔记本只有一个摄像头有,如果传参为1则是使用两个摄像头,我是笔记本,所以我传参0,当然你也可以在这里传入视频,你想检测这个视频里面的驾驶人员是否疲劳,而不是实时检测。
关于opencv视频处理入门我讲过:opencv视频处理入门你可以根据这个进行进一步的修改和理解。

四、基本分析

4.1 模块导入

import cv2
from functools import wraps
from pygame import mixer
import time

模块下载不需要我教了吧?基础都不熟练,请看我基础专栏:python基础教程

4.2 定义一个计数眼睛眨眼的函数

def counter(func):
    @wraps(func)
    def tmp(*args, **kwargs):
        tmp.count += 1
        global lastsave
        if time.time() - lastsave > 3:
            # 这是以秒为单位,所以 5 分钟 = 300 秒
            lastsave = time.time()
            tmp.count = 0
        return func(*args, **kwargs)
    tmp.count = 0
    return tmp

满足闭眼情况输出:

@counter
def closed():
  print ("Eye Closed")

同理闭眼我们也定义一个输出函数:

def openeye():
  print( "Eye is Open")

警报声也定义一个函数:

def sound():
    mixer.init()
    mixer.music.load('sound.mp3')
    mixer.music.play()

4.3眼睛部分处理

用while循环实时检测,对图片进行灰度,detectMultiScale确定目标尺寸大小,后续是圈出眼睛等处理,如果你有基础,看懂他并不太难。

while 1:
    ret, img = cap.read()
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale(gray, 1.3, 5)

    for (x, y, w, h) in faces:
        cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
        roi_gray = gray[y:y + h, x:x + w]
        roi_color = img[y:y + h, x:x + w]

        eyes = eye_cascade.detectMultiScale(roi_gray)

        if eyes is not ():
            for (ex, ey, ew, eh) in eyes:
                cv2.rectangle(roi_color, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 2)
                openeye()
        else:
           closed()
           if closed.count == 4:
               print ("driver is sleeping")
               sound()


    cv2.imshow('img', img)
    k = cv2.waitKey(30) & 0xff

总体评价的话,整个评判疲劳的架构并不是很合理,显得有些粗糙,本项目仅仅是为大家提供一个方向引导,如果你要做毕业设计之类的,光靠这个是肯定不行的。

五、完整代码

''':cvar
公众号:玩转大数据
我微信:hxgsrubxjogxeeag
'''
# coding=utf-8
import cv2
from functools import wraps
from pygame import mixer
import time

lastsave = 0


def counter(func):
    @wraps(func)
    def tmp(*args, **kwargs):
        tmp.count += 1
        global lastsave
        if time.time() - lastsave > 3:
            # 这是以秒为单位,所以 5 分钟 = 300 秒
            lastsave = time.time()
            tmp.count = 0
        return func(*args, **kwargs)

    tmp.count = 0
    return tmp


face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')

cap = cv2.VideoCapture(0)


@counter
def closed():
    print("Eye Closed")


def openeye():
    print("Eye is Open")


def sound():
    mixer.init()
    mixer.music.load('sound.mp3')
    mixer.music.play()


while 1:
    ret, img = cap.read()
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale(gray, 1.3, 5)

    for (x, y, w, h) in faces:
        cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
        roi_gray = gray[y:y + h, x:x + w]
        roi_color = img[y:y + h, x:x + w]

        eyes = eye_cascade.detectMultiScale(roi_gray)

        if eyes is not ():
            for (ex, ey, ew, eh) in eyes:
                cv2.rectangle(roi_color, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 2)
                openeye()
        else:
            closed()
            if closed.count == 4:
                print("driver is sleeping")
                sound()

    cv2.imshow('img', img)
    k = cv2.waitKey(30) & 0xff

cap.release()
cv2.destroyAllWindows()

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐