文章目录
一、解决画面卡顿问题
画面还存在卡顿的原因:信号是由窗体产生的,然而该信号直接关联线程中的网络请求检测函数,相当于还是直接由窗体调用,所以导致卡顿
解决办法:在线程中定义一个读取画面数据的函数,将其设为槽函数,由此窗口的信号与线程的槽函数关联只进行数据传递,而不直接进行网络请求,网络请求有线程中的 run 函数进行
二、核心代码
-
在线程类(detectThread) 中新建一个函数 get_base64,用于接收读取的画面数据
def get_base64(self, base64_image): # 当窗口产生信号,调用该槽函数,将传递数据存放在线程变量中 self.base64_img = base64_image self.condition = True
-
重写线程类(detectThread) 中的 run函数,循环侦听是否发送网络请求
def run(self): while self.flag: if self.condition: self.detect_data(self.base64_img) self.condition = False
-
总结四中还提到最后的返回结果错误的问题,主要是传递的画面数据类型错误的问题,传递的数据类型应为 bytes,而不是字符串类型,重新定义信号与槽
detect_data_signal = pyqtSignal(bytes)
产生的信号,传递的数据也应是 bytes 类型
self.detect_data_signal.emit(bytes(base64_image))
-
关闭签到时(on_actionclose),应将用于开启签到(on_actionopen)的定时器关闭,不然程序将会崩溃退出
def on_actionclose(self): # 关闭摄像头 self.camera_data.camera_close() # 关闭定时器 self.timeshow.stop() self.detection_time.stop() # 断开连接 self.timeshow.timeout.disconnect(self.show_camera) self.detection_time.timeout.disconnect(self.get_cameradata) self.detect_thread.transmit_data.disconnect(self.get_detectdata) self.detect_data_signal.disconnect(self.detect_thread.get_base64) # 关闭线程 self.detect_thread.flag = False self.detect_thread.quit() self.detect_thread.wait()
提示:断开连接可以省略,因为定时器被关闭了,将不会再产生信息关联槽函数;然而再次点击"启动签到"时,就会重新定义一个新的定时器对象,新的定时器对象再重新关联槽函数,以前的定时器将会被 python自动回收。
-
效果如下:
三、创建一个人脸库
-
在人脸识别-应用列表中可以查看自己的人脸库
-
实现代码
def add_group(self): # 创建输入对话框 group, ret = QInputDialog.getText(self, "添加用户组", "输入id(由数字、字母、下划线组成)") request_url = "https://aip.baidubce.com/rest/2.0/face/v3/faceset/group/add" params = { "group_id": group } access_token = self.access_token request_url = request_url + "?access_token=" + access_token headers = { 'content-type': 'application/json'} response = requests.post(request_url, data=params, headers=headers) if response: message = response.json() if message['error_code'] == 0: QMessageBox.information(self, "addgroup", "添加成功!") else: QMessageBox.warning(self, "addgroup", "添加失败!")
技术文档:创建用户组
-
效果如下:
总结六传送门: 人脸课堂签到管理系统(总结六) 实现添加和删除用户