竞赛选题 图像识别-人脸识别与疲劳检测 - python opencv

news2024/9/28 17:32:50

文章目录

  • 0 前言
  • 1 课题背景
  • 2 Dlib人脸识别
    • 2.1 简介
    • 2.2 Dlib优点
    • 2.3 相关代码
    • 2.4 人脸数据库
    • 2.5 人脸录入加识别效果
  • 3 疲劳检测算法
    • 3.1 眼睛检测算法
    • 3.3 点头检测算法
  • 4 PyQt5
    • 4.1 简介
    • 4.2相关界面代码
  • 5 最后

0 前言

🔥 优质竞赛项目系列,今天要分享的是

🚩 基于图像识别的人脸识别与疲劳检测系统

该项目较为新颖,适合作为竞赛课题方向,学长非常推荐!

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:3分
  • 工作量:3分
  • 创新点:5分

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

在这里插入图片描述

1 课题背景

为了有效监测驾驶员是否疲劳驾驶、避免交通事故的发⽣,本项目利⽤⼈脸特征点进⾏实时疲劳驾驶检测的新⽅法。对驾驶员驾驶时的⾯部图像进⾏实时监控,⾸先检测⼈脸,并利⽤ERT算法定位⼈脸特征点;然后根据⼈脸眼睛区域的特征点坐标信息计算眼睛纵横⽐EAR来描述眼睛张开程度,根据合适的EAR阈值可判断睁眼或闭眼状态;最后基于EAR实测值和EAR阈值对监控视频计算闭眼时间⽐例(PERCLOS)值度量驾驶员主观疲劳程度,将其与设定的疲劳度阈值进⾏⽐较即可判定是否疲劳驾驶。

2 Dlib人脸识别

2.1 简介

Dlib是一个基于c++开发的开源数据工具库,其中包含了不少的机器学习的成熟算法与模型,相对于tensorflow和PyTorch,它用于图像处理以及人脸面部特征提取、分类及对比这几个方面比较具有通用性和优越性,因此,Dlib正在越来越广泛地应用在人脸识别技术领域。
Dlib具有独立使用的可移植代码。Dlib中的代码使用c++语言进行开发而成,使用独立封装,在不借助第三方数据库的情况下,可以直接移植到自己所需要设计的项目中进行使用。

2.2 Dlib优点

  • Dlib拥有全面的文档说明。作为一个开源的人脸数据库训练集,Dlib中有很多功能齐全的程序和文件,从人性化的角度而言的,Dlib在这一点上做的是非常不错的,因为它为每一个程序文档和文件都做了相对应的注释,这样开发者就可以迅速准确的调集程序文档来完成自己所需要的项目功能。

  • Dlib涵盖了支持功能完备的深度学习以及图像处理的各类算法。Dlib为开发者提供了机器深度学习的各类成熟的完备算法,并且在图像处理方面也为开发者带来了能够解决大多数实质问题的优良算法。例如基于SVM的递归和分类算法,以及专门用于面对大规模分类和递归的降维算法。当然还有能够对未知函数进行预分类和预测的相关向量机,其分类和预测训练是基于贝叶斯框架。

