pyqt5之眨眼检测
PYQT5 GUI界面之眨眼检测
- pyqt5界面的设计:
- PYQT5工具设计:
- PYQT5代码设计:
- 眨眼检测:
- 人脸检测,确定需要取的特征点:
- 眨眼数的计算:
- EAR阈值的计算:
- 眨眼检测完整代码:
- 不足之处:
这个小程序需要用到的知识:
- PYQT5的使用
- 人脸识别之眨眼检测
pyqt5界面的设计:
PYQT5工具设计:
这是使用PYQT5的设计工具设计的,主要部件就一个QDialog一个Qlabel标签和两个QPushButton,当然要设置一些属性。这些属性我就不一一描述了,直接上界面的代码吧。界面除了可以直接使用设计工具完成,也可直接使用代码设计。
PYQT5代码设计:
上述界面对应的代码如下:
from PyQt5 import QtCore, QtGui, QtWidgetsclass Ui_Dialog(object):def setupUi(self, Dialog):Dialog.setObjectName("Dialog")Dialog.resize(1200, 750)self.start_But = QtWidgets.QPushButton(Dialog)self.start_But.setGeometry(QtCore.QRect(990, 150, 140, 80))self.start_But.setObjectName("start_But")self.stop_But = QtWidgets.QPushButton(Dialog)self.stop_But.setGeometry(QtCore.QRect(990, 390, 140, 80))self.stop_But.setObjectName("stop_But")self.label = QtWidgets.QLabel(Dialog)self.label.setGeometry(QtCore.QRect(10, 10, 900, 720))self.label.setObjectName("label")self.retranslateUi(Dialog)QtCore.QMetaObject.connectSlotsByName(Dialog)def retranslateUi(self, Dialog):_translate = QtCore.QCoreApplication.translateDialog.setWindowTitle(_translate("Dialog", "Dialog"))self.start_But.setText(_translate("Dialog", "开始"))self.stop_But.setText(_translate("Dialog", "停止"))self.label.setText(_translate("Dialog", "label_video"))
眨眼检测:
由于要进行眨眼检测,所以我们需要用到人脸识别技术,这里采用68点人脸检测技术。使用该技术一定要确保安装了dlib库。只是基础的眨眼检测,所以采用眼睛纵横比(EAR)来判断是否眨眼。
人脸检测,确定需要取的特征点:
#人脸识别,加载需要用到的模块
detector = dlib.get_frontal_face_detector()
sp68 = dlib.shape_predictor("./models/shape_predictor_68_face_landmarks.dat")
EYE_AR_THRESH = 0.3 # EAR阈值
EYE_AR_CONSEC_FRAMES = 3 # 当EAR小于阈值时,接连多少帧一定发生眨眼动作
# 对应特征点的序号
RIGHT_EYE_START = 37 - 1
RIGHT_EYE_END = 42 - 1
LEFT_EYE_START = 43 - 1
LEFT_EYE_END = 48 - 1
眨眼数的计算:
points = face_utils.shape_to_np(shape)
leftEye = points[LEFT_EYE_START:LEFT_EYE_END + 1]
rightEye = points[RIGHT_EYE_START:RIGHT_EYE_END + 1]
leftEAR = eye_aspect_ratio(leftEye)
rightEAR = eye_aspect_ratio(rightEye)
ear = (leftEAR + rightEAR) / 2.0
if ear < EYE_AR_THRESH:self.frame_counter += 1
else:if self.frame_counter >= EYE_AR_CONSEC_FRAMES:self.blink_counter += 1
EAR阈值的计算:
A = dist.euclidean(eye[1], eye[5])
B = dist.euclidean(eye[2], eye[4])
C = dist.euclidean(eye[0], eye[3])
ear = (A + B) / (2.0 * C)
眨眼检测完整代码:
import sys
import _thread
import numpy as np
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import QTimer,QThread,pyqtSignal
import cv2
import dlib
import threading,time
from imutils import face_utils
from scipy.spatial import distance as dist
import os
curPath = os.path.abspath(os.path.dirname(__file__))
rootPath = os.path.split(curPath)[0]
sys.path.append(rootPath)
from ui import video_show_uidef eye_aspect_ratio(eye):# print(eye)A = dist.euclidean(eye[1], eye[5])B = dist.euclidean(eye[2], eye[4])C = dist.euclidean(eye[0], eye[3])ear = (A + B) / (2.0 * C)return earclass Frm_blinking(QDialog):def __init__(self):super().__init__()self.ui = video_show_ui.Ui_Dialog()self.ui.setupUi(self)self.working = Falseself.frame_counter = 0self.blink_counter = 0self.init_ui()def init_ui(self):self.ui.start_But.clicked.connect(self.start_video_show)self.ui.stop_But.clicked.connect(self.stop_video_show)self.ui.start_But.setEnabled(True)self.ui.stop_But.setEnabled(False)def start_video_show(self):self.cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)self.working = True_thread.start_new_thread(self.showing, ()) #开启线程self.ui.start_But.setEnabled(False)self.ui.stop_But.setEnabled(True)def stop_video_show(self):if self.working:self.working = Falseself.cap.release()_thread.exit() #关闭线程self.ui.start_But.setEnabled(True)self.ui.stop_But.setEnabled(False)def showing(self):self.ui.start_But.setEnabled(False)self.ui.stop_But.setEnabled(True)while self.working:QApplication.processEvents()detector = dlib.get_frontal_face_detector()sp68 = dlib.shape_predictor("./models/shape_predictor_68_face_landmarks.dat")EYE_AR_THRESH = 0.3 # EAR阈值EYE_AR_CONSEC_FRAMES = 3 # 当EAR小于阈值时,接连多少帧一定发生眨眼动作# 对应特征点的序号RIGHT_EYE_START = 37 - 1RIGHT_EYE_END = 42 - 1LEFT_EYE_START = 43 - 1LEFT_EYE_END = 48 - 1while (self.cap.isOpened()):ret, frame = self.cap.read()gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)rects = detector(gray, 0)for rect in rects:shape = sp68(gray, rect)points = face_utils.shape_to_np(shape)leftEye = points[LEFT_EYE_START:LEFT_EYE_END + 1]rightEye = points[RIGHT_EYE_START:RIGHT_EYE_END + 1]leftEAR = eye_aspect_ratio(leftEye)rightEAR = eye_aspect_ratio(rightEye)ear = (leftEAR + rightEAR) / 2.0if ear < EYE_AR_THRESH:self.frame_counter += 1else:if self.frame_counter >= EYE_AR_CONSEC_FRAMES:self.blink_counter += 1self.frame_counter = 0cv2.putText(frame, "Blinks:{0}".format(self.blink_counter), (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7,(0, 0, 255), 2)cv2.putText(frame, "EAR:{:.2f}".format(ear), (300, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255),2)img = frameimg_rgb = cv2.cvtColor(src=img, code=cv2.COLOR_BGR2RGB)height, width, channel = img_rgb.shapebytesPerLine = channel * widthimg = QImage(img_rgb, width, height, bytesPerLine, QImage.Format_RGB888)res = QPixmap.fromImage(img).scaled(self.ui.label.width(), self.ui.label.height())self.ui.label.setPixmap(res)
使用的68位人脸检测模块:
整个程序结构如下:
整个程序通过如下代码进行启动:
import sys
import os
curPath = os.path.abspath(os.path.dirname(__file__))
rootPath = os.path.split(curPath)[0]
sys.path.append(rootPath)
from PyQt5.QtWidgets import QApplication, QMainWindow
from dlib_blink.Frm_blinking import Frm_blinkingdef main():app = QApplication(sys.argv) # 应用程序实例对象w = Frm_blinking() # 窗体对象w.show() # 显示窗体sys.exit(app.exec_()) # 启动应用程序消息循环if __name__ == '__main__':main()
不足之处:
该程序只是简单的眨眼检测,所以受外界的影响较大,影响因素例如光线、角度等。主要难点在于线程,如果没有使用线程,整个界面是比较卡顿的,眨眼检测计数就比较不真实(虽然本身计数就不是很准确)。还有很多写的不好的地方,请多多理解,接受批评指正!
pyqt5之眨眼检测相关推荐
- Anaconda3+python3.7.10+TensorFlow2.3.0+PyQt5环境搭建
Anaconda3+python3.7.10+TensorFlow2.3.0+PyQt5环境搭建 一.Anaconda 创建 python3.7环境 1.进入 C:\Users\用户名 目录下,找到 ...
- pycharm+PyQt5+python最新开发环境配置,踩坑过程详解
安装工具: Pycharm 专业版2017.3 PyQT5 python3 pyqt5-tools 设置扩展工具的参数找到setting->tools->external tools,点击 ...
- 开发工业上位机 用pyqt5_用Pyqt5开发的基于MTCNN、FaceNet人脸考勤系统
import sys import cv2 from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtWidgets import * from ...
- 使用OpenCV,Python和dlib进行眨眼检测及计数
前三篇博客学习了 windows10+Python3.7安装dlib库进行面部标志识别 python dlib实现面部标志识别 使用python,dlib,OpenCV提取眼睛,鼻子,嘴唇及下颌 这篇 ...
- pyqt5 视频播放器
问题交流.反馈请到 https://github.com/moneypi/pyqt5_mediaplayer 首先肯定要安装pyqt5,顺便也安装一下opencv pip install PyQt5 ...
- Python培训分享:PyQT是什么?PyQt4和PyQt5的区别是什么?
今天小编为大家介绍的课程是关于Python培训方面的教程,主要讲的是PyQT是什么?PyQt4和PyQt5的区别是什么?来看看下面的详细介绍吧. Python培训分享:PyQT是什么?PyQt4和Py ...
- 浏览器tab关闭事件_Python--使用Pyqt5实现简易浏览器(最新版本测试过)
Python--使用Pyqt5实现简易浏览器(最新版本测试过) 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 准备环境 首先我 ...
- 在macos上基于python2.7安装PyQt5
在macos上基于python2.7安装PyQt5 在python3上面安装PyQt5是十分简单的,可是,在python2.7上安装这个东西,着实让人折腾了一把.要总结一下,年纪大了,记性不好. 首先 ...
- python GUI编程( 二 ) (基于PyQt5)
第二节 本节介绍添加窗口图标,在窗口内添加按钮,在窗口内添加提示框. 导入模块: from PyQt5.QWidgets import QWidget,QPushButton,QApplication ...
最新文章
- java项目新东方在线源码_基于JSP的在线考试系统-JavaWeb项目-有源码
- linux ftp查看用户目录权限,linux 指定ftp用户 特定目录及权限
- 利用Excel VBA批量计算长时间序列植被物候动态阈值(逐像元)
- mysql2008数据库配置_SQL Server 2008 R2 超详细安装图文教程
- 前端学习(1378):express静态资源处理
- 地面指示标志_消防应急照明与疏散指示系统的设计和施工安装规范,收藏学习!...
- 游戏剧情哪家强?日式RPG与欧美沙盒的优劣
- Project Euler Problem 48: Self powers
- CreateIoCompletionPort函数和完成端口
- python交通标志识别_利用pytorch实现交通标志识别
- 计算机专业可以从事平面设计吗,计算机专业和平面设计专业是一个专业不?
- my.cnf文件详解
- 情人节——圣瓦伦丁节(St. Valentine's Day)
- recon-ng模块安装与基本使用(国内环境)
- CentOS下删除和安装JDK
- 基于微信小程序的核酸检测系统源码
- 全球及中国三维精密动作捕捉系统行业研究及十四五规划分析报告
- Java实现注册邮箱激活验证
- 论中国足球教练排名,“神奇教练”米卢说第二,没人敢称第一
- CSS(红色标记:待练习效果)
热门文章
- 饥荒linux 中文版下载,饥荒哈姆雷特手机版
- 一个神奇的网站 Papers with code
- python苹果下载软件_PythonforMac官方下载_PythonforMac最新版_PythonforMac3.6.4官方最新版-华军软件园...
- 计算机无法进入桌面怎么备份,Windows系统损坏 | 无法进入系统如何正常备份数据?...
- 【渝粤教育】电大中专计算机职业素养 (5)作业 题库
- 基于面向对象的ATM自动取款机(未完善)
- Witt向量简介 §1.1:环上赋值基础
- 5800日常操作使用小技巧
- Sovrin:技术落地可期,但推广难度较高
- 蓝桥杯第一次模拟赛JAVA题解