基于人脸识别的课堂签到管理系统(四)---摄像头上传实时数据,百度AI读取并返回以及多线程操作

  • 一. 前言概述
  • 二.摄像头上传数据,读取百度AI返回信息
  • 三.多线程操作
  • 四.程序展示
  • 五.相关下载

一. 前言概述

在返回的结果中,在face_list列表中,每一项值就是一个人脸信息,每个人脸信息用字典来表示,字典中包含什么信息由发送请求的参数face_field键值决定

返回结果内容的解析通过for循环取出每个字典数据(人脸),进行单独解析

解析数据后,进行显示
人脸信息显示:
设计两个窗口部件(textEdit)用来显示信息
进行解析完成把信息依此添加到窗口中

人脸识别操作:
从摄像头获取画面,进行人脸检测函数的调用,当调用一次函数就检测一次
但是百度网络API的QPS为2(每秒只有2次)
完成网络请求限制,需要单独去设置人脸检测(500ms),每500ms额外再获取一次摄像头画面,这次获取就用作检测
通过设置定时器,产生信号,关联槽函数,完成功能
原先10ms获取画面只用作,显示画面(流畅)
每500ms发送网络请求,调用post函数,等待返回结果,就会存在一定的等待时间,程序就在这里阻塞执行,那10ms会调用的显示函数就不会执行了,所以会存在一定卡顿现象
采用多线程方式解决卡顿现象(把进行人脸检测的操作交给新的线程去完成)
通过创建一个新的线程,去执行post请求这种耗时操作(每500ms执行一次)
实现方式(post请求):
摄像头交给线程,线程进行采集
窗口采集,把画面转换成base64交给线程
当获取画面后,就把数据交给线程的函数:使用信号槽,当获取画面就产生信号,连接线程的检测函数

二.摄像头上传数据,读取百度AI返回信息

这次相较于上一次,做了较大改变。首先是当我们启动界面时,就会自动取获取access_toke访问令牌,不再是点击按钮来获取令牌了。

#获取进行网络请求的访问令牌def get_accesstoken(self):print("get_accesstoken")#host对象是字符串对象存储是授权的服务地址-----获取accesstoken的地址host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=1cFzLl7ZshdilAAMZnnyX4Ak&client_secret=2OgXkKUAPSEQzQmnkj88LGGoj71Kk3Tj'#发送网络请求   requests网络库#使用get函数发送网络请求,参数为网络请求的地址,执行时会产生返回结果,结果就是请求的结果response = requests.get(host)if response:# print(response.json())data = response.json()self.access_token = data.get('access_token')print(self.access_token)

同时将通过对话框选取图片的方式改为了通过摄像头来获取画面,每个10ms获取一帧画面

    def show_cameradata(self):#获取摄像头数据,转换数据pic = self.cameravideo.camera_to_pic()#显示数据,显示画面self.label.setPixmap(pic)

因为前文提到过,我们用的是百度免费提供的人脸检测,所以只能够支持QPS为2(每秒只有2次),所以这里再设置一个500ms的定时器,每500ms发送给百度AI进行人脸检测

 def get_cameradata(self):# 摄像头获取画面camera_data = self.cameravideo.read_camera()# 把摄像头画面转换成图片,然后设置编码base64编码格式数据_, enc = cv2.imencode('.jpg', camera_data)base64_image = base64.b64encode(enc.tobytes())#产生信号,传递数据self.detect_data_signal.emit(str(base64_image))

三.多线程操作

在测试的过程中,能够明显的发现存在卡顿现象,这是因为我们这代码还是单线程,在每10ms截取一帧画面显示的同时,每500ms也在发送请求,这就导致在窗口的显示画面中会出现明显的卡顿现象。
这时就需要使用多线程了。
新建一个detect.py作为我们的多线程类
QThread就是PyQt5提供的线程类
由于是一个完成了的类,功能已经写好了,线程类线程的功能需要我们自己完成

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

class detect_thread(QThread):def __init__(self,token):super(detect_thread,self).__init__()#初始化操作self.access_token = token#run函数执行结束,代表线程结束def run(self):print("run")'''self.time = QTimer(self)self.time.start(500)self.time.timeout.connect(self.detect_face)'''self.exec_()

同时在多线程类中,需要实现每隔500ms发送请求,以及获取百度AI返回的人脸信息

    def detect_face(self,base64_image):'''#对话框获取图片#获取一张图片(一帧画面)#getOpenFileName通过对话框的形式获取一个图片(.JPG)路径path,ret = QFileDialog.getOpenFileName(self,"open picture",".","图片格式(*.jpg)")#把图片转换成base64编码格式fp = open(path,'rb')base64_imag = base64.b64encode(fp.read())print(base64_imag)'''# 摄像头获取画面# camera_data = self.cameravideo.read_camera()# # 把摄像头画面转换成图片,然后设置编码base64编码格式数据# _, enc = cv2.imencode('.jpg', camera_data)# base64_image = base64.b64encode(enc.tobytes())# 发送请求的地址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:data = response.json()#data是请求数据的结果,需要进行解析,单独拿出所需的数据内容,分开print(data)

在定义好了多线程类后,我们就要在mywindow.py类中去引用它。

#创建线程完成检测def create_thread(self):self.detectThread = detect_thread(self.access_token,)self.detectThread.start()

为了追求更加流畅,还可以自定义一个信号槽,每500ms就从mywindow.py发送一帧画面的数据给多线程类

detect_data_signal = pyqtSignal(str)

当点击启动签到时,设置定时器,每500ms就将画面数据发送给多线程类
当然了除了mywindow.py发送数据给detece.py多线程类数据,还可以detece.py多线程类返回百度AI发送的人脸信息给mywindow.py,并显示在窗口的“学生人脸信息”,但限于时间关系,就只能完成到这。