2.3 相关代码

    import` `matplotlib.pyplot as plt
    import` `dlib
    import` `numpy as np
    import` `glob
    import` `re

    #正脸检测器
    detector``=``dlib.get_frontal_face_detector()
    #脸部关键形态检测器
    sp``=``dlib.shape_predictor(r``"D:LBJAVAscriptshape_predictor_68_face_landmarks.dat"``)
    #人脸识别模型
    facerec ``=` `dlib.face_recognition_model_v1(r``"D:LBJAVAscriptdlib_face_recognition_resnet_model_v1.dat"``)
     
    #候选人脸部描述向量集
    descriptors``=``[]
     
    photo_locations``=``[]
     
    for` `photo ``in` `glob.glob(r``'D:LBJAVAscriptfaces*.jpg'``):
     ``photo_locations.append(photo)
     ``img``=``plt.imread(photo)
     ``img``=``np.array(img)
     
     ``#开始检测人脸
     ``dets``=``detector(img,``1``)
     
     ``for` `k,d ``in` `enumerate``(dets):
      ``#检测每张照片中人脸的特征
      ``shape``=``sp(img,d)
      ``face_descriptor``=``facerec.compute_face_descriptor(img,shape)
      ``v``=``np.array(face_descriptor)
      ``descriptors.append(v)
        
    #输入的待识别的人脸处理方法相同
    img``=``plt.imread(r``'D:test_photo10.jpg'``)
    img``=``np.array(img)
    dets``=``detector(img,``1``)
    #计算输入人脸和已有人脸之间的差异程度(比如用欧式距离来衡量)
    differences``=``[]
    for` `k,d ``in` `enumerate``(dets):
     ``shape``=``sp(img,d)
     ``face_descriptor``=``facerec.compute_face_descriptor(img,shape)
     ``d_test``=``np.array(face_descriptor)
     
     ``#计算输入人脸和所有已有人脸描述向量的欧氏距离
     ``for` `i ``in` `descriptors:
      ``distance``=``np.linalg.norm(i``-``d_test)
      ``differences.append(distance)
     
    #按欧式距离排序 欧式距离最小的就是匹配的人脸
    candidate_count``=``len``(photo_locations)
    candidates_dict``=``dict``(``zip``(photo_locations,differences))
    candidates_dict_sorted``=``sorted``(candidates_dict.items(),key``=``lambda` `x:x[``1``])
     
    #matplotlib要正确显示中文需要设置
    plt.rcParams[``'font.family'``] ``=` `[``'sans-serif'``]
    plt.rcParams[``'font.sans-serif'``] ``=` `[``'SimHei'``]
     
    plt.rcParams[``'figure.figsize'``] ``=` `(``20.0``, ``70.0``)
     
    ax``=``plt.subplot(candidate_count``+``1``,``4``,``1``)
    ax.set_title(``"输入的人脸"``)
    ax.imshow(img)
     
    for` `i,(photo,distance) ``in` `enumerate``(candidates_dict_sorted):
     ``img``=``plt.imread(photo)
     
     ``face_name``=``""
     ``photo_name``=``re.search(r``'([^\]*).jpg$'``,photo)
     ``if` `photo_name:
      ``face_name``=``photo_name[``1``]
      
     ``ax``=``plt.subplot(candidate_count``+``1``,``4``,i``+``2``)
     ``ax.set_xticks([])
     ``ax.set_yticks([])
     ``ax.spines[``'top'``].set_visible(``False``)
     ``ax.spines[``'right'``].set_visible(``False``)
     ``ax.spines[``'bottom'``].set_visible(``False``)
     ``ax.spines[``'left'``].set_visible(``False``)
     
     ``if` `i``=``=``0``:
      ``ax.set_title(``"最匹配的人脸nn"``+``face_name``+``"nn差异度:"``+``str``(distance))
     ``else``:
      ``ax.set_title(face_name``+``"nn差异度:"``+``str``(distance))
     ``ax.imshow(img)
     
    plt.show()

2.4 人脸数据库

本项目中将识别到的人脸保存的.db文件中,相关代码如下:

 class CoreUI(QMainWindow):
        database = './FaceBase.db'
        trainingData = './recognizer/trainingData.yml'
        cap = cv2.VideoCapture()
        captureQueue = queue.Queue()  # 图像队列
        alarmQueue = queue.LifoQueue()  # 报警队列,后进先出
        logQueue = multiprocessing.Queue()  # 日志队列
        receiveLogSignal = pyqtSignal(str)  # LOG信号
    

        def __init__(self):
    
            super(CoreUI, self).__init__()


   
           loadUi('./ui/Core.ui', self)
           self.setWindowIcon(QIcon('./icons/icon.png'))
           #self.setFixedSize(1161, 620)
  
   
         '''self.pushButton = QPushButton('rush', self)
          layout = QVBoxLayout()
           layout.addWidget(self.pushButton)
           self.setLayout(layout)'''
          #self.pushButton.clicked.connect(self.open)=


    
           # 图像捕获
            self.isExternalCameraUsed = False
           self.useExternalCameraCheckBox.stateChanged.connect(
               lambda: self.useExternalCamera(self.useExternalCameraCheckBox))
           self.faceProcessingThread = FaceProcessingThread()
           self.startWebcamButton.clicked.connect(self.startWebcam)
    

            #A\B功能开关
    
            # 数据库
            self.initDbButton.setIcon(QIcon('./icons/warning.png'))
            self.initDbButton.clicked.connect(self.initDb)
    
            self.timer = QTimer(self)  # 初始化一个定时器
            self.timer.timeout.connect(self.updateFrame)


