文章目录

  • 前言
  • 本文主要讲解如何使用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的界面。

网络摄像头 读YUV OpenCV opencv摄像头读取图像_qt


可以在终端切换到该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_())

运行该代码便可以直接看见我们的界面如下:

网络摄像头 读YUV OpenCV opencv摄像头读取图像_网络摄像头 读YUV OpenCV_02


然后,点击video便可以等待打开摄像头显示动态图像了!

网络摄像头 读YUV OpenCV opencv摄像头读取图像_opencv_03


然后点击close便可以关闭摄像头显示,后续继续点击open任然可以继续读取摄像头。


总结

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