Python-OpenCV图像实现图形化界面的视频播放!

 

一、引言

在Python-OpenCV中显示图像时调用的是一个单独的窗口,有时我们需要将这些图像显示在PyQt的图形化界面上,这样就可以将整个图像显示与PyQt图形化界面进行整合。但OpenCV格式的图像和PyQt格式的图像并不同,这就需要进行转换。

 

二、背景知识

  1. Python-OpenCV的图像是BGR格式的,而PyQt图像格式是RGB格式的,二者需要转换;

  2. 为了快速转换,图像必须基于内存进行操作;

  3. PyQt的QImage类可以从内存数组构建;

  4. OpenCV可以读取视频图像,使用waitKey可以实现休眠特定时长而不影响系统消息处理。

关于PyQt和OpenCV之间的图像转换请参考《Python-OpenCV中图像颜色空间转换》。

 

三、案例

下面的案例读取一个视频文件的图像进行显示,如果再叠加一个音频播放的功能,就实现了一个视频播放器。

 

3.1、设计图形化界面

 

 

该图形界面非常简单,包含了一个仅有“ShowImg”的菜单和对应工具栏,一个名为ImgDisp的标签对象用于显示图像(蓝色标记部分)。使用PyUIC生成的界面对象代码如下:

 
 

from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(625, 430) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.ImgDisp = QtWidgets.QLabel(self.centralwidget) self.ImgDisp.setGeometry(QtCore.QRect(0, 0, 54, 12)) self.ImgDisp.setObjectName("ImgDisp") MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 625, 17)) self.menubar.setObjectName("menubar") self.menushowImg = QtWidgets.QMenu(self.menubar) self.menushowImg.setObjectName("menushowImg") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.toolBar = QtWidgets.QToolBar(MainWindow) self.toolBar.setObjectName("toolBar") MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar) self.actionshowImg = QtWidgets.QAction(MainWindow) self.actionshowImg.setObjectName("actionshowImg") self.menushowImg.addAction(self.actionshowImg) self.menubar.addAction(self.menushowImg.menuAction()) self.toolBar.addAction(self.actionshowImg) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) self.ImgDisp.setText(_translate("MainWindow", ".")) self.menushowImg.setTitle(_translate("MainWindow", "menu")) self.toolBar.setWindowTitle(_translate("MainWindow", "toolBar")) self.actionshowImg.setText(_translate("MainWindow", "showImg"))

 

3.2、主程序

 
 

import cv2,sys from PyQt5 import QtGui,QtWidgets,QtCore import mainWin def cvImgtoQtImg(cvImg): #定义opencv图像转PyQt图像的函数 QtImgBuf = cv2.cvtColor(cvImg, cv2.COLOR_BGR2BGRA) QtImg = QtGui.QImage(QtImgBuf.data, QtImgBuf.shape[1], QtImgBuf.shape[0], QtGui.QImage.Format_RGB32) return QtImg class mainwin(QtWidgets.QMainWindow,mainWin.Ui_MainWindow): def __init__(self): super().__init__() self.setupUi(self) self.bClose = False self.actionshowImg.triggered.connect(self.playVideoFile) #建立菜单点击的信号与方法playVideoFile连接 def playVideoFile(self): #播放影片 cap = cv2.VideoCapture(r'f:\video\mydream.mp4') #打开影片 fps = 24 if not cap.isOpened(): print("Cannot open Video File") exit() while not self.bClose: ret, frame = cap.read() #逐帧读取影片 if not ret: if frame is None: print("The video has end.") else: print("Read video error!") break QtImg = cvImgtoQtImg(frame) #将帧数据转换为PyQt图像格式 self.ImgDisp.setPixmap(QtGui.QPixmap.fromImage(QtImg)) #在ImgDisp显示图像 size = QtImg.size() self.ImgDisp.resize(size)#根据帧大小调整标签大小 self.ImgDisp.show() #刷新界面 cv2.waitKey(int(1000/fps)) #休眠一会,确保每秒播放fps帧 # 完成所有操作后,释放捕获器 cap.release() if __name__=='__main__': app = QtWidgets.QApplication(sys.argv) w = mainwin() w.show() sys.exit(app.exec_())

 

注意:

本文的实现方法存在不足,相关完善方案请见《OpenCV-Python图像转换为PyQt图像的变形及花屏问题研究》。

 

3.3、运行程序

 

初始界面

 

 

点击showImg,开始播放视频:

 

 

你学会了吗。如需源码获取点击:源码

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值