Python PyQt5 人脸识别软件

Python PyQt5 人脸识别软件_第1张图片

# !/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

你可能感兴趣的:(python,qt,开发语言)