1+ import sys
2+ import os
3+ from glob import glob
4+ from PySide2 import QtWidgets ,QtCore ,QtGui
5+ from PySide2 .QtWidgets import QMainWindow , QFileDialog , QMessageBox
6+ from PySide2 .QtCore import QDir , QTimer ,Slot
7+ from PySide2 .QtGui import QPixmap ,QImage
8+ from ui_mainwindow import Ui_MainWindow
9+ import cv2
10+ import myframe
11+
12+ # 定义变量
13+ # 眼睛长宽比
14+ # 闪烁阈值
15+ EYE_AR_THRESH = 0.15
16+ EYE_AR_CONSEC_FRAMES = 2
17+ # 打哈欠长宽比
18+ # 闪烁阈值
19+ MAR_THRESH = 0.65
20+ MOUTH_AR_CONSEC_FRAMES = 3
21+ # 初始化帧计数器和眨眼总数
22+ COUNTER = 0
23+ TOTAL = 0
24+ # 初始化帧计数器和打哈欠总数
25+ mCOUNTER = 0
26+ mTOTAL = 0
27+ # 行为帧数变量
28+ ActionCOUNTER = 0
29+ # 周期变量
30+ Roll = 0
31+ Rolleye = 0
32+ Rollmouth = 0
33+
34+ class MainWindow (QMainWindow , Ui_MainWindow ):
35+ def __init__ (self ):
36+ super (MainWindow , self ).__init__ ()
37+ self .setupUi (self )
38+ # 打开文件类型,用于类的定义
39+ self .f_type = 0
40+
41+ def window_init (self ):
42+ # 设置控件属性
43+ self .label .setText ("请打开摄像头" )
44+ self .label_2 .setText ("疲劳检测:" )
45+ self .label_3 .setText ("眨眼次数:0" )
46+ self .label_4 .setText ("哈欠次数:0" )
47+ self .label_5 .setText ("行为检测:" )
48+ self .label_6 .setText ("手机" )
49+ self .label_7 .setText ("抽烟" )
50+ self .label_8 .setText ("喝水" )
51+ self .label_9 .setText ("是否存在分心行为" )
52+ self .label_10 .setText ("是否为疲劳状态" )
53+ self .menu .setTitle ("打开" )
54+ self .actionOpen_camera .setText ("打开摄像头" )
55+ # 菜单按钮 槽连接 到函数
56+ self .actionOpen_camera .triggered .connect (CamConfig_init )
57+ # 自适应窗口缩放
58+ self .label .setScaledContents (True )
59+ # def printf(self, mes):
60+ # self.textBrowser.append(mes) # 在指定的区域显示提示信息
61+ # self.cursot = self.textBrowser.textCursor()
62+ # self.textBrowser.moveCursor(self.cursot.End)
63+
64+ # 定义摄像头类
65+ class CamConfig :
66+ def __init__ (self ):
67+ Ui_MainWindow .printf (window ,"正在打开摄像头请稍后..." )
68+ # 设置时钟
69+ self .v_timer = QTimer ()
70+ # 打开摄像头
71+ self .cap = cv2 .VideoCapture (0 )
72+ if not self .cap :
73+ Ui_MainWindow .printf (window ,"打开摄像头失败" )
74+ return
75+ # 设置定时器周期,单位毫秒
76+ self .v_timer .start (20 )
77+ # 连接定时器周期溢出的槽函数,用于显示一帧视频
78+ self .v_timer .timeout .connect (self .show_pic )
79+ Ui_MainWindow .printf (window ,"载入成功,开始运行程序" )
80+ Ui_MainWindow .printf (window ,"" )
81+ Ui_MainWindow .printf (window ,"开始执行疲劳检测..." )
82+ window .statusbar .showMessage ("正在使用摄像头..." )
83+ def show_pic (self ):
84+ # 全局变量
85+ global EYE_AR_THRESH ,EYE_AR_CONSEC_FRAMES ,MAR_THRESH ,MOUTH_AR_CONSEC_FRAMES ,COUNTER ,TOTAL ,mCOUNTER ,mTOTAL ,ActionCOUNTER ,Roll ,Rolleye ,Rollmouth
86+ # 读取一帧
87+ success , frame = self .cap .read ()
88+ if success :
89+ # Mat格式图像转Qt中图像的方法
90+ #检测
91+ ret ,frame = myframe .frametest (frame )
92+ lab ,eye ,mouth = ret
93+ #行为判断
94+ ActionCOUNTER += 1
95+ for i in lab :
96+ if (i == "phone" ):
97+ window .label_6 .setText ("<font color=red>正在用手机</font>" )
98+ window .label_9 .setText ("<font color=red>请不要分心</font>" )
99+ if ActionCOUNTER > 0 :
100+ ActionCOUNTER -= 1
101+ elif (i == "smoke" ):
102+ window .label_7 .setText ("<font color=red>正在抽烟</font>" )
103+ window .label_9 .setText ("<font color=red>请不要分心</font>" )
104+ if ActionCOUNTER > 0 :
105+ ActionCOUNTER -= 1
106+ elif (i == "drink" ):
107+ window .label_7 .setText ("<font color=red>正在用喝水</font>" )
108+ window .label_9 .setText ("<font color=red>请不要分心</font>" )
109+ if ActionCOUNTER > 0 :
110+ ActionCOUNTER -= 1
111+ #疲劳判断
112+ if eye < EYE_AR_THRESH : # 眼睛长宽比:0.2
113+ COUNTER += 1
114+ Rolleye += 1
115+ else :
116+ # 如果连续3次都小于阈值,则表示进行了一次眨眼活动
117+ if COUNTER >= EYE_AR_CONSEC_FRAMES : # 阈值:3
118+ TOTAL += 1
119+ window .label_3 .setText ("眨眼次数:" + str (TOTAL ))
120+ # 重置眼帧计数器
121+ COUNTER = 0
122+ if mouth > MAR_THRESH : # 张嘴阈值0.5
123+ mCOUNTER += 1
124+ Rollmouth += 1
125+ else :
126+ # 如果连续3次都小于阈值,则表示打了一次哈欠
127+ if mCOUNTER >= MOUTH_AR_CONSEC_FRAMES : # 阈值:3
128+ mTOTAL += 1
129+ window .label_4 .setText ("哈欠次数:" + str (mTOTAL ))
130+ # 重置嘴帧计数器
131+ mCOUNTER = 0
132+ if ActionCOUNTER == 15 :
133+ window .label_6 .setText ("手机" )
134+ window .label_7 .setText ("抽烟" )
135+ window .label_8 .setText ("喝水" )
136+ window .label_9 .setText ("" )
137+ ActionCOUNTER = 0
138+ show = cv2 .cvtColor (frame , cv2 .COLOR_BGR2RGB )
139+ showImage = QImage (show .data , show .shape [1 ], show .shape [0 ], QImage .Format_RGB888 )
140+ window .label .setPixmap (QPixmap .fromImage (showImage ))
141+ Roll += 1
142+ if Roll == 150 :
143+ perclos = (Rolleye / Roll ) + (Rollmouth / Roll )* 0.2
144+ Ui_MainWindow .printf (window ,"过去150帧中,Perclos得分为" + str (round (perclos ,3 )))
145+ if perclos > 0.38 :
146+ Ui_MainWindow .printf (window ,"当前处于疲劳状态" )
147+ window .label_10 .setText ("<font color=red>疲劳!!!</font>" )
148+ Ui_MainWindow .printf (window ,"" )
149+ else :
150+ Ui_MainWindow .printf (window ,"当前处于清醒状态" )
151+ window .label_10 .setText ("清醒" )
152+ Ui_MainWindow .printf (window ,"" )
153+ #归零
154+ Roll = 0
155+ Rolleye = 0
156+ Rollmouth = 0
157+ Ui_MainWindow .printf (window ,"重新开始执行疲劳检测..." )
158+ def CamConfig_init ():
159+ window .f_type = CamConfig ()
160+
161+
162+ if __name__ == '__main__' :
163+ app = QtWidgets .QApplication (sys .argv )
164+ window = MainWindow ()
165+ window .window_init ()
166+ window .show ()
167+ sys .exit (app .exec_ ())
0 commit comments