人脸课堂签到管理系统(总结五) 解决画面卡顿问题

一、解决画面卡顿问题

总结四:人脸课堂签到管理系统(总结四) 实时传输数据

画面还存在卡顿的原因:信号是由窗体产生的,然而该信号直接关联线程中的网络请求检测函数,相当于还是直接由窗体调用,所以导致卡顿

解决办法:在线程中定义一个读取画面数据的函数,将其设为槽函数,由此窗口的信号与线程的槽函数关联只进行数据传递,而不直接进行网络请求,网络请求有线程中的 run 函数进行

二、核心代码

  1. 在线程类(detectThread) 中新建一个函数 get_base64,用于接收读取的画面数据

        def get_base64(self, base64_image):
            # 当窗口产生信号,调用该槽函数,将传递数据存放在线程变量中
            self.base64_img = base64_image
            self.condition = True
    
  2. 重写线程类(detectThread) 中的 run函数,循环侦听是否发送网络请求

        def run(self):
            while self.flag:
                if self.condition:
                    self.detect_data(self.base64_img)
                    self.condition = False
    
  3. 总结四中还提到最后的返回结果错误的问题,主要是传递的画面数据类型错误的问题,传递的数据类型应为 bytes,而不是字符串类型,重新定义信号与槽

    detect_data_signal = pyqtSignal(bytes)
    

    产生的信号,传递的数据也应是 bytes 类型

    self.detect_data_signal.emit(bytes(base64_image))

  4. 关闭签到时(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自动回收。

  5. 效果如下:

三、创建一个人脸库

  1. 在人脸识别-应用列表中可以查看自己的人脸库

  2. 实现代码

        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", "添加失败!")
    

    技术文档:创建用户组

  3. 效果如下:

总结六传送门: 人脸课堂签到管理系统(总结六) 实现添加和删除用户

猜你喜欢

转载自blog.csdn.net/xwmrqqq/article/details/109249866