# !/usr/bin/python3
# -*- coding:utf-8 -*-
"""
@author: [email protected]
@file: untitled_ctrl.py
@time: 2023/8/6 16:29
@desc:
"""
import copy
import time
import uuid
import os
import cv2
from gui.ui.untitled import Ui_widget
from PyQt5 import QtWidgets
from PyQt5.QtCore import pyqtSignal
from PyQt5.QtGui import QPixmap, QImage
from threading import Thread
from queue import Queue
class UntitledCtrl(QtWidgets.QWidget):
"""
"""
single_frame = pyqtSignal()
def __init__(self,rootpath):
super(UntitledCtrl, self).__init__()
self.rootpath = rootpath
self.resize(1000, 521)
self.ui = Ui_widget()
self.ui.setupUi(self)
print(rootpath)
self.img_que = Queue()
self.ui.pushButton_cut.hide()
self._flag()
self._slot()
self._thread()
def _thread(self):
t = Thread(target=self.camera)
t.start()
t2 = Thread(target=self.show_img)
t2.start()
def _flag(self):
self.flag_start = True
self.flag_face = True
self.cap = None
self.pause = False
self.frame = ""
self.cut = ""
def _slot(self):
self.ui.pushButton_start.clicked.connect(self.start_pause)
self.ui.pushButton_check_face.clicked.connect(self.face_check)
self.single_frame.connect(self.show_img)
def show_img(self):
"""
:return:
"""
while True:
img = self.img_que.get()
self.ui.label_camera.setPixmap(QPixmap(img))
def add_face_box(self):
"""
:return:
"""
if self.flag_start:
self.cut = copy.deepcopy(self.frame)
if self.flag_face:
for x, y, w, h in self.get_face_opt():
self.cut = cv2.rectangle(
img=self.cut,
pt1=(x, y),
pt2=(x + w, y + h),
color=(0, 0, 255),
thickness=-1,
lineType=cv2.LINE_8,
)
image = cv2.cvtColor(self.cut, cv2.COLOR_RGB2BGR)
self.cut = QImage(
image.data,
image.shape[1],
image.shape[0],
QImage.Format_RGB888)
self.img_que.put(self.cut)
def camera(self):
"""
:return:
"""
try:
if not self.cap:
self.cap = cv2.VideoCapture(0) # 使用默认摄像头
if not self.cap.isOpened():
print("无法打开摄像头")
exit()
while not self.pause:
ret, self.frame = self.cap.read()
if not ret:
print("无法读取视频流")
break
else:
self.add_face_box()
self.cap.release()
except Exception as e:
print(e,e.__traceback__.tb_lineno)
def get_face_opt(self):
"""
:return:
"""
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades +'haarcascade_frontalface_default.xml')
faces = face_cascade.detectMultiScale(self.cut, 1.1, 4)
for (x, y, w, h) in faces:
yield x, y, w, h
def start_pause(self):
"""
:return:
"""
if self.flag_start:
self.ui.pushButton_start.setText("暂停")
self.flag_start = False
else:
self.ui.pushButton_start.setText("开始")
self.flag_start = True
def face_check(self):
"""
:return:
"""
if self.flag_face:
self.flag_face = False
self.ui.pushButton_check_face.setText("暂停识别")
else:
self.flag_face = True
self.ui.pushButton_check_face.setText("识别人脸")
def save(self):
file = "gui/res/{}.png".format(uuid.uuid4())
cv2.imencode(
".{}".format(".{}".format(os.path.splitext(file)[-1])), self.frame)[1].tofile(file)
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'untitled.ui'
#
# Created by: PyQt5 UI code generator 5.15.9
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_widget(object):
def setupUi(self, widget):
widget.setObjectName("widget")
# widget.resize(836, 521)
self.horizontalLayout = QtWidgets.QHBoxLayout(widget)
self.horizontalLayout.setObjectName("horizontalLayout")
self.stackedWidget = QtWidgets.QStackedWidget(widget)
self.stackedWidget.setObjectName("stackedWidget")
self.page = QtWidgets.QWidget()
self.page.setObjectName("page")
self.gridLayout = QtWidgets.QGridLayout(self.page)
self.gridLayout.setObjectName("gridLayout")
self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.label_camera = QtWidgets.QLabel(self.page)
self.label_camera.setStyleSheet("border-width: 3px;\n"
"border-style: dot-dot-dash;\n"
"border-color: purple;\n"
"border-radius: 50px;\n"
"")
self.label_camera.setText("")
self.label_camera.setObjectName("label_camera")
self.horizontalLayout_2.addWidget(self.label_camera)
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout_2.addItem(spacerItem)
self.frame = QtWidgets.QFrame(self.page)
self.frame.setStyleSheet("border-width: 3px;\n"
"border-style: dot-dot-dash;\n"
"border-color: purple;\n"
"border-radius: 50px;\n"
"")
self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
self.frame.setObjectName("frame")
self.pushButton_start = QtWidgets.QPushButton(self.frame)
self.pushButton_start.setGeometry(QtCore.QRect(100, 20, 93, 28))
self.pushButton_start.setStyleSheet("border-style: solid;\n"
"border-color:purple;")
self.pushButton_start.setObjectName("pushButton_start")
self.pushButton_cut = QtWidgets.QPushButton(self.frame)
self.pushButton_cut.setGeometry(QtCore.QRect(100, 80, 93, 28))
self.pushButton_cut.setStyleSheet("border-style: solid;\n"
"border-color:purple;")
self.pushButton_cut.setObjectName("pushButton_cut")
self.pushButton_check_face = QtWidgets.QPushButton(self.frame)
self.pushButton_check_face.setGeometry(QtCore.QRect(100, 140, 93, 28))
self.pushButton_check_face.setStyleSheet("border-style: solid;\n"
"border-color:purple;")
self.pushButton_check_face.setObjectName("pushButton_check_face")
self.horizontalLayout_2.addWidget(self.frame)
self.horizontalLayout_2.setStretch(0, 150)
self.horizontalLayout_2.setStretch(1, 1)
self.horizontalLayout_2.setStretch(2, 100)
self.gridLayout.addLayout(self.horizontalLayout_2, 0, 0, 1, 1)
self.stackedWidget.addWidget(self.page)
self.page_2 = QtWidgets.QWidget()
self.page_2.setObjectName("page_2")
self.stackedWidget.addWidget(self.page_2)
self.horizontalLayout.addWidget(self.stackedWidget)
self.retranslateUi(widget)
QtCore.QMetaObject.connectSlotsByName(widget)
def retranslateUi(self, widget):
_translate = QtCore.QCoreApplication.translate
widget.setWindowTitle(_translate("widget", "FaceCheck"))
self.pushButton_start.setText(_translate("widget", "启动"))
self.pushButton_cut.setText(_translate("widget", "截图"))
self.pushButton_check_face.setText(_translate("widget", "识别人脸"))
# !/usr/bin/python3
# -*- coding:utf-8 -*-
"""
@author: [email protected]
@file: main.py
@time: 2023/8/6 16:31
@desc:
"""
from gui.ctrl.untitled_ctrl import UntitledCtrl
import os
import sys
from PyQt5 import QtWidgets
from PyQt5.QtCore import QCoreApplication, Qt
from qt_material import apply_stylesheet
if __name__ == "__main__":
root_path = os.getcwd()
QCoreApplication.setAttribute(Qt.AA_EnableHighDpiScaling)
app = QtWidgets.QApplication(sys.path)
try:
apply_stylesheet(app, theme="dark_teal.xml")
except BaseException:
print("样式加载失败")
Form = UntitledCtrl(root_path)
Form.show()
sys.exit(app.exec_())
haarcascade_frontalface_default.xml
密码:JDBC
2