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之眨眼检测相关推荐

  1. Anaconda3+python3.7.10+TensorFlow2.3.0+PyQt5环境搭建

    Anaconda3+python3.7.10+TensorFlow2.3.0+PyQt5环境搭建 一.Anaconda 创建 python3.7环境 1.进入 C:\Users\用户名 目录下,找到 ...

  2. pycharm+PyQt5+python最新开发环境配置,踩坑过程详解

    安装工具: Pycharm 专业版2017.3 PyQT5 python3 pyqt5-tools 设置扩展工具的参数找到setting->tools->external tools,点击 ...

  3. 开发工业上位机 用pyqt5_用Pyqt5开发的基于MTCNN、FaceNet人脸考勤系统

    import sys import cv2 from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtWidgets import * from ...

  4. 使用OpenCV,Python和dlib进行眨眼检测及计数

    前三篇博客学习了 windows10+Python3.7安装dlib库进行面部标志识别 python dlib实现面部标志识别 使用python,dlib,OpenCV提取眼睛,鼻子,嘴唇及下颌 这篇 ...

  5. pyqt5 视频播放器

    问题交流.反馈请到 https://github.com/moneypi/pyqt5_mediaplayer 首先肯定要安装pyqt5,顺便也安装一下opencv pip install PyQt5 ...

  6. Python培训分享:PyQT是什么?PyQt4和PyQt5的区别是什么?

    今天小编为大家介绍的课程是关于Python培训方面的教程,主要讲的是PyQT是什么?PyQt4和PyQt5的区别是什么?来看看下面的详细介绍吧. Python培训分享:PyQT是什么?PyQt4和Py ...

  7. 浏览器tab关闭事件_Python--使用Pyqt5实现简易浏览器(最新版本测试过)

    Python--使用Pyqt5实现简易浏览器(最新版本测试过) 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 准备环境 首先我 ...

  8. 在macos上基于python2.7安装PyQt5

    在macos上基于python2.7安装PyQt5 在python3上面安装PyQt5是十分简单的,可是,在python2.7上安装这个东西,着实让人折腾了一把.要总结一下,年纪大了,记性不好. 首先 ...

  9. python GUI编程( 二 ) (基于PyQt5)

    第二节 本节介绍添加窗口图标,在窗口内添加按钮,在窗口内添加提示框. 导入模块: from PyQt5.QWidgets import QWidget,QPushButton,QApplication ...

最新文章

  1. java项目新东方在线源码_基于JSP的在线考试系统-JavaWeb项目-有源码
  2. linux ftp查看用户目录权限,linux 指定ftp用户 特定目录及权限
  3. 利用Excel VBA批量计算长时间序列植被物候动态阈值(逐像元)
  4. mysql2008数据库配置_SQL Server 2008 R2 超详细安装图文教程
  5. 前端学习(1378):express静态资源处理
  6. 地面指示标志_消防应急照明与疏散指示系统的设计和施工安装规范,收藏学习!...
  7. 游戏剧情哪家强?日式RPG与欧美沙盒的优劣
  8. Project Euler Problem 48: Self powers
  9. CreateIoCompletionPort函数和完成端口
  10. python交通标志识别_利用pytorch实现交通标志识别
  11. 计算机专业可以从事平面设计吗,计算机专业和平面设计专业是一个专业不?
  12. my.cnf文件详解
  13. 情人节——圣瓦伦丁节(St. Valentine's Day)
  14. recon-ng模块安装与基本使用(国内环境)
  15. CentOS下删除和安装JDK
  16. 基于微信小程序的核酸检测系统源码
  17. 全球及中国三维精密动作捕捉系统行业研究及十四五规划分析报告
  18. Java实现注册邮箱激活验证
  19. 论中国足球教练排名,“神奇教练”米卢说第二,没人敢称第一
  20. CSS(红色标记:待练习效果)

热门文章

  1. 饥荒linux 中文版下载,饥荒哈姆雷特手机版
  2. 一个神奇的网站 Papers with code
  3. python苹果下载软件_PythonforMac官方下载_PythonforMac最新版_PythonforMac3.6.4官方最新版-华军软件园...
  4. 计算机无法进入桌面怎么备份,Windows系统损坏 | 无法进入系统如何正常备份数据?...
  5. 【渝粤教育】电大中专计算机职业素养 (5)作业 题库
  6. 基于面向对象的ATM自动取款机(未完善)
  7. Witt向量简介 §1.1:环上赋值基础
  8. 5800日常操作使用小技巧
  9. Sovrin:技术落地可期,但推广难度较高
  10. 蓝桥杯第一次模拟赛JAVA题解