文章插圖

文章插圖
一、引言
在Python-OpenCV中顯示圖像時調用的是一個單獨的窗口,有時我們需要將這些圖像顯示在PyQt的圖形化界面上,這樣就可以將整個圖像顯示與PyQt圖形化界面進行整合 。但OpenCV格式的圖像和PyQt格式的圖像并不同,這就需要進行轉換 。
二、背景知識Python-OpenCV的圖像是BGR格式的,而PyQt圖像格式是RGB格式的,二者需要轉換;為了快速轉換,圖像必須基于內存進行操作;PyQt的QImage類可以從內存數組構建;OpenCV可以讀取視頻圖像,使用waitKey可以實現休眠特定時長而不影響系統消息處理 。
關于PyQt和OpenCV之間的圖像轉換請參考《Python-OpenCV中圖像顏色空間轉換》 。
【qt實現視頻播放器源碼 QT 視頻播放器】三、案例
下面的案例讀取一個視頻文件的圖像進行顯示,如果再疊加一個音頻播放的功能,就實現了一個視頻播放器 。
3.1、設計圖形化界面
from PyQt5 import QtCore, QtGui, QtWidgetsclass 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.translateMainWindow.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,sysfrom PyQt5 import QtGui,QtWidgets,QtCoreimport mainWindef 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 QtImgclass mainwin(QtWidgets.QMainWindow,mainWin.Ui_MainWindow):def __init__(self):super().__init__()self.setupUi(self)self.bClose = Falseself.actionshowImg.triggered.connect(self.playVideoFile) #建立菜單點擊的信號與方法playVideoFile連接def playVideoFile(self): #播放影片cap = cv2.VideoCapture(r'f:videomydream.mp4') #打開影片fps = 24if 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!")breakQtImg = 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、運行程序初始界面
也可以參考免費專欄《PyQt入門知識》,專欄文件目錄《使用PyQt進行Python圖形界面程序開發文章目錄》 。
- oppo折疊手機視頻 oppo新款手機上市 折疊屏
- 短視頻不得未經授權剪輯影視劇? 短視頻不得未經授權剪輯影視劇l
- 蘋果手機網頁視頻緩存下載 蘋果手機網頁視頻緩存視頻在哪里
- 怎樣安裝專用視頻播放器 視頻播放器軟件安裝教程
- 十大視頻剪輯軟件排行榜電腦 十大視頻剪輯軟件排行榜 知乎
- ps制圖簡單圖片教程視頻 ps制圖簡單圖片教程517o7Cn
- flash播放器怎么用 flash播放器及瀏覽器
- mp4文件用什么播放器播放 mp4播放器有哪些
- 外星人視頻真實誰拍的 中國拍到真實外星人
- 電腦視頻剪輯app哪個好用 什么電腦軟件可以剪切視頻
