# !/usr/bin/python3# -*- coding:utf-8 -*-"""@author: JHC000abc@gmail.com@file: untitled_ctrl.py@time: 2023/8/6 16:29@desc:"""import copyimport threadingimport timeimport tracebackimport uuidimport osimport cv2from gui.ui.untitled import Ui_widgetfrom PyQt5 import QtWidgetsfrom PyQt5.QtCore import pyqtSignalfrom PyQt5.QtGui import QPixmap, QImagefrom threading import Threadfrom queue import Queueimport numpyimport PyQt5class UntitledCtrl(QtWidgets.QWidget): """ """ single_frame = pyqtSignal(PyQt5.QtGui.QImage) def __init__(self, rootpath): super(UntitledCtrl, self).__init__() self.rootpath = rootpath self.resize(980, 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.th_show) def th_show(self, img): if img: try: self.ui.label_camera.setPixmap(QPixmap(img)) except BaseException: pass def show_img(self): """ :return: """ while True: try: if not self.img_que.empty(): img, nums = self.img_que.get() for i in range(nums): self.single_frame.emit(img) time.sleep(0.01) except Exception as e: print("e2", e) time.sleep(0.01) def add_face_box(self): """ :return: """ flag = False if self.flag_start: if self.frame is not None: self.cut = copy.deepcopy(self.frame) try: if self.flag_face: for x, y, w, h in self.get_face_opt():try: self.cut = cv2.rectangle( img=self.cut, pt1=(x, y), pt2=(x + w, y + h), color=(0, 0, 255), thickness=2, lineType=cv2.INTER_LINEAR, ) flag = Trueexcept BaseException: pass image = cv2.cvtColor(self.cut, cv2.COLOR_RGB2BGR) self.cut = QImage( image.data, image.shape[1], image.shape[0], QImage.Format_RGB888) if flag: self.img_que.put([self.cut, 30]) else: self.img_que.put([self.cut, 1]) except Exception as e: print("e1", str(traceback.print_exc())) 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(traceback.print_exc()) def get_face_opt(self): """ :return: """ face_cascade = cv2.CascadeClassifier( cv2.data.haarcascades + 'haarcascade_frontalface_default.xml') try: faces = face_cascade.detectMultiScale(self.cut, 1.1, 4) for (x, y, w, h) in faces: yield x, y, w, h except BaseException: pass 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, QtWidgetsclass 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: JHC000abc@gmail.com@file: main.py@time: 2023/8/6 16:31@desc: """from gui.ctrl.untitled_ctrl import UntitledCtrlimport osimport sysfrom PyQt5 import QtWidgetsfrom PyQt5.QtCore import QCoreApplication, Qtfrom qt_material import apply_stylesheetif __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
来源地址:https://blog.csdn.net/CXY00000/article/details/132137633