2.5 人脸录入加识别效果

录入过程
在这里插入图片描述

识别效果
在这里插入图片描述

3 疲劳检测算法

该系统采用Dlib库中人脸68个关键点检测shape_predictor_68_face_landmarks.dat的dat模型库及视频中的人脸,之后返回人脸特征点坐标、人脸框及人脸角度等。本系统利用这68个关键点对驾驶员的疲劳状态进行检测,算法如下:

1. 初始化Dlib的人脸检测器(HOG),然后创建面部标志物预测;
2. 使用dlib.get_frontal_face_detector() 获得脸部位置检测器;
3. 使用dlib.shape_predictor获得脸部特征位置检测器;
4. 分别获取左、右眼面部标志的索引;
5. 打开cv2本地摄像头。

Dlib库68个特征点模型如图所示:
在这里插入图片描述

3.1 眼睛检测算法

基于EAR算法的眨眼检测,当人眼睁开时,EAR在某个值域范围内波动,当人眼闭合时,EAR迅速下降,理论上接近于0。当EAR低于某个阈值时,眼睛处于闭合状态;当EAR由某个值迅速下降至小于该阈值,再迅速上升至大于该阈值,则判断为一次眨眼。为检测眨眼次数,需要设置同一次眨眼的连续帧数。眨眼速度较快,一般1~3帧即可完成眨眼动作。眼部特征点如图:

在这里插入图片描述

EAR计算公式如下:
在这里插入图片描述
当后帧眼睛宽高比与前一帧差值的绝对值(EAR)大于0.2时,认为驾驶员在疲劳驾驶。(68点landmark中可以看到37-42为左眼,43-48为右眼)
在这里插入图片描述
右眼开合度可以通过以下公式:
在这里插入图片描述
眼睛睁开度从大到小为进入闭眼期,从小到大为进入睁眼期,计算最长闭眼时间(可用帧数来代替)。闭眼次数为进入闭眼、进入睁眼的次数。通过设定单位时间内闭眼次数、闭眼时间的阈值判断人是否已经疲劳了。

相关代码:


# 疲劳检测,检测眼睛和嘴巴的开合程度

from scipy.spatial import distance as dist
from imutils.video import FileVideoStream
from imutils.video import VideoStream
from imutils import face_utils
import numpy as np  # 数据处理的库 numpy
import argparse
import imutils
import time
import dlib
import cv2
import math
import time
from threading import Thread

def eye_aspect_ratio(eye):
    # 垂直眼标志(X,Y)坐标
    A = dist.euclidean(eye[1], eye[5])  # 计算两个集合之间的欧式距离
    B = dist.euclidean(eye[2], eye[4])
    # 计算水平之间的欧几里得距离
    # 水平眼标志(X,Y)坐标
    C = dist.euclidean(eye[0], eye[3])
    # 眼睛长宽比的计算
    ear = (A + B) / (2.0 * C)
    # 返回眼睛的长宽比
    return ear

# 3.2 打哈欠检测算法

基于MAR算法的哈欠检测,利用Dlib提取嘴部的6个特征点,通过这6个特征点的坐标(51、59、53、57的纵坐标和49、55的横坐标)来计算打哈欠时嘴巴的张开程度。当一个人说话时,点51、59、53、57的纵坐标差值增大,从而使MAR值迅速增大,反之,当一个人闭上嘴巴时,MAR值迅速减小。

嘴部主要取六个参考点,如下图:
在这里插入图片描述
计算公式:
在这里插入图片描述
通过公式计算MAR来判断是否张嘴及张嘴时间,从而确定驾驶员是否在打哈欠。阈值应经过大量实验,能够与正常说话或哼歌区分开来。为提高判断的准确度,采用双阈值法进行哈欠检测,即对内轮廓进行检测:结合张口度与张口时间进行判断。Yawn为打哈欠的帧数,N为1
min内总帧数,设双阈值法哈欠检测的阈值为10%,当打哈欠频率Freq>10%时,则认为驾驶员打了1个深度哈欠或者至少连续2个浅哈欠,此时系统进行疲劳提醒。

