python关于PyQt5结合opencv的简单使用

一、话不多说,先看图

借用一下马先生的图()

python关于PyQt5结合opencv的简单使用

python关于PyQt5结合opencv的简单使用

二、看main函数

if __name__ == '__main__':
    app = QApplication(sys.argv)
    main_window = QMainWindow()

    ui = boke_ui.Ui_MainWindow()
    ui.setupUi(main_window)
    main_window.show()
    my_face = Campus_face(ui)
    sys.exit(app.exec())

main函数也没什么

三、我写的类

class Campus_face:
    img_label = None
    face_label = None
    car_label = None
    classroom_img = None
    face_collection = 0

    def __init__(self, my_ui):
        self.my_ui = my_ui
        self.set_face_label()

        my_ui.pushButton.clicked.connect(self.face_reg_thread)
        my_ui.pushButton_2.clicked.connect(self.face_face_collection_yz)

    def set_face_label(self):
        hbox = QHBoxLayout(self.my_ui.groupBox)
        self.img_label = QLabel()
        hbox.addWidget(self.img_label)

        hbox2 = QHBoxLayout(self.my_ui.groupBox_2)
        self.face_label = QLabel()
        hbox2.addWidget(self.face_label)

        hbox3 = QHBoxLayout(self.my_ui.groupBox_3)
        self.car_label = QLabel()
        hbox3.addWidget(self.car_label)

    def face_face_collection_yz(self):
        self.face_collection = 1

    def face_reg_thread(self):
        th = threading.Thread(target=self.face_reg)
        th.start()

    def face_reg(self):
        self.face_collection = 0
        cap = cv2.VideoCapture(1)
        frame_num = cap.get(propId=cv2.CAP_PROP_FPS)  # 获取视频帧数

        frame_fourcc = cap.get(propId=cv2.CAP_PROP_FOURCC)  # 视频编码格式
        frame_count = cap.get(propId=cv2.CAP_PROP_FRAME_COUNT)  # 视频有多少帧
        frame_height = cap.get(propId=cv2.CAP_PROP_FRAME_HEIGHT)  # 视频 高
        frame_width = cap.get(propId=cv2.CAP_PROP_FRAME_WIDTH)  # 视频  宽

        while cap.isOpened():
            flag, frame = cap.read()
            frame = cv2.resize(src=frame, dsize=(int(frame_width / 1.2), int(frame_height / 1.2)), interpolation=None)
            frame = cv2.flip(frame, 1)
            img = frame
            frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
            faces = face_cascade.detectMultiScale(frame, scaleFactor=1.2, minNeighbors=5, flags=None, minSize=None,
                                                  maxSize=None)

            for (x, y, w, h) in faces:
                # 人脸检测
                img = cv2.rectangle(img=img, pt1=(x, y), pt2=(x + w, y + h),
                                    color=[int(np.random.randint(0, 256, size=1)[0]),
                                           int(np.random.randint(0, 256, size=1)[0]),
                                           int(np.random.randint(0, 256, size=1)[0])], thickness=2)

                face_area = img[y:y + h, x:x + w]
                img_face_name = r'.\tmp\tmp_face_img.jpg'
                cv2.imwrite(img_face_name, face_area)
                self.face_label.setPixmap(QPixmap(img_face_name))

                # 人眼
                eyes = eye_cascade.detectMultiScale(face_area, scaleFactor=1.2, minNeighbors=2, flags=None,
                                                    minSize=None, maxSize=None)
                for (ex, ey, ew, eh) in eyes:
                    cv2.rectangle(face_area, (ex, ey), (ex + ew, ey + eh),
                                  color=[int(np.random.randint(0, 256, size=1)[0]),
                                         int(np.random.randint(0, 256, size=1)[0]),
                                         int(np.random.randint(0, 256, size=1)[0])], thickness=1, lineType=None,
                                  shift=None)

            # cv2.imshow('campus face', img)
            img_name = r'.\tmp\tmp_img.jpg'
            cv2.imwrite(img_name, img)
            self.img_label.setPixmap(QPixmap(img_name))


            if ord('q') == cv2.waitKey(int(1000 / frame_num)) or flag == False:
                break
            if self.face_collection == 1:
                break
        cv2.destroyAllWindows()
        cap.release()

内容也不算多,知识挺多的

四、当然还得引入一些模块及相关配置

import sys

import cv2
import numpy as np
from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import QHBoxLayout, QLabel, QVBoxLayout, QApplication, QMainWindow, QFormLayout, QLineEdit, QWidget
import threading
from Campus_security import boke_ui

