美文网首页
PyQt -- QLabel显示视频文件

PyQt -- QLabel显示视频文件

作者: 有事没事扯扯淡 | 来源:发表于2018-12-04 15:24 被阅读0次

    PyQt安装可以按照官网http://www.pyinstaller.org/downloads.html

    python2: sudo apt-get install python-pyqt5
    python3: sudo apt-get install python3-pyqt5

    可以先用Designer设计.ui界面后,再利用pyqt进行调用(也可以自己用代码写,不过我比较懒,还是直接拖图标方便~~)


    假如设计了这样一个界面,左边显示原图,右边显示灰度图,按钮START开始载入视频文件,按钮STOP停止播放(凑合看吧,就是丑了点~~~)

    PyQt调用.ui文件有两种方法:

    1. uic处理ui文件

    在安装的PyQt5中有uic工具,在%PythonRoot%Python35/Scripts/pyuic5.exe。

    在命令行中输入如下命令

    pyuic5.exe -o ui_test.py test.ui
    

    处理完成后会在同目录下生成ui_test.py。这个文件和vs + QT 开发里面的头文件ui_xxx.h是一致的,只不过是Python版的。

    使用时,先调用库文件

    from ui_test import Ui_test
    

    初始化的时候,

    ui = Ui_test()
    

    即可正常使用,即使删除ui文件也不影响程序。每次修改ui都需要重新uic。是不是很烦?所以有了下面这种方法!

    2. 直接调用PyQt5.uic

    调用库文件

    from PyQt5.uic import loadUi
    

    初始化的时候只要一句话!!!

    loadUi('test.ui', self)   #定义了一个类,所以有 self
    

    大功告成,直接使用就行!是不是很简单?

    QLabel播放视频文件

    使用QLabel播放视频文件的重点就在定时器QTimer!!!

    当程序中需要显示时间时或者需要在程序中周期性地进行某项操作,就会用到定时器

    导入QTimer模块

    from PyQt5.QtCore import QTimer
    

    初始化

    self.timer_camera = QTimer()
    

    计时并启动

    self.timer_camera.start(1000)   # 1000ms == 1s
    self.timer_camera.timeout.connect(self.openFrame)  # 连接槽函数openFrame
    

    完整代码:

    class GUI(QDialog):
        """ Main GUI with two windows
        
        One window shows the original image, and the other shows the gray image.
        """
    
        def __init__(self, parent = None):
            super(GUI, self).__init__(parent)
            loadUi('test.ui', self)
            self.timer_camera = QTimer()     #定义定时器
            video = 'xxx/xxx/xxx/xx.avi'     #加载视频文件
            self.cap = cv2.VideoCapture(video)
            self.pushButton_start.clicked.connect(self.slotStart)      # 按钮关联槽函数
            self.pushButton_stop.clicked.connect(self.slotStop)
            
    
        def slotStart(self):
            """ Slot function to start the progamme
            """
    
            self.timer_camera.start(100)  
            self.timer_camera.timeout.connect(self.openFrame)
    
        def slotStop(self):
            """ Slot function to stop the programme
            """
    
            self.cap.release()
            self.timer_camera.stop()   # 停止计时器
    
        def openFrame(self):     
            """ Slot function to capture frame and process it
            """
    
            ret,frame = self.cap.read()
            if(self.cap.isOpened()):
                ret, frame = self.cap.read()
                if ret:
                    gray= cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
                    gray= cv2.cvtColor(gray, cv2.COLOR_BGR2RGB)
    
                    frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
                    height, width, bytesPerComponent = frame.shape
                    bytesPerLine = bytesPerComponent * width
                    q_image = QImage(frame.data,  width, height, bytesPerLine, 
                                     QImage.Format_RGB888).scaled(self.label_frame.width(), self.label_frame.height())
                    self.label_frame.setPixmap(QPixmap.fromImage(q_image)) 
    
                    q_image2 = QImage(gray.data,  width, height, width, 
                                      QImage.Format_RGB888).scaled(self.label_frame_process.width(), self.label_frame_process.height())
                    self.label_frame_process.setPixmap(QPixmap.fromImage(q_image2))
                else:
                    self.cap.release()
                    self.timer_camera.stop()   # 停止计时器
    

    相关文章

      网友评论

          本文标题:PyQt -- QLabel显示视频文件

          本文链接:https://www.haomeiwen.com/subject/vvfmcqtx.html