一、引言
在-中顯示圖像時調用的是一個單獨的窗口,有時我們需要將這些圖像顯示在pyqt的圖形化界面上,這樣就可以將整個圖像顯示與pyqt圖形化界面進行整合。但格式的圖像和pyqt格式的圖像并不同qq空間視頻播放器代碼,這就需要進行轉換。
二、背景知識-的圖像是bgr格式的qq空間視頻播放器代碼,而pyqt圖像格式是rgb格式的,二者需要轉換;為了快速轉換,圖像必須基于內存進行操作;pyqt的類可以從內存數組構建;可以讀取視頻圖像,使用可以實現休眠特定時長而不影響系統消息處理。
關于pyqt和之間的圖像轉換請參考《-中圖像顏色空間轉換》。
三、案例
下面的案例讀取一個視頻文件的圖像進行顯示,如果再疊加一個音頻播放的功能,就實現了一個視頻播放器。
3.1、設計圖形化界面
該圖形界面非常簡單,包含了一個僅有“”的菜單和對應工具欄,一個名為的標簽對象用于顯示圖像(藍色標記部分)。使用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:videomydream.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_())
注意:
教程分享qt視頻播放器代碼(vs下的qt視頻播放功能)的實現方法存在不足,相關完善方案請見《-圖像轉換為pyqt圖像的變形及花屏問題研究》。
3.3、運行程序初始界面
點擊,開始播放視頻:
關于pyqt的使用請參考付費專欄《使用pyqt開發圖形界面應用》,專欄文件目錄《使用pyqt開發圖形界面應用專欄目錄》。
也可以參考免費專欄《pyqt入門知識》,專欄文件目錄《使用pyqt進行圖形界面程序開發文章目錄》。
需要了解更多教程分享qt視頻播放器代碼(vs下的qt視頻播放功能),都可以關注教程分享欄目—234IT()