相关代码:


​ # 疲劳检测,检测眼睛和嘴巴的开合程度

from scipy.spatial import distance as dist
from imutils.video import FileVideoStream
from imutils.video import VideoStream
from imutils import face_utils
import numpy as np  # 数据处理的库 numpy
import argparse
import imutils
import time
import dlib
import cv2
import math
import time
from threading import Thread

def mouth_aspect_ratio(mouth):  # 嘴部
    A = np.linalg.norm(mouth[2] - mouth[10])  # 51, 59
    B = np.linalg.norm(mouth[4] - mouth[8])  # 53, 57
    C = np.linalg.norm(mouth[0] - mouth[6])  # 49, 55
    mar = (A + B) / (2.0 * C)
    return mar

相应的演示效果如下:

在这里插入图片描述

3.3 点头检测算法

基于HPE算法的点头检测

HPE(Head Pose
Estimation,HPE)算法步骤:2D人脸关键点检测,3D人脸模型匹配,求解3D点和对应2D点的转换关系,根据旋转矩阵求解欧拉角。检测过程中需要使用世界坐标系(UVW)、相机坐标系(XYZ)、图像中心坐标系(uv)和像素坐标系(xy)。一个物体相对于相机的姿态可以使用旋转矩阵和平移矩阵来表示。

  • 平移矩阵:物体相对于相机的空间位置关系矩阵,用T表示;
  • 旋转矩阵:物体相对于相机的空间姿态关系矩阵,用R表示。

因此必然少不了坐标系转换。如图所示:
在这里插入图片描述
于是世界坐标系(UVW)、相机坐标系(XYZ)、图像中心坐标系(uv)和像素坐标系(xy)四兄弟闪亮登场。相对关系如下:
世界坐标系转换到相机坐标:
在这里插入图片描述
相机坐标系转换到像素坐标系:
在这里插入图片描述
像素坐标系与世界坐标系的关系为:
在这里插入图片描述
图像中心坐标系转换到像素坐标系:
在这里插入图片描述
得到旋转矩阵后,求欧拉角:
在这里插入图片描述
设定参数阈值为0.3,在一个时间段,如10
s内,当低头欧拉角|Pitch|≥20°或者头部倾斜欧拉角|Roll|≥20°的时间比例超过0.3时,则认为驾驶员处于瞌睡状态,发出预警。
在这里插入图片描述
相关效果展示:
在这里插入图片描述

4 PyQt5

4.1 简介

Qt是一个跨平台的 C++ 开发库,主要用来开发图形用户界面程序(GUI),当然也可以开发不带界面的命令行程序。
但Qt 是纯 C++ 开发的,PyQt5是基于图形程序框架Qt5的Python语言实现,由一组Python模块构成。

  • QLabel控件:用来显示文本或图像。

  • QLineEdit窗口控件:提供了一个单页面的单行文本编辑器。

  • QTextEdit窗口控件:提供了一个单页面的多行文本编辑器。

  • QPushButton窗口控件:提供了一个命令按钮。

  • QRadioButton控件:提供了一个单选钮和一个文本或像素映射标签。

  • QCheckBox窗口控件:提供了一个带文本标签的复选框。

  • QspinBox控件:允许用户选择一个值,要么通过按向上/向下键增加/减少当前显示值,要么直接将值输入到输入框中。

  • QScrollBar窗口控件:提供了一个水平的或垂直的滚动条。

  • QSlider控件:提供了一个垂直的或水平的滑动条。

  • QComboBox控件:一个组合按钮,用于弹出列表。

  • QMenuBar控件:提供了一个横向菜单栏。

  • QStatusBar控件:提供了一个适合呈现状态信息的水平条,通常放在QMainWindow的底部。

  • QToolBar控件:提供了一个工具栏,可以包含多个命令按钮,通常放在QMainWindow的顶部。

  • QListView控件:可以显示和控制可选的多选列表,可以设置ListMode或IconMode。

  • QPixmap控件:可以在绘图设备上显示图像,通常放在QLabel或QPushButton类中。

  • Qdialog控件:对话框窗口的基类。

  • QWidget是所有用户界面类的基类,它能接收所有的鼠标、键盘和其他系统窗口事件。没有被嵌入到父窗口中的Widget会被当作一个窗口来调用,当然,它也可以使用setWindowFlags(Qt.WindowFlags)函数来设置窗口的显示效果。QWidget的构造函数可以接收两个参数,其中第一个参数是该窗口的父窗口;第二个参数是该窗口的Flag,也就是- Qt.WindowFlags。根据父窗口来决定Widget是嵌入到父窗口中还是被当作一个独立的窗口来调用,根据Flag来设置Widget窗口的一些属性。

  • QMainWindow(主窗口)一般是应用程序的框架,在主窗口中可以添加所需要的Widget,比如添加菜单栏、工具栏、状态栏等。主窗口通常用于提供一个大的中央窗口控件(如文本编辑或者绘制画布)以及周围的菜单栏、工具栏和状态栏。QMainWindow常常被继承,这使得封装中央控件、菜单栏,工具栏以及窗口状态变得更容易,也可以使用Qt Designer来创建主窗口。

