Python PyQt5 人脸识别软件

python 复制代码
# !/usr/bin/python3
# -*- coding:utf-8 -*-
"""
@author: JHC000abc@gmail.com
@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)
python 复制代码
# -*- 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", "识别人脸"))
python 复制代码
# !/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 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

相关推荐
dialect_3 小时前
KMP算法
开发语言·c++·算法
总要学点什么4 小时前
第89篇:三维特效-螺旋圆效果——让螺旋臂卷起一圈圈外扩的涟漪
开发语言·javascript·ecmascript·webgl·cesium·空间分析·1024程序员节
前端精髓4 小时前
结构化输出with_structured_output(抽卡)
python·langchain
听风吹等浪起5 小时前
第26章:ViT+InceptionDW+FocalLoss改进|CT骨折影像二分类完整Pytorch实现(含PyQt5推理GUI)
pytorch·qt·分类
尹人入圣5 小时前
目前热门的IP驱动产业新场景新工具
网络·python·网络协议·tcp/ip
ShineWinsu5 小时前
对于Qt:QRadioButton常见属性以及QButtonGroup的解析
数据库·c++·qt·microsoft·gui·qradiobutton·qbuttongroup
开开心心_Every6 小时前
快速隐藏程序工具自定义快捷键一键切换
java·开发语言·前端·spring·智能手机·word·intellij-idea
chenbingjie_c6 小时前
C++ 多态完全指南:从虚函数重写到虚函数表原理
开发语言·c++
Nuanyt6 小时前
Agent 学习笔记(下篇三):上线工程、进阶选择与操作界面(Stage 7 / 7.5 / 8 + 延伸路线)
笔记·python·学习·memory·aiagent·harness
吴卫斌6 小时前
定投ETF实战指南(四):行业/主题ETF——定投的“进攻端“
开发语言·python·股票·量化