四.程序展示

启动程序,会自动获取access_token访问令牌
点击签到,选择启动签到

五.相关下载

代码下载:Face_Recognition_Project_4.zip。

基于人脸识别的课堂签到管理系统(四)---摄像头上传实时数据,百度AI读取并返回信息以及多线程操作相关推荐

  1. 【项目实训】基于人脸识别的课堂签到管理系统(python+qt5+sqlite3+百度智能云)

    [项目实训]基于人脸识别的课堂签到管理系统(python+qt5+sqlite3+百度智能云) 一.环境介绍 二.签到功能 2.1 启动签到 2.2 结束签到 三.用户组操作 3.1 添加用户组 3. ...

  2. 基于人脸识别的课堂签到管理系统(六)---删除,查询用户组以及人脸的添加,删除,更新

    基于人脸识别的课堂签到管理系统(六)---删除,查询用户组以及人脸的添加,删除 一.用户组操作 1.1 查询用户组 1.2 删除用户组 二.人脸操作 2.1 人脸添加 2.2 人脸更新 2.3 人脸删 ...

  3. 基于人脸识别的课堂签到管理系统(五)---启动/结束签到,以及在百度智能云创建用户组

    基于人脸识别的课堂签到管理系统(五)---启动/结束签到,以及在百度智能云创建用户组 一.前言概述 二.签到功能 2.1 启动签到 2.2 结束签到 三.创建用户 四.程序展示 五.相关下载 一.前言 ...

  4. 基于人脸识别的课堂签到管理系统(三)---实时时间显示以及百度AI人脸识别

    基于人脸识别的课堂签到管理系统(三)---实时时间显示以及百度AI人脸识别 一.前言概述 二.实时时间显示 三.百度AI人脸识别 3.1 获取access_token 3.2 发送请求,通过网络请求方 ...

  5. 基于人脸识别的课堂签到管理系统(一)---环境设置以及简单的QT界面设计

    基于人脸识别的课堂签到管理系统(一)---环境设置以及简单的QT界面设计 一.前言 二.Pycharm安装与环境配置 2.1 Pycharm安装配置 2.2 Pycharm环境配置 三.QT界面设计 ...

  6. 基于人脸识别的课堂签到管理系统【学习一】

    写在前面:需要搭建的环境 (我使用的环境情况如下) pycharm python opencv-python pysqlit3 pyqt5-tools 具体情况如图所示 基于人脸识别的课堂签到管理系统 ...

  7. 基于人脸识别的课堂签到管理系统【学习三】

    实习第三天,上午练习实现ui界面的日期和时间与系统时间保持一致,人脸识别能够把摄像头采集的画面进行人脸识别,能识别人脸,且判断到是谁.之后进行人脸分析识别判断,实现方式有很多种,但是考虑到诸多原因我们 ...

  8. 基于人脸识别的课堂签到管理系统(七)---实现人脸搜索,完善签到功能

    一.人脸搜索 首先还是参考百度的技术文档,可以看到想要进行人脸搜索操作就需要提供图片信息,格式,用户组id三个必需的参数 这些参数在之前就已经获取好了,只需要直接调用即可 # 人脸识别检测,只检测一个 ...

  9. 基于人脸识别的课堂签到管理系统(二)---摄像头显示

    一.前言概述 摄像头显示 创建摄像头操作类:完成摄像头的采集功能 当需要摄像头完成一个功能时,就调用摄像头对象的一个函数去完成 实现一个摄像头类: 添加 打开摄像头 获取摄像头的实时数据 数据进行转换 ...

最新文章

  1. 加速100倍,性能媲美SOTA!浙大提出无数据知识蒸馏新方法FastDFKD
  2. Ninject(二)——Modules和Kernel
  3. 一套代码小程序WebNative运行的探索02
  4. CSP认证202012-2 期末预测之最佳阈值[C++题解]:遍历、前缀和
  5. 基于享元记忆的 Boost.Flyweight 示例
  6. 新生儿信息管理系统升级说明
  7. oracle更改文件,Oracle修改数据文件名以及移动数据文件
  8. Qualcomm QXDM工具简介和log抓取
  9. 多路查找树之2-3树的插入原理
  10. 95-10-200-启动-结尾
  11. 统计学习基础(ESL)中文版
  12. 计算机毕业论文乐谱播放器,单片机音乐播放器毕业论文
  13. 浅学transcad(交通小区的划分)
  14. X509证书结构及解析
  15. [Ansible专栏]Ansible条件判断的介绍和使用
  16. CSDN蓝桥杯算法题——题解Java版本——切面条
  17. English trip 自习内容 英语时态
  18. App渗透中常见的加密与解密。
  19. 华为eNSP搭建的综合实验
  20. 裁员之外,京东还在偷偷做这件事

热门文章

  1. css 清空ios端_H5移动端开发常见的问题处理
  2. 你为什么选择计算机这个专业英语,怎样选择计算机专业,英文作文:为什么选择计算机作为你的专业...
  3. layui如何获取父节点的父节点_区块链如何运用merkle tree验证交易真实性
  4. 【编程题】判断一个整数对应的二进制数是否是回文
  5. FunTester框架Redis性能测试之list操作
  6. 一文教你分清持续集成,持续交付,持续部署!
  7. python selenium 下拉框 页面变化_python-selenium之select下拉框
  8. go 遍历二维数组json_for-range造就循环永动机?快来看看go中for-range的那些事!
  9. Jacobian矩阵、Hessian矩阵
  10. 在线学编程python_我跟爸爸学编程:从Python到C++