4.2相关界面代码

部分代码

  from PyQt5.QtCore import QTimer, QThread, pyqtSignal, QRegExp, Qt
    from PyQt5.QtGui import QImage, QPixmap, QIcon, QTextCursor, QRegExpValidator,QPainter
    from PyQt5.QtWidgets import *
    from PyQt5.uic import loadUi
    from ui.untitled import Ui_Form
    from core2 import CoreUI
    from dataRecord import DataRecordUI
    from dataManage import DataManageUI
    

    from ui.pic import Ui_Form1
    from PyQt5 import QtCore
    import sys
    import os
    from PyQt5 import QtGui
    from PyQt5 import QtCore
    from PyQt5.QtWidgets import *
    from PyQt5.QtCore import *
    from PyQt5.QtGui import *
    import sys
    class Main(CoreUI,QMainWindow):
    	def __init__(self):
    		super(Main, self).__init__()
    		qssStyle = open(os.path.join('sip/123.qss')).read()
    		self.setStyleSheet(qssStyle)
    
    		self.setWindowFlag(QtCore.Qt.FramelessWindowHint)#设置无边框  但是按键得重新设置了
    		#self.startWebcamButton()
    		self.startWebcamButton.setStyleSheet(
    			"startWebcamButton{color:black}"
    			"startWebcamButton:hover{color:red}"
    			"startWebcamButton{background-color:rgb(180,180,180)}"
    			"startWebcamButton{border:2px}"
    			"startWebcamButton{border-radius:10px}"
    			"startWebcamButton{padding:2px 4px}"
    			"startWebcamButton{font-size:14pt}")
    		self.pushButton.setStyleSheet(
    			"#pushButton {color:rgb(255,255,255);border-image:url(sip/anniu.png);text-aligh:left;font-size:18px;font-weight:bold;};"
    		)
    		self.pushButton_2.setStyleSheet(
    			"#pushButton_2 {color:rgb(255,255,255);border-image:url(sip/anniu.png);text-aligh:left;font-size:18px;font-weight:bold;};"
    		)
    		self.pushButton_3.setStyleSheet(
    			"#pushButton_3 {color:rgb(255,255,255);border-image:url(sip/anniu.png);text-aligh:left;font-size:18px;font-weight:bold;};"
    		)
    		self.pushButton_4.setStyleSheet(
    			"#pushButton_4 {color:rgb(255,255,255);border-image:url(sip/anniu.png);text-aligh:left;font-size:18px;font-weight:bold;};"
    		)
    		#self.setStyleSheet("color:white")#颜色全变
    		self.pushButton_4.clicked.connect(QCoreApplication.instance().quit)
    	def closewin(self):
    		self.close()
    
    	def mouseMoveEvent(self, e: QMouseEvent):  # 重写移动事件
    		self._endPos = e.pos() - self._startPos
    		self.move(self.pos() + self._endPos)
    
    	def mousePressEvent(self, e: QMouseEvent):
    		if e.button() == Qt.LeftButton:
    			self._isTracking = True
    			self._startPos = QPoint(e.x(), e.y())
    
    	def mouseReleaseEvent(self, e: QMouseEvent):
    		if e.button() == Qt.LeftButton:
    			self._isTracking = False
    			self._startPos = None
    			self._endPos = None
    
    	def paintEvent(self, a0: QtGui.QPaintEvent) -> None:
    		painter = QPainter(self)
    		pixmap = QPixmap("sip/5.jfif")
    		painter.drawPixmap(self.rect(), pixmap)
    		#self.setupUi(self)
    	'''def open(self):
    		path = r"sip/new"
    		QDesktopServices.openUrl(QUrl.fromLocalFile(path))'''
    class Child(DataRecordUI,QMainWindow):
    	def __init__(self):
    		super(Child, self).__init__()
    		self.setWindowFlag(QtCore.Qt.FramelessWindowHint)
    		qssStyle = open(os.path.join('sip/123.qss')).read()
    		self.setStyleSheet(qssStyle)
    		#self.setupUi(self)
    	def OPEN(self):
    			self.show()
    	def closewin(self):
    		self.close()
    	def returnmain(self):
    
    		self.pushButton.clicked.connect(main.show)
    		self.pushButton.clicked.connect(ch.hide)
    	def paintEvent(self, a0: QtGui.QPaintEvent) -> None:
    		painter = QPainter(self)
    		pixmap = QPixmap("sip/5.jfif")
    		painter.drawPixmap(self.rect(), pixmap)
    
    class Child1(DataManageUI,QMainWindow):
    	def __init__(self):
    		super(Child1,self).__init__()
    		self.setWindowFlag(QtCore.Qt.FramelessWindowHint)
    		qssStyle = open(os.path.join('sip/123.qss')).read()
    		self.setStyleSheet(qssStyle)
    	def OPEN(self):
    		self.show()
    	def closewin(self):
    		self.close()
    	def returnmain(self):
    
    		self.pushButton.clicked.connect(main.show)
    		self.pushButton.clicked.connect(ch1.hide)
    	def paintEvent(self, a0: QtGui.QPaintEvent) -> None:
    		painter = QPainter(self)
    		pixmap = QPixmap("sip/5.jfif")
    		painter.drawPixmap(self.rect(), pixmap)
    
    class help(Ui_Form,QWidget):
    	def __init__(self):
    		super(help,self).__init__()
    		self.setWindowFlag(QtCore.Qt.FramelessWindowHint)
    		self.setupUi(self)
    		qssStyle = open(os.path.join('sip/123.qss')).read()
    		self.setStyleSheet(qssStyle)
    		'''qssStyle1 = open(os.path.join('sip/123.qss')).read()
    		self.setStyleSheet(qssStyle1)'''
    	def OPEN(self):
    		self.show()
    	def returnmain(self):
    		self.pushButton.clicked.connect(main.show)
    		self.pushButton.clicked.connect(Help.hide)
    	def paintEvent(self, a0: QtGui.QPaintEvent) -> None:
    		painter = QPainter(self)
    		pixmap = QPixmap("sip/5.jfif")
    		painter.drawPixmap(self.rect(), pixmap)
    
    class add(Ui_Form1,QWidget):
    	def __init__(self):
    		super(add,self).__init__()
    		#self.setWindowFlag(QtCore.Qt.FramelessWindowHint)
    		self.setupUi(self)
    		self.setWindowFlag(QtCore.Qt.FramelessWindowHint)
    		qssStyle = open(os.path.join('sip/123.qss')).read()
    		self.setStyleSheet(qssStyle)
    		#qssStyle = open(os.path.join('123.qss')).read()
    		self.pushButton.clicked.connect(self.close)
    		#self.setStyleSheet(qssStyle)
    	def OPEN(self):
    		self.show()
    	def paintEvent(self, a0: QtGui.QPaintEvent) -> None:
    		painter = QPainter(self)
    		pixmap = QPixmap("./sip/5.jfif")
    		painter.drawPixmap(self.rect(), pixmap)
    
    if __name__ =="__main__":
    	#QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
    	app = QApplication(sys.argv)
    	main = Main()
    	ch = Child()
    	ch1 = Child1()
    	Help = help()
    	ADD=add()
    	main.show()
    	#main.setStyleSheet("{border-image:url(sip/background.jpg)}")
    	main.pushButton.clicked.connect(main.hide)
    	main.pushButton.clicked.connect(ch.OPEN)
    	main.pushButton_2.clicked.connect(main.hide)
    	main.pushButton_2.clicked.connect(ch1.OPEN)
    	main.pushButton_3.clicked.connect(main.hide)
    	main.pushButton_3.clicked.connect(Help.OPEN)
    	main.pushButton_11.clicked.connect(ADD.OPEN)
    	ch.pushButton.clicked.connect(ch.returnmain)
    	ch1.pushButton.clicked.connect(ch1.returnmain)
    	Help.pushButton.clicked.connect(Help.returnmain)
    	#ADD.pushButton.clicked.connect(ADD.close)
    	sys.exit(app.exec_())


