机器视觉毕业设计 深度学习疲劳驾驶人脸检测系统 - python opencv
文章目錄
- 0 前言
- 1 課題背景
- 2 Dlib人臉識(shí)別
- 2.1 簡介
- 2.2 Dlib優(yōu)點(diǎn)
- 2.3 相關(guān)代碼
- 2.4 人臉數(shù)據(jù)庫
- 2.5 人臉錄入加識(shí)別效果
- 3 疲勞檢測算法
- 3.1 眼睛檢測算法
- 3.2 打哈欠檢測算法
- 3.3 點(diǎn)頭檢測算法
- 4 PyQt5
- 4.1 簡介
- 4.2相關(guān)界面代碼
- 5 最后
0 前言
🔥 這兩年開始畢業(yè)設(shè)計(jì)和畢業(yè)答辯的要求和難度不斷提升,傳統(tǒng)的畢設(shè)題目缺少創(chuàng)新和亮點(diǎn),往往達(dá)不到畢業(yè)答辯的要求,這兩年不斷有學(xué)弟學(xué)妹告訴學(xué)長自己做的項(xiàng)目系統(tǒng)達(dá)不到老師的要求。
為了大家能夠順利以及最少的精力通過畢設(shè),學(xué)長分享優(yōu)質(zhì)畢業(yè)設(shè)計(jì)項(xiàng)目,今天要分享的是
🚩 機(jī)器視覺 opencv 深度學(xué)習(xí) 駕駛?cè)四樒跈z測系統(tǒng)
🥇學(xué)長這里給一個(gè)題目綜合評分(每項(xiàng)滿分5分)
- 難度系數(shù):3分
- 工作量:3分
- 創(chuàng)新點(diǎn):4分
1 課題背景
為了有效監(jiān)測駕駛員是否疲勞駕駛、避免交通事故的發(fā)?,本項(xiàng)目利??臉特征點(diǎn)進(jìn)?實(shí)時(shí)疲勞駕駛檢測的新?法。對駕駛員駕駛時(shí)的?部圖像進(jìn)?實(shí)時(shí)監(jiān)控,?先檢測?臉,并利?ERT算法定位?臉特征點(diǎn);然后根據(jù)?臉眼睛區(qū)域的特征點(diǎn)坐標(biāo)信息計(jì)算眼睛縱橫?EAR來描述眼睛張開程度,根據(jù)合適的EAR閾值可判斷睜眼或閉眼狀態(tài);最后基于EAR實(shí)測值和EAR閾值對監(jiān)控視頻計(jì)算閉眼時(shí)間?例(PERCLOS)值度量駕駛員主觀疲勞程度,將其與設(shè)定的疲勞度閾值進(jìn)??較即可判定是否疲勞駕駛。
2 Dlib人臉識(shí)別
2.1 簡介
Dlib是一個(gè)基于c++開發(fā)的開源數(shù)據(jù)工具庫,其中包含了不少的機(jī)器學(xué)習(xí)的成熟算法與模型,相對于tensorflow和PyTorch,它用于圖像處理以及人臉面部特征提取、分類及對比這幾個(gè)方面比較具有通用性和優(yōu)越性,因此,Dlib正在越來越廣泛地應(yīng)用在人臉識(shí)別技術(shù)領(lǐng)域。
Dlib具有獨(dú)立使用的可移植代碼。Dlib中的代碼使用c++語言進(jìn)行開發(fā)而成,使用獨(dú)立封裝,在不借助第三方數(shù)據(jù)庫的情況下,可以直接移植到自己所需要設(shè)計(jì)的項(xiàng)目中進(jìn)行使用。
2.2 Dlib優(yōu)點(diǎn)
-
Dlib擁有全面的文檔說明。作為一個(gè)開源的人臉數(shù)據(jù)庫訓(xùn)練集,Dlib中有很多功能齊全的程序和文件,從人性化的角度而言的,Dlib在這一點(diǎn)上做的是非常不錯(cuò)的,因?yàn)樗鼮槊恳粋€(gè)程序文檔和文件都做了相對應(yīng)的注釋,這樣開發(fā)者就可以迅速準(zhǔn)確的調(diào)集程序文檔來完成自己所需要的項(xiàng)目功能。
-
Dlib涵蓋了支持功能完備的深度學(xué)習(xí)以及圖像處理的各類算法。Dlib為開發(fā)者提供了機(jī)器深度學(xué)習(xí)的各類成熟的完備算法,并且在圖像處理方面也為開發(fā)者帶來了能夠解決大多數(shù)實(shí)質(zhì)問題的優(yōu)良算法。例如基于SVM的遞歸和分類算法,以及專門用于面對大規(guī)模分類和遞歸的降維算法。當(dāng)然還有能夠?qū)ξ粗瘮?shù)進(jìn)行預(yù)分類和預(yù)測的相關(guān)向量機(jī),其分類和預(yù)測訓(xùn)練是基于貝葉斯框架。
2.3 相關(guān)代碼
import` `matplotlib.pyplot as plt import` `dlib import` `numpy as np import` `glob import` `re#正臉檢測器 detector``=``dlib.get_frontal_face_detector() #臉部關(guān)鍵形態(tài)檢測器 sp``=``dlib.shape_predictor(r``"D:LBJAVAscriptshape_predictor_68_face_landmarks.dat"``) #人臉識(shí)別模型 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)#輸入的待識(shí)別的人臉處理方法相同 img``=``plt.imread(r``'D:test_photo10.jpg'``) img``=``np.array(img) dets``=``detector(img,``1``) #計(jì)算輸入人臉和已有人臉之間的差異程度(比如用歐式距離來衡量) 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)``#計(jì)算輸入人臉和所有已有人臉描述向量的歐氏距離``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要正確顯示中文需要設(shè)置 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 人臉數(shù)據(jù)庫
本項(xiàng)目中將識(shí)別到的人臉保存的.db文件中,相關(guān)代碼如下:
class CoreUI(QMainWindow):database = './FaceBase.db'trainingData = './recognizer/trainingData.yml'cap = cv2.VideoCapture()captureQueue = queue.Queue() # 圖像隊(duì)列alarmQueue = queue.LifoQueue() # 報(bào)警隊(duì)列,后進(jìn)先出logQueue = multiprocessing.Queue() # 日志隊(duì)列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 = Falseself.useExternalCameraCheckBox.stateChanged.connect(lambda: self.useExternalCamera(self.useExternalCameraCheckBox))self.faceProcessingThread = FaceProcessingThread()self.startWebcamButton.clicked.connect(self.startWebcam)#A\B功能開關(guān)# 數(shù)據(jù)庫self.initDbButton.setIcon(QIcon('./icons/warning.png'))self.initDbButton.clicked.connect(self.initDb)self.timer = QTimer(self) # 初始化一個(gè)定時(shí)器self.timer.timeout.connect(self.updateFrame)2.5 人臉錄入加識(shí)別效果
錄入過程
識(shí)別效果
3 疲勞檢測算法
該系統(tǒng)采用Dlib庫中人臉68個(gè)關(guān)鍵點(diǎn)檢測shape_predictor_68_face_landmarks.dat的dat模型庫及視頻中的人臉,之后返回人臉特征點(diǎn)坐標(biāo)、人臉框及人臉角度等。本系統(tǒng)利用這68個(gè)關(guān)鍵點(diǎn)對駕駛員的疲勞狀態(tài)進(jìn)行檢測,算法如下:
Dlib庫68個(gè)特征點(diǎn)模型如圖所示:
3.1 眼睛檢測算法
基于EAR算法的眨眼檢測,當(dāng)人眼睜開時(shí),EAR在某個(gè)值域范圍內(nèi)波動(dòng),當(dāng)人眼閉合時(shí),EAR迅速下降,理論上接近于0。當(dāng)EAR低于某個(gè)閾值時(shí),眼睛處于閉合狀態(tài);當(dāng)EAR由某個(gè)值迅速下降至小于該閾值,再迅速上升至大于該閾值,則判斷為一次眨眼。為檢測眨眼次數(shù),需要設(shè)置同一次眨眼的連續(xù)幀數(shù)。眨眼速度較快,一般1~3幀即可完成眨眼動(dòng)作。眼部特征點(diǎn)如圖:
EAR計(jì)算公式如下:
當(dāng)后幀眼睛寬高比與前一幀差值的絕對值(EAR)大于0.2時(shí),認(rèn)為駕駛員在疲勞駕駛。(68點(diǎn)landmark中可以看到37-42為左眼,43-48為右眼)
右眼開合度可以通過以下公式:
眼睛睜開度從大到小為進(jìn)入閉眼期,從小到大為進(jìn)入睜眼期,計(jì)算最長閉眼時(shí)間(可用幀數(shù)來代替)。閉眼次數(shù)為進(jìn)入閉眼、進(jìn)入睜眼的次數(shù)。通過設(shè)定單位時(shí)間內(nèi)閉眼次數(shù)、閉眼時(shí)間的閾值判斷人是否已經(jīng)疲勞了。
相關(guān)代碼:
# 疲勞檢測,檢測眼睛和嘴巴的開合程度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 # 數(shù)據(jù)處理的庫 numpy import argparse import imutils import time import dlib import cv2 import math import time from threading import Threaddef eye_aspect_ratio(eye):# 垂直眼標(biāo)志(X,Y)坐標(biāo)A = dist.euclidean(eye[1], eye[5]) # 計(jì)算兩個(gè)集合之間的歐式距離B = dist.euclidean(eye[2], eye[4])# 計(jì)算水平之間的歐幾里得距離# 水平眼標(biāo)志(X,Y)坐標(biāo)C = dist.euclidean(eye[0], eye[3])# 眼睛長寬比的計(jì)算ear = (A + B) / (2.0 * C)# 返回眼睛的長寬比return ear3.2 打哈欠檢測算法
基于MAR算法的哈欠檢測,利用Dlib提取嘴部的6個(gè)特征點(diǎn),通過這6個(gè)特征點(diǎn)的坐標(biāo)(51、59、53、57的縱坐標(biāo)和49、55的橫坐標(biāo))來計(jì)算打哈欠時(shí)嘴巴的張開程度。當(dāng)一個(gè)人說話時(shí),點(diǎn)51、59、53、57的縱坐標(biāo)差值增大,從而使MAR值迅速增大,反之,當(dāng)一個(gè)人閉上嘴巴時(shí),MAR值迅速減小。
嘴部主要取六個(gè)參考點(diǎn),如下圖:
計(jì)算公式:
通過公式計(jì)算MAR來判斷是否張嘴及張嘴時(shí)間,從而確定駕駛員是否在打哈欠。閾值應(yīng)經(jīng)過大量實(shí)驗(yàn),能夠與正常說話或哼歌區(qū)分開來。為提高判斷的準(zhǔn)確度,采用雙閾值法進(jìn)行哈欠檢測,即對內(nèi)輪廓進(jìn)行檢測:結(jié)合張口度與張口時(shí)間進(jìn)行判斷。Yawn為打哈欠的幀數(shù),N為1 min內(nèi)總幀數(shù),設(shè)雙閾值法哈欠檢測的閾值為10%,當(dāng)打哈欠頻率Freq>10%時(shí),則認(rèn)為駕駛員打了1個(gè)深度哈欠或者至少連續(xù)2個(gè)淺哈欠,此時(shí)系統(tǒng)進(jìn)行疲勞提醒。
相關(guān)代碼:
# 疲勞檢測,檢測眼睛和嘴巴的開合程度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 # 數(shù)據(jù)處理的庫 numpy import argparse import imutils import time import dlib import cv2 import math import time from threading import Threaddef mouth_aspect_ratio(mouth): # 嘴部A = np.linalg.norm(mouth[2] - mouth[10]) # 51, 59B = np.linalg.norm(mouth[4] - mouth[8]) # 53, 57C = np.linalg.norm(mouth[0] - mouth[6]) # 49, 55mar = (A + B) / (2.0 * C)return mar相應(yīng)的演示效果如下:
3.3 點(diǎn)頭檢測算法
基于HPE算法的點(diǎn)頭檢測
HPE(Head Pose Estimation,HPE)算法步驟:2D人臉關(guān)鍵點(diǎn)檢測,3D人臉模型匹配,求解3D點(diǎn)和對應(yīng)2D點(diǎn)的轉(zhuǎn)換關(guān)系,根據(jù)旋轉(zhuǎn)矩陣求解歐拉角。檢測過程中需要使用世界坐標(biāo)系(UVW)、相機(jī)坐標(biāo)系(XYZ)、圖像中心坐標(biāo)系(uv)和像素坐標(biāo)系(xy)。一個(gè)物體相對于相機(jī)的姿態(tài)可以使用旋轉(zhuǎn)矩陣和平移矩陣來表示。
- 平移矩陣:物體相對于相機(jī)的空間位置關(guān)系矩陣,用T表示;
- 旋轉(zhuǎn)矩陣:物體相對于相機(jī)的空間姿態(tài)關(guān)系矩陣,用R表示。
因此必然少不了坐標(biāo)系轉(zhuǎn)換。如圖所示:
于是世界坐標(biāo)系(UVW)、相機(jī)坐標(biāo)系(XYZ)、圖像中心坐標(biāo)系(uv)和像素坐標(biāo)系(xy)四兄弟閃亮登場。相對關(guān)系如下:
世界坐標(biāo)系轉(zhuǎn)換到相機(jī)坐標(biāo):
相機(jī)坐標(biāo)系轉(zhuǎn)換到像素坐標(biāo)系:
像素坐標(biāo)系與世界坐標(biāo)系的關(guān)系為:
圖像中心坐標(biāo)系轉(zhuǎn)換到像素坐標(biāo)系:
得到旋轉(zhuǎn)矩陣后,求歐拉角:
設(shè)定參數(shù)閾值為0.3,在一個(gè)時(shí)間段,如10 s內(nèi),當(dāng)?shù)皖^歐拉角|Pitch|≥20°或者頭部傾斜歐拉角|Roll|≥20°的時(shí)間比例超過0.3時(shí),則認(rèn)為駕駛員處于瞌睡狀態(tài),發(fā)出預(yù)警。
相關(guān)效果展示:
4 PyQt5
4.1 簡介
Qt是一個(gè)跨平臺(tái)的 C++ 開發(fā)庫,主要用來開發(fā)圖形用戶界面程序(GUI),當(dāng)然也可以開發(fā)不帶界面的命令行程序。
但Qt 是純 C++ 開發(fā)的,PyQt5是基于圖形程序框架Qt5的Python語言實(shí)現(xiàn),由一組Python模塊構(gòu)成。
-
QLabel控件:用來顯示文本或圖像。
-
QLineEdit窗口控件:提供了一個(gè)單頁面的單行文本編輯器。
-
QTextEdit窗口控件:提供了一個(gè)單頁面的多行文本編輯器。
-
QPushButton窗口控件:提供了一個(gè)命令按鈕。
-
QRadioButton控件:提供了一個(gè)單選鈕和一個(gè)文本或像素映射標(biāo)簽。
-
QCheckBox窗口控件:提供了一個(gè)帶文本標(biāo)簽的復(fù)選框。
-
QspinBox控件:允許用戶選擇一個(gè)值,要么通過按向上/向下鍵增加/減少當(dāng)前顯示值,要么直接將值輸入到輸入框中。
-
QScrollBar窗口控件:提供了一個(gè)水平的或垂直的滾動(dòng)條。
-
QSlider控件:提供了一個(gè)垂直的或水平的滑動(dòng)條。
-
QComboBox控件:一個(gè)組合按鈕,用于彈出列表。
-
QMenuBar控件:提供了一個(gè)橫向菜單欄。
-
QStatusBar控件:提供了一個(gè)適合呈現(xiàn)狀態(tài)信息的水平條,通常放在QMainWindow的底部。
-
QToolBar控件:提供了一個(gè)工具欄,可以包含多個(gè)命令按鈕,通常放在QMainWindow的頂部。
-
QListView控件:可以顯示和控制可選的多選列表,可以設(shè)置ListMode或IconMode。
-
QPixmap控件:可以在繪圖設(shè)備上顯示圖像,通常放在QLabel或QPushButton類中。
-
Qdialog控件:對話框窗口的基類。
-
QWidget是所有用戶界面類的基類,它能接收所有的鼠標(biāo)、鍵盤和其他系統(tǒng)窗口事件。沒有被嵌入到父窗口中的Widget會(huì)被當(dāng)作一個(gè)窗口來調(diào)用,當(dāng)然,它也可以使用setWindowFlags(Qt.WindowFlags)函數(shù)來設(shè)置窗口的顯示效果。QWidget的構(gòu)造函數(shù)可以接收兩個(gè)參數(shù),其中第一個(gè)參數(shù)是該窗口的父窗口;第二個(gè)參數(shù)是該窗口的Flag,也就是- Qt.WindowFlags。根據(jù)父窗口來決定Widget是嵌入到父窗口中還是被當(dāng)作一個(gè)獨(dú)立的窗口來調(diào)用,根據(jù)Flag來設(shè)置Widget窗口的一些屬性。
-
QMainWindow(主窗口)一般是應(yīng)用程序的框架,在主窗口中可以添加所需要的Widget,比如添加菜單欄、工具欄、狀態(tài)欄等。主窗口通常用于提供一個(gè)大的中央窗口控件(如文本編輯或者繪制畫布)以及周圍的菜單欄、工具欄和狀態(tài)欄。QMainWindow常常被繼承,這使得封裝中央控件、菜單欄,工具欄以及窗口狀態(tài)變得更容易,也可以使用Qt Designer來創(chuàng)建主窗口。
4.2相關(guān)界面代碼
#部分代碼 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 DataManageUIfrom 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)#設(shè)置無邊框 但是按鍵得重新設(shè)置了#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): # 重寫移動(dòng)事件self._endPos = e.pos() - self._startPosself.move(self.pos() + self._endPos)def mousePressEvent(self, e: QMouseEvent):if e.button() == Qt.LeftButton:self._isTracking = Trueself._startPos = QPoint(e.x(), e.y())def mouseReleaseEvent(self, e: QMouseEvent):if e.button() == Qt.LeftButton:self._isTracking = Falseself._startPos = Noneself._endPos = Nonedef 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 最后
總結(jié)
以上是生活随笔為你收集整理的机器视觉毕业设计 深度学习疲劳驾驶人脸检测系统 - python opencv的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: labview通过编程自定义控件运行时快
- 下一篇: Python - 删除文件、文件夹