Pyqt5+Opencv实现摄像头图像的实时读取并显示

文章目录

  • 前言
  • 本文主要讲解如何使用Pyqt5+opencv实现摄像头图像的读取,并且将其在Label上进行实时显示。
  • 一、Qt中的Timer
  • 二、使用步骤
  • 1.使用Qt-designer设计界面
  • 2.功能代码的设计
  • 3.功能代码总体结构
  • 总结

  • 前言

    本文主要讲解如何使用Pyqt5+opencv实现摄像头图像的读取,并且将其在Label上进行实时显示。

    一、Qt中的Timer

    QTimer在界面中不可见,在UI设计器中也找不到它,只能通过纯代码实现,主要作用是定时特定的时间。

    想要掌握QTimer只需掌握setInterval(设置定时时间,单位ms)、start(启动定时器),和定时时间到时所发出的信号timeout()即可。程序设计的思路:

    1.先设定定时周期

    2.绑定timeout()信号到自定义槽函数

    3.调用start函数启动定时器

    二、使用步骤

    1.使用Qt-designer设计界面

    先使用qt-designer设计一个只有一个label和button的界面。


    可以在终端切换到该ui文件的目录下输入以下命令:

    pyuic5 -o ui_test.py test.ui
    

    即可将界面ui文件转换成对应的py文件

    2.功能代码的设计

    2.1 自定义变量

    #定时器
    self.timer = QtCore.QTimer()
    #摄像头
    self.cap_video=0
    #记录定时器工作状态
    self.flag = 0
    #存放每一帧读取的图像
    self.img = []
    

    2.2 label上显示图像函数

    def show_cv_img(self, img):
        shrink = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        QtImg = QtGui.QImage(shrink.data,
                             shrink.shape[1],
                             shrink.shape[0],
                             shrink.shape[1] * 3,
                             QtGui.QImage.Format_RGB888)
        jpg_out = QtGui.QPixmap(QtImg).scaled(
            self.label.width(), self.label.height())
    
        self.label.setPixmap(jpg_out)
    

    2.3 信号与槽的建立

    #将定时器(Timer)和显示视频函数进行信号与槽的连接
    self.timer.timeout.connect(self.show_viedo)
    
    def show_viedo(self):
        ret, self.img = self.cap_video.read()
        if ret:
            self.show_cv_img(self.img)
    

    2.4编写定时器的启动函数并且与pushbutton建立信号与槽

    self.pushButton.clicked.connect(self.video_button)
    def video_button(self):
        if (self.flag == 0):
            self.cap_video = cv2.VideoCapture(0)
            self.timer.start(50);
            self.flag+=1
            self.pushButton.setText("Close")
        else:
            self.timer.stop()
            self.cap_video.release()
            self.label.clear()
            self.pushButton.setText("Open")
            self.flag=0
    

    3.功能代码总体结构

    import ui_test
    from PyQt5.QtWidgets import *
    import cv2
    from PyQt5 import QtCore, QtGui, QtWidgets
    
    class test_ui(QMainWindow, ui_test.Ui_MainWindow):
        def __init__(self):
            super().__init__()
            self.setupUi(self)
            self.timer = QtCore.QTimer()
            self.timer.timeout.connect(self.show_viedo)
            self.pushButton.clicked.connect(self.video_button)
            self.cap_video=0
            self.flag = 0
            self.img = []
    
        def video_button(self):
            if (self.flag == 0):
                self.cap_video = cv2.VideoCapture(0)
                self.timer.start(50);
                self.flag+=1
                self.pushButton.setText("Close")
            else:
                self.timer.stop()
                self.cap_video.release()
                self.label.clear()
                self.pushButton.setText("Open")
                self.flag=0
        def show_viedo(self):
            ret, self.img = self.cap_video.read()
            if ret:
                self.show_cv_img(self.img)
        def show_cv_img(self, img):
            shrink = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
            QtImg = QtGui.QImage(shrink.data,
                                 shrink.shape[1],
                                 shrink.shape[0],
                                 shrink.shape[1] * 3,
                                 QtGui.QImage.Format_RGB888)
            jpg_out = QtGui.QPixmap(QtImg).scaled(
                self.label.width(), self.label.height())
    
            self.label.setPixmap(jpg_out)
    if __name__ == "__main__":
    
        app = QApplication(sys.argv)
        win = test_ui()
        win.show()
        sys.exit(app.exec_())
    

    运行该代码便可以直接看见我们的界面如下:
    然后,点击video便可以等待打开摄像头显示动态图像了!
    然后点击close便可以关闭摄像头显示,后续继续点击open任然可以继续读取摄像头。


    总结

    以上就是pyqt5+opencv读取摄像头的全部方法了,实现了在label上进行摄像头读取图像的实时显示。新手不易,希望大家多多支持,有问题评论交流一起进步。

    参考链接
    c++版qt+opencv实现摄像头图像读取并显示
    Timer用法

    来源:Yibaomeimei

    物联沃分享整理
    物联沃-IOTWORD物联网 » Pyqt5+Opencv实现摄像头图像的实时读取并显示

    发表评论