文章目录
- 前言
- 本文主要讲解如何使用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上进行摄像头读取图像的实时显示。新手不易,希望大家多多支持,有问题评论交流一起进步。