基于学生课堂管理签到的AI人脸识别系统(五)

多线程实现与人脸库的创建


在上一遍 文章中,我们实现了摄像头人脸属性的检测和窗口的显示。这一次,我们将把实现多线程的操作以及创建人脸库。

一、多线程

首先,我们先新建一个Python文件,取名为detect.py ,然后将它作为新线程的相应操作
detetc.py 完整代码:

import base64
import cv2
import requests
from PyQt5.QtCore import QThread, QTimer, pyqtSignal

# QThread是PyQt5提供的线程类
# 由于是一个已经完成的类,功能已经写好,线程类线程的功能需要我们自己完成
# 就需要自己完成需要的线程类:创建一个新的线程类(功能就可以自己定义),继承QThread,新写的类就是线程类

# 线程类进行执行只会执行线程类中的run函数,如果有新的功能需要实现的话,重新写一个run函数完成

class detect_thread(QThread):
    transmit_data = pyqtSignal(dict)
    OK = True
    def __init__(self, token):
        super(detect_thread, self).__init__()
        self.access_token = token
        # print(self.access_token)
        self.condition = False

    # run函数执行结束,代表线程结束
    def run(self):
        while self.OK:
            if self.condition:
                self.detect_face(self.base64_image)
                self.condition = False

    def get_base64(self, base64_image):
        # 当窗口产生信号,调用这个槽函数,就把传递的数据存放在线程的变量中
        self.base64_image = base64_image
        self.condition = True

    # 进行人脸检测
    def detect_face(self, base64_image):
        # 发送请求的地址
        request_url = "https://aip.baidubce.com/rest/2.0/face/v3/detect"
        # 请求参数是一个字典,在字典中存储了,百度AI要识别的图片信息,要识别的属性内容
        params = {
   "image": base64_image,  # 图片信息字符串
                  "image_type": "BASE64",  # 图片信息的格式
                  "face_field": "gender,age,beauty,expression,face_shape,glasses,emotion,mask",  # 请求识别人脸的属性,各个属性在字符串中用','逗号隔开
                  "max_face_num": 10,
                  }
        # 访问令牌
        access_token = self.access_token
        # 把请求地址和访问令牌组成可用的网络请求地址
        request_url = request_url + "?access_token=" + access_token
        # 参数,设置请求的格式体
        headers = {
   'content-type': 'application/json'}
        # 发送网络post请求,请求百度AI进行人脸检测,返回检测结果
        # 发送网络请求,就会等待一段时间,程序就在这里阻塞执行
        response = requests.post(request_url, data=params, headers=headers)
        if response:
            # print(response.json())
            data = response.json()
            # print(data)
            self.transmit_data.emit(dict(data))

mywindow.py 完整代码

from mainwindow import Ui_MainWindow
from PyQt5.QtWidgets import QMainWindow, QFileDialog, QMessageBox, QInputDialog
from PyQt5.QtCore import QTimer, QDateTime, QDate, QTime, pyqtSignal
from PyQt5.QtGui import QPixmap
from cameravideo import camera
import requests, json
import cv2
import base64
from detect import detect_thread

'''
子类,继承UI_mainwindow与qmainwindow
Ui_MainWindow
    包含界面的设计,窗口中的窗口部件
QMainWindow
    包含整个界面窗口,窗口的操作
mywindow
    完整的窗口类
'''
class mywindow(Ui_MainWindow, QMainWindow):
    detect_data_signal = pyqtSignal(bytes)

    def __init__(self):
        super(mywindow, self).__init__()
        self.setupUi(self)   # 创建界面内容
        #self.label.setScaledContents(True)

        # 创建一个定时器对象
        self.datetime = QTimer(self)
        # 启动获取系统/日期时间的定时器,定时时间为500毫秒,500毫秒产生一次信号
        self.datetime.start(500)
        # 关联时间/日期的定时器信号与槽函数
        self .datetime.timeout.connect(self.date_time)

        # 创建窗口就应该完成访问令牌的申请(获取)
        self.get_accesstoken()

        '''
        # 信号与槽的关联
        # self.actionopen:指定对象
        # connect:关联(槽函数)
        # self.on_actionopen:关联函数是什么
        '''
        # 开启摄像头
        self.actionopen.triggered.connect(self.on_actionopen)
        # 关闭摄像头
        self.actionclose.triggered.connect(self.on_actionclose)

    # 函数功能:获取日期时间,添加到对应编辑器
    def date_time(self):
        # 获取日期
        date = QDate.currentDate()
        # print(date)
        # self.dateEdit.setDate(date)
        self.label_3.setText("日期:"+date.toString())
        # 获取时间
        time = QTime.currentTime()
        # print(time)
        # self.timeEdit.setTime(time)
        self.label_2.setText("时间:"+time.toString())
        # 获取日期时间
        # datetime = QDateTime.currentDateTime()
        # print(datetime)

    '''
    信号槽功能:
        当某个组件设计了信号槽功能时,当信号产生,会主动调用槽函数去完成对应的一个功能
        信号:当以某种特定的操作,操作到这个组件时,就会主动产生对应操作的信号
    '''
    def 
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值