5 最后

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1909193.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JVM - 辅助小工具

文章目录 前言JVM - 辅助小工具1. 实现2. 效果3. demo 前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎…

迭代器模式(大话设计模式)C/C++版本

迭代器模式 C #include <iostream> #include <string> #include <vector>using namespace std;// 迭代抽象类,用于定义得到开始对象、得到下一个对象、判断是否到结尾、当前对象等抽象方法&#xff0c;统一接口 class Iterator { public:Iterator(){};virtu…

全网最适合入门的面向对象编程教程:11 类和对象的Python实现-子类调用父类方法-模拟串口传感器和主机

全网最适合入门的面向对象编程教程&#xff1a;11 类和对象的 Python 实现-子类调用父类方法-模拟串口传感器和主机 摘要&#xff1a; 本节课&#xff0c;我们主要讲解了在 Python 类的继承中子类如何进行初始化、调用父类的属性和方法&#xff0c;同时讲解了模拟串口传感器和…

Go语言---文本文件处理

字符串操作 Contains func Contains(s,substr string) bool功能&#xff1a;字符串s中是否包含 substr&#xff0c;返回bool值 Join func Join(a []string,sep string) string功能&#xff1a;字符串链接&#xff0c;把slice a通过sep链接起来 Index func Index(a ,sep s…

