python 视频播放界面_PyQt转换显示Python-OpenCV图像实现图形化界面的视频播放
一、引言
在Python-OpenCV中显示图像时调用的是一个单独的窗口,有时我们需要将这些图像显示在PyQt的图形化界面上,这样就可以将整个图像显示与PyQt图形化界面进行整合。但OpenCV格式的图像和PyQt格式的图像并不同,这就需要进行转换。
二、背景知识
Python-OpenCV的图像是BGR格式的,而PyQt图像格式是RGB格式的,二者需要转换;
为了快速转换,图像必须基于内存进行操作;
PyQt的QImage类可以从内存数组构建;
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_())
注意:
3.3、运行程序
初始界面
点击showImg,开始播放视频:
关于老猿的付费专栏
老猿的付费专栏《使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,付费专栏《moviepy音视频开发专栏》详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,两个专栏加起来只需要19.9元,都适合有一定Python基础但无相关专利知识的小白读者学习。这2个收费专栏都有对应免费专栏,只是收费专栏的文章介绍更具体、内容更深入、案例更多。
对于缺乏Python基础的同仁,可以通过老猿的免费专栏《专栏:Python基础教程目录》从零开始学习Python。
如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。
跟老猿学Python、学5G!
python 视频播放界面_PyQt转换显示Python-OpenCV图像实现图形化界面的视频播放相关推荐
- 用python模拟多人聊天服务器以及客户端(带图形化界面)
所用python的知识点: 网络编程:socket 多线程:threading 图形化编程:tkinter 首先要模拟出一个服务器,以供客户端连接,注意这里的要用死循环,要让服务区一直处于开放的状态 ...
- python拿什么做可视化界面好-用python打造可视化爬虫监控系统,酷炫的图形化界面...
原标题:用python打造可视化爬虫监控系统,酷炫的图形化界面 本文并不是讲解爬虫的相关技术实现的,而是从实用性的角度,将抓取并存入 MongoDB 的数据 用 InfluxDB 进行处理,而后又通过 ...
- python中turtle画酷炫图案-用python打造可视化爬虫监控系统,酷炫的图形化界面
本文并不是讲解爬虫的相关技术实现的,而是从实用性的角度,将抓取并存入 MongoDB 的数据 用 InfluxDB 进行处理,而后又通过 Grafana 将爬虫抓取数据情况通过酷炫的图形化界面展示出来 ...
- python做炫酷的界面_用python打造可视化爬虫监控系统,酷炫的图形化界面
安装 InfluxDB 修改配置文件/usr/local/etc/influxdb.conf,如果原文件中没有对应配置项,需自己添加. 3. 安装配置 Grafana 安装 Grafana 并修改 G ...
- Python零基础入门(1)——Linux下编程图形化界面的安装
LInux中安装最好使用普通用户,如果你使用root超级用户安装的话,可能会出现一些小问题.比如:在程序中写注释时无法时用中文等等 1.软件安装包的准备--pycharm-community-2018 ...
- linux 图形界面无法弹出,xmanager无法弹出图形化界面。
虚拟机中Linux系统盘空间不足 虚拟机中Linux系统盘在使用过程中, 出现空间不足的提示. 使用命令du --max-depth=1 -h 查看Home目录下各个文件占用空间, 发现是./cach ...
- ubuntu系统 安装 图形化界面【亲测有效】
目录 一:引言 二:ubuntu 图形化界面 安装配置 1.更新一下 2.安装ubuntu桌面图形化显示 3.安装unity桌面系统 4.安装lightdm显示管理器 5.选择 lightdm或者gd ...
- Python中Tkinter 图形化界面设计(详细教程)
Python-Tkinter 图形化界面设计(详细教程) 一.图形化界面设计的基本理解 二. 窗体控件布局 2.1 根窗体呈现示例 2.2 tkinter 常用控件 2.2.1常用控件 2.2.2 控 ...
- VMVare中CentOS图形化界面大屏显示的方法(调节屏幕分辨率)
1.问题阐述 在虚拟机中安装CentOS系统,进入图形化界面后发现显示的界面很小,看起来很不方便,因此下面通过调节屏幕的分辨率来将图形化界面大屏显示. 2.操作步骤 通常来说,CentOS系统内的操作 ...
最新文章
- 分享一下cookies操作(增、删、改、查)小经验
- 搭建基础架构-ResultMsg
- 51 nod 1522 上下序列——序列dp
- CSS基础语法(三) CSS的6种特性
- 404. Sum of Left Leaves
- 1.KafKa-介绍
- 【Java】Int类型逻辑运算符的详细描述---含代码
- SpringBoot整合MyBatis并实现简单的查询功能
- 优秀的.NET Winform UI控件(标价$399):DotNetMagic Version 3.0 Released
- pd怎么转成mysql_powerdesigner中实现PDM到MYSQl数据库的转换《转》
- Linux目录结构详解
- SEO专题之四:如何合理有效选定关键字
- 重编译 microsip 和 pjsip 支持 mp3 录音
- 近年来,小样本学习取得重大进展了吗?
- android百度导航demo,Android - 百度导航Demo,我们一起来踩坑!
- 负数在计算机中的储存方式
- java verify_JAVA结合testng断言verify(断言失败不中断继续执行)
- Displaytag 使用简介
- 程序养身:初学者如何学瑜伽
- 苹果最新发布iOS 5 全部机型都有 下载吧