import sys
import dlib
import imutils
from PyQt5 import QtWidgets
from PyQt5.QtCore import QThread, pyqtSignal, pyqtSlot
from PyQt5.QtGui import QImage, QPixmap
from PyQt5.QtWidgets import QMainWindow, QGraphicsPixmapItem, QGraphicsScene, QMessageBox, QFileDialog
from cv2 import cv2
from pygame import mixer
from src.UI import Ui_MainWindow
from src.utils import *
import winsound
class MainWindow(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
# 属性
self.adjust_camera_Thread = AdjustCamera_Thread()
self.start_Thread = Start_Thread()
self.setupUi(self)
# 连接槽
self.Cam_Select.currentIndexChanged.connect(self.change_Cam_Select)
self.Button_OpenVideo.clicked.connect(self.open_Video)
self.Button_Start.clicked.connect(self.start)
self.Button_End.clicked.connect(self.end)
self.Button_AdjustCamera_Location.clicked.connect(self.adjust_camera_location)
self.offDuty_Check.clicked.connect(self.change_OffDuty_Check_Status)
self.offDuty_Time.valueChanged.connect(self.change_OffDuty_Value)
self.video.clicked.connect(self.set_open_video)
self.cam.clicked.connect(self.set_open_video)
self.show_eye.clicked.connect(self.set_show_setting)
self.show_head.clicked.connect(self.set_show_setting)
self.show_mouth.clicked.connect(self.set_show_setting)
self.show_key_point.clicked.connect(self.set_show_setting)
self.start_Thread.msg.connect(self.show_Message)
self.start_Thread.picture.connect(self.show_Image)
self.start_Thread.window.connect(self.pop_window)
self.adjust_camera_Thread.picture.connect(self.show_Image)
self.adjust_camera_Thread.msg.connect(self.show_Message)
self.adjust_camera_Thread.window.connect(self.pop_window)
def set_show_setting(self):
isChecked = self.sender().isChecked()
if self.sender() == self.show_eye:
self.start_Thread.set_show_eye(isChecked)
elif self.sender() == self.show_mouth:
self.start_Thread.set_show_mouth(isChecked)
elif self.sender() == self.show_head:
self.start_Thread.set_show_Head(isChecked)
else:
self.start_Thread.set_show_key_point(isChecked)
def set_open_video(self):
if self.video.isChecked():
self.start_Thread.set_open_video(True)
else:
self.start_Thread.set_open_video(False)
def change_OffDuty_Check_Status(self):
self.start_Thread.change_OffDuty_Check_Status(self.offDuty_Check.isChecked())
def change_OffDuty_Value(self):
self.start_Thread.change_OffDuty_Value(self.offDuty_Time.value())
def start(self):
self.start_Thread.start()
def adjust_camera_location(self):
self.adjust_camera_Thread.start()
def end(self):
self.adjust_camera_Thread.close()
self.start_Thread.close()
def change_Cam_Select(self):
self.adjust_camera_Thread.change_cam_select(self.Cam_Select.currentIndex())
self.start_Thread.change_cam_select(self.Cam_Select.currentIndex())
self.output_Window.append("切换摄像头" + str(self.Cam_Select.currentIndex()))
def open_Video(self):
filePath = QFileDialog.getOpenFileName(self, "打开视频文件", "", 'Video files(*.mp4)')
self.output_Window.append("视频文件" + filePath[0] + "加载成功")
self.start_Thread.set_filePath(filePath[0])
self.video.setChecked(True)
def show_Message(self, msg):
self.output_Window.append(msg)
def show_Image(self, image):
height = image.shape[0]
width = image.shape[1]
frame = QImage(image, width, height, QImage.Format_RGB888)
pix = QPixmap.fromImage(frame)
item = QGraphicsPixmapItem(pix)
scene = QGraphicsScene()
scene.addItem(item)
self.graphicsView.setScene(scene)
def pop_window(self, info):
QMessageBox.warning(self, "提示", info, QMessageBox.Yes)
def exit(self):
if self.cap is not None:
self.cap.release()
sys.exit(app.exec_())
class AdjustCamera_Thread(QThread):
picture = pyqtSignal(object)
msg = pyqtSignal(str)
window = pyqtSignal(str)
def __init__(self):
super(AdjustCamera_Thread, self).__init__()
self.predictor = None
self.detector = None
self.cap = None
self.camSelect = 0
self.isClose = False
self.load_Model()
def load_Model(self):
# 初始化DLIB的人脸检测器(HOG),然后创建面部标志物预测
print("[INFO] loading facial landmark predictor...")
# 使用dlib.get_frontal_face_detector() 获得脸部位置检测器
self.detector = dlib.get_frontal_face_detector()
# 使用dlib.shape_predictor获得脸部特征位置检测器
self.predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')
self.msg.emit("脸部特征检测模型加载成功")
def change_cam_select(self, camSelect):
self.camSelect = camSelect
def close(self):
self.isClose = True
def run(self):
self.isClose = False
self.window.emit("请调整摄像头位置,使人脸位于显示框内。调整后请按关闭结束")
self.cap = cv2.VideoCapture(self.camSelect, cv2.CAP_DSHOW)
while True:
ret, frame = self.cap.read()
frame = imutils.resize(frame, width=720)
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 自适应直方图均衡
clahe = cv2.createCLAHE(clipLimit=1.5, tileGridSize=(8, 8))
gray = clahe.apply(gray)
# 使用detector(gray, 0) 进行脸部位置检测
rects = self.detector(gray, 0)
# 面部特征检测
for rect in rects:
# 使用predictor(gray, rect)获得脸部特征位置的信息
shape = self.predictor(gray, rect)
# 将脸部特征信息转换为数组array的格式
shape = face_utils.shape_to_np(shape)
# 获取头部姿态
reprojectdst, euler_angle = get_head_pose(shape)
# 取pitch(har)、yaw、roll旋转角度
pitch = euler_angle[0, 0]
yaw = euler_angle[1, 0]
roll = euler_angle[2, 0]
# 绘制正方体12轴
for start, end in line_pairs:
start_point = (int(reprojectdst[start][0]), int(reprojectdst[start][1]))
end_point = (int(reprojectdst[end][0]), int(reprojectdst[end][1]))
cv2.line(frame, start_point, end_point, (0, 0, 255), 2)
# 实时显示计算结果
cv2.putText(frame, "pitch: {:5.2f}".format(pitch), (10, 60), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0),
2)
cv2.putText(frame, "yaw: {:5.2f}".format(yaw), (180, 60), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 0, 0), 2)
cv2.putText(frame, "roll: {:5.2f}".format(roll), (350, 60), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255),
2)
self.picture.emit(frame)
if self.isClose:
break
self.cap.release()
self.window.emit("摄像头位置调整结束")
class Start_Thread(QThread):
picture = pyqtSignal(object)
msg = pyqtSignal(str)
window = pyqtSignal(str)
def __init__(self):
super(Start_Thread, self).__init__()
self.offDutyTime = 0
self.predictor = None
self.detector = None
self.filePath = None
self.cap = None
self.camSelect = 0
self.isClose = False
self.isOffDutyCheck = False
self.isOpenVideo = False
self.isShowEye = True
self.isShowMouth
Fatigue-detection-system-branch.zip
144 浏览量
2022-12-07
10:33:44
上传
评论
收藏 69.02MB ZIP 举报
m0_72731342
- 粉丝: 2
- 资源: 1832
最新资源
- java项目-学校教务管理系统(jsp+servlet+javabean)-school.zip
- python从用户输入中读取两个数字,并计算它们的和
- python从网上获取数据,并解析HTML页面,最后打印出页面的标题
- 基于TypeScript的轻量级手机网页调试面板设计源码
- 毕业设计基于python+深度学习的用户生成内容视频客观质量评价方法研究源码+详细文档+全部数据资料(高分项目)
- 533059175560086sscs.zip
- Python脚本,用于从用户那里获取两个数字,并计算它们的和、差、积和商
- 编程题类别+样题.rar
- hiprint for Vue2/Vue3 打印、打印设计、可视化设计器、报表设计、元素编辑、可视化打印编辑
- python从网络上获取某个网页的内容,并解析HTML,提取并打印出页面上的所有链接
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