Pytest单元测试系列[v1.0.0][Pytest基础]

Pytest安装与配置 和Unittest一样&#xff0c;Pytest是另一个Python语言的单元测试框架&#xff0c;与Unittest相比它的测试用例更加容易编写、运行方式更加灵活、报错信息更加清晰、断言写法更简洁并且它可以运行有unittest和nose编写的测试用例。 Pytest 安装 启动命令行&…

VMware安装部署Android手机操作系统

VMware安装部署Android手机操作系统 原创 wangyangsheng 计算机科学与技术研究员 2024年07月09日 08:30 广东 本文主要描述在VMware中安装部署Android-x86版本手机操作系统。 www.android-x86.org 如上所示&#xff0c;从开源网站下载Android-x86最新版本操作系统安装文件 …

小阿轩yx-Haproxy搭建Web群集

小阿轩yx-Haproxy搭建Web群集 Haproxy 简介 提供高可用性 能做出标准的负载均衡 支持虚拟主机 具备健康检查能力 能用于各式各样的代理 轻量级代理环境 解决方案优势 免费 快速 可靠 特性 特别适用于那些负载特大的web站点&#xff0c;这些站点通常又需要会话保持或…

几种不同的方式禁止IP访问网站(PHP、Nginx、Apache设置方法)

1、PHP禁止IP和IP段访问 <?//禁止某个IP$banned_ip array ("127.0.0.1",//"119.6.20.66","192.168.1.4");if ( in_array( getenv("REMOTE_ADDR"), $banned_ip ) ){die ("您的IP禁止访问&#xff01;");}//禁止某个IP段…

01-图像基础-颜色空间

1.RGB颜色空间 RGB是一种常用的颜色空间&#xff0c;比如一幅720P的图像&#xff0c;所对应的像素点个数是1280*720&#xff0c;每一个像素点由三个分量构成&#xff0c;分别是R,G,B。 R代表红色分量&#xff0c;G代表绿色分量&#xff0c;B代表蓝色分量&#xff0c;以24位色来…

一网统管/视频汇聚/安防监控平台EasyCVR启动后无法访问是什么原因?

