Python | 人脸识别系统 — 摄像头画面展示

博客汇总:Python | 人脸识别系统 — 博客索引

GitHub地址:Su-Face-Recognition

注:阅读本博客前请先参考

工具安装、环境配置:Python | 人脸识别系统 — 简介

UI界面设计:Python | 人脸识别系统 — UI界面设计

UI事件处理:Python | 人脸识别系统 — UI事件处理

一、预期功能

        点击打开摄像头按钮,将电脑前置摄像头打开,并将画面传回到用户端系统界面的文本域 camera_label 中。

二、代码实现

        1、初始化

        首先,定义摄像头对象self.cap,通过opencv的方法进行创建。同时定义摄像机的捕获源参数self.source,这个主要用在打开摄像头的方法 self.cap.open(self.source) 中,一般为0.

         self.show_image 属性是设置当前的展示到界面的画面,还会用于后面的人脸识别、活体检测等操作中。

    def __init__(self, parent=None):
        super(UserMainWindow, self).__init__(parent)
        self.setupUi(self)

        self.cap = cv2.VideoCapture()  # 相机
        self.source = 0  # 相机捕获源
        self.WIN_WIDTH = 800  # 相机展示画面宽度
        self.WIN_HEIGHT = 500  # 相机展示画面高度

        self.show_image = None

          然后,绑定按钮触发事件 self.open_camera:

        self.camera_button.clicked.connect(self.open_camera)

        2、判断器

        在 self.open_camera 方法中,我们通过 self.cap.isOpened() 方法判断当前摄像头是否打开。如果没有,则进行打开操作。否则关闭摄像头。

    # 打开摄像头判断器
    def open_camera(self):
        if not self.cap.isOpened():
            self.cap.open(self.source)
            try:
                # 将摄像头的画面传回至用户界面
                self.show_camera()
            except:
                # 弹出提示框
                QMessageBox.about(self, '警告', '相机不能正常被打开')
        else:  # 关闭摄像头,释放cap
            self.cap.release()
            self.camera_button.setText(u'打开相机')
            self.camera_label.setPixmap(QPixmap(""))
            self.camera_label.setText('\n\n人脸识别\n\n系统')

        3、展示到界面

        设置一个while循环,通过 self.cap.read() 方法逐帧读取当前摄像头的画面。注意读取的画面还需要通过opencv进行处理,然后再通过 self.camera_label.setPixmap 的方法设置到文本域中。

    # 展示摄像头画面
    def show_camera(self):
        self.camera_button.setText(u'关闭相机')
        while self.cap.isOpened():
            # 获取当前摄像头画面帧 frame
            ret, frame = self.cap.read()
            QApplication.processEvents()
            # 裁剪帧为展示画面大小
            show = cv2.resize(frame, (self.WIN_WIDTH, self.WIN_HEIGHT))
            # 将图片进行BGR到RGB的色彩空间转换
            show = cv2.cvtColor(show, cv2.COLOR_BGR2RGB)
            # 设置对象属性show_image
            self.show_image = QImage(show.data, show.shape[1], show.shape[0], QImage.Format_RGB888)
            # 设置展示画面
            self.camera_label.setPixmap(QPixmap.fromImage(self.show_image))
        # 退出while循环,说明摄像头已经关闭,故将文本域置空
        self.camera_label.setPixmap(QPixmap(""))

        代码中 QApplication.processEvents() 方法的作用是使界面流畅不卡顿。对于执行耗时程序或函数时,QT需要等待程序执行完毕才能进行下一步,这个过程对于界面来说就是卡顿。当我们需要在执行这个耗时程序或函数时不断的刷新界面就可以使用QApplication.processEvents()函数,一边执行程序一边刷新界面,就会给人一种很流畅的感觉。

继续阅读:

用户端逻辑:

管理员端逻辑:

注:以上代码仅供参考,如需运行,参考GitHub源代码:Su-Face-Recognition

猜你喜欢

转载自blog.csdn.net/sun80760/article/details/130492554