face_cascade = cv2.CascadeClassifier(
    r'G:\huwei_welding\Campus_security\cascade_file\haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier(r'G:\huwei_welding\Campus_security\cascade_file\haarcascade_eye.xml')

下面两个是人脸和人眼的级联器而已

五、还有图形界面

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'boke_ui.ui'
#
# Created by: PyQt5 UI code generator 5.15.0
#
# 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_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1148, 724)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.horizontalLayout = QtWidgets.QHBoxLayout(self.centralwidget)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.tabWidget = QtWidgets.QTabWidget(self.centralwidget)
        font = QtGui.QFont()
        font.setFamily("黑体")
        font.setPointSize(14)
        self.tabWidget.setFont(font)
        self.tabWidget.setObjectName("tabWidget")
        self.tab = QtWidgets.QWidget()
        self.tab.setObjectName("tab")
        self.pushButton = QtWidgets.QPushButton(self.tab)
        self.pushButton.setGeometry(QtCore.QRect(280, 560, 171, 61))
        self.pushButton.setObjectName("pushButton")
        self.pushButton_2 = QtWidgets.QPushButton(self.tab)
        self.pushButton_2.setGeometry(QtCore.QRect(60, 560, 181, 61))
        self.pushButton_2.setObjectName("pushButton_2")
        self.pushButton_5 = QtWidgets.QPushButton(self.tab)
        self.pushButton_5.setGeometry(QtCore.QRect(490, 560, 171, 61))
        self.pushButton_5.setObjectName("pushButton_5")
        self.widget = QtWidgets.QWidget(self.tab)
        self.widget.setGeometry(QtCore.QRect(10, 10, 1101, 541))
        self.widget.setObjectName("widget")
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.widget)
        self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.groupBox = QtWidgets.QGroupBox(self.widget)
        self.groupBox.setObjectName("groupBox")
        self.horizontalLayout_2.addWidget(self.groupBox)
        self.verticalLayout = QtWidgets.QVBoxLayout()
        self.verticalLayout.setObjectName("verticalLayout")
        self.groupBox_2 = QtWidgets.QGroupBox(self.widget)
        self.groupBox_2.setStyleSheet("")
        self.groupBox_2.setObjectName("groupBox_2")
        self.verticalLayout.addWidget(self.groupBox_2)
        self.groupBox_3 = QtWidgets.QGroupBox(self.widget)
        self.groupBox_3.setObjectName("groupBox_3")
        self.verticalLayout.addWidget(self.groupBox_3)
        self.horizontalLayout_2.addLayout(self.verticalLayout)
        self.horizontalLayout_2.setStretch(0, 4)
        self.horizontalLayout_2.setStretch(1, 2)
        self.tabWidget.addTab(self.tab, "")
        self.tab_2 = QtWidgets.QWidget()
        self.tab_2.setObjectName("tab_2")
        self.tabWidget.addTab(self.tab_2, "")
        self.horizontalLayout.addWidget(self.tabWidget)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 1148, 26))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        self.tabWidget.setCurrentIndex(0)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "关于PyQt图像化界面人脸识别"))
        self.pushButton.setText(_translate("MainWindow", "打开摄像头"))
        self.pushButton_2.setText(_translate("MainWindow", "关闭摄像头"))
        self.pushButton_5.setText(_translate("MainWindow", "保存视频"))
        self.groupBox.setTitle(_translate("MainWindow", "视频"))
        self.groupBox_2.setTitle(_translate("MainWindow", "人脸"))
        self.groupBox_3.setTitle(_translate("MainWindow", "车辆"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "QT视频处理"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "百度云语音识别"))

Qt Designer拖出来的,没什么好讲的

六、运行

将二、三、四方一个文件,五放一个文件(这命名和我的不同那就得修改模块引入那句代码了),然后就可以运行了

七、关键代码关键知识点

face_cascade = cv2.CascadeClassifier(
    r'G:\huwei_welding\Campus_security\cascade_file\haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier(r'G:\huwei_welding\Campus_security\cascade_file\haarcascade_eye.xml')

这个没有,github opencv自己下载  (级联器相关)

    def set_face_label(self):
        hbox = QHBoxLayout(self.my_ui.groupBox)
        self.img_label = QLabel()
        hbox.addWidget(self.img_label)

        hbox2 = QHBoxLayout(self.my_ui.groupBox_2)
        self.face_label = QLabel()
        hbox2.addWidget(self.face_label)

        hbox3 = QHBoxLayout(self.my_ui.groupBox_3)
        self.car_label = QLabel()
        hbox3.addWidget(self.car_label)

在groupbox那添加label,用于显示图片而已

faces = face_cascade.detectMultiScale(frame, scaleFactor=1.2, minNeighbors=5, flags=None, minSize=None,
                                      maxSize=None)

for (x, y, w, h) in faces:
    # 人脸检测
    img = cv2.rectangle(img=img, pt1=(x, y), pt2=(x + w, y + h),
                        color=[int(np.random.randint(0, 256, size=1)[0]),
                               int(np.random.randint(0, 256, size=1)[0]),
                               int(np.random.randint(0, 256, size=1)[0])], thickness=2)

    face_area = img[y:y + h, x:x + w]
    img_face_name = r'.\tmp\tmp_face_img.jpg'
    cv2.imwrite(img_face_name, face_area)
    self.face_label.setPixmap(QPixmap(img_face_name))

这个也就是将人脸框出来而已(级联器搞出来的人脸区域坐标),然后花里胡哨点用numpy的随机数生成好看点的框框而已

八、好像也没有什么了

忘了再回去复习下吧,后面在不错人脸识别(人脸训练)

 

上一篇:【人脸识别】基于matlab GUI PCA人脸识别(识别率)【含Matlab源码 802期】


下一篇:VR制作中必须踩的坑365之058(oculus2、UE4、UE5、VR记录一年的踩坑之旅)脸部训练ZRT