智慧城市/一网统管/视频汇聚/安防监控平台EasyCVR兼容性强&#xff0c;支持多协议接入&#xff0c;包括国标GB/T 28181协议、GA/T 1400协议、部标JT808协议、RTMP、RTSP/Onvif协议、海康Ehome、海康SDK、大华SDK、华为SDK、宇视SDK、乐橙SDK、萤石云SDK等&#xff0c;并能对外分…

插件更新了!

最近花了点时间&#xff0c;给网页插件添加了新功能&#xff0c;下面简单给大家介绍一下如何使用 我们安装好插件后&#xff0c;进入网页就可以看到一个带logo的按钮了&#xff0c;我们可以点一下就可以跳出快捷操作 不同页面点击会出现不同的功能&#xff0c;大家可以根据自己…

解析java128陷阱

一、提要 在java开发时&#xff0c;由于基本类型不能调用方法&#xff0c;在某些方面很不方便&#xff0c;因此产生了包装类。我们把基本类型和对应的包装类的转换叫装箱、拆箱。 1.装箱 基本类型转成包装类对象 关键字valueOf->装箱,可以指定进制&#xff1a; Integer…

2024年【道路运输企业主要负责人】考试内容及道路运输企业主要负责人找解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 道路运输企业主要负责人考试内容是安全生产模拟考试一点通生成的&#xff0c;道路运输企业主要负责人证模拟考试题库是根据道路运输企业主要负责人最新版教材汇编出道路运输企业主要负责人仿真模拟考试。2024年【道路…

俯卧撑计数器(Python)

通过 MediaPipe 检测人体姿态&#xff0c;计算俯卧撑角度和计数&#xff0c;并在图像上进行可视化展示 需要有cv2库和mediapipe库 mediapipe库&#xff1a; MediaPipe是Google开源的机器学习框架&#xff0c;用于构建实时音频、视频和多媒体处理应用程序。它提供了一组预训练的…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 7月9日,星期二

每天一分钟&#xff0c;知晓天下事&#xff01; 2024年7月9日 星期二 农历六月初四 1、 最高检&#xff1a;对小摊小贩、小微企业处以高额罚款不符合法律精神。 2、 公安部&#xff1a;全国机动车保有量达4.4亿辆&#xff0c;驾驶人达5.32亿人。 3、 科技部&#xff1a;严禁将…

Echarts:渲染成Canvas还是SVG,该如何抉择?

ECharts 从初始一直使用 Canvas 绘制图表。而 ECharts v4.0 发布了 SVG 渲染器&#xff0c;从而提供了一种新的选择。在初始化图表实例时&#xff0c;只需设置 renderer 参数 为 canvas 或 svg 即可指定渲染器&#xff0c;比较方便。贝格前端工场带领大家看下如何选择。 一、C…

2024年【低压电工】最新解析及低压电工复审考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 低压电工最新解析根据新低压电工考试大纲要求&#xff0c;安全生产模拟考试一点通将低压电工模拟考试试题进行汇编&#xff0c;组成一套低压电工全真模拟考试试题&#xff0c;学员可通过低压电工复审考试全真模拟&…

为什么要学习Go?

目录 前言 一、Go 语言的发展史 Robert Griesemer Rob Pike Ken Thompson 二、Go语言全面分析 主要优势 主要挑战 三、Go 语言最佳实践 1. 云原生开发 2. 网络服务开发 3. 系统工具和实用程序 4. 数据处理和分析 四、哪些知名公司使用 Go 语言&#xff1f; Google …

16 - Python语言进阶

Python语言进阶 数据结构和算法 算法&#xff1a;解决问题的方法和步骤 评价算法的好坏&#xff1a;渐近时间复杂度和渐近空间复杂度。 渐近时间复杂度的大O标记&#xff1a; - 常量时间复杂度 - 布隆过滤器 / 哈希存储 - 对数时间复杂度 - 折半查找&#xff08;二分查找&am…

重点区域分布式无人机探测防御系统详解

重点区域分布式无人机探测防御系统采用模块化设计&#xff0c;结合先进的传感技术、通信技术和数据处理技术&#xff0c;实现对无人机的高效探测与防御。系统架构由无人机探测模块、数据分析中心、防御与反制模块以及用户交互界面四大部分组成。系统特点包括分布式部署、高灵敏…