[PYTHON] Exemple de programme pour afficher des vidéos avec PyQt

J'ai créé une interface graphique pour afficher des vidéos avec Python

J'ai trouvé le code du programme que j'ai créé il y a longtemps en utilisant PyQt5 et OpenCV pour Python, donc je le posterai sous forme de mémorandum.


"""
@author : koharite

une fonction:
Affichez le fichier vidéo.
Si les informations de trame de réponse correctes sont spécifiées, elles seront affichées en superposition sur la trame.
"""

import sys
import cv2

from PyQt5.QtWidgets import (QMainWindow, QApplication, QWidget, QHBoxLayout, QLabel, QPushButton, QAction, QStyle, QFileDialog)
from PyQt5.QtGui import(QIcon, QImage, QPixmap, QPainter, QColor)
from PyQt5.QtCore import (pyqtSlot, QTimer, Qt)


#Configuration de la fenêtre principale
class MainWindow(QMainWindow):

    #Définir la valeur initiale de la fenêtre principale
    def __init__(self):
        #État de la fenêtre
        super().__init__()
        self.title = 'Movie Viewer for PDET'
        self.left = 10
        self.top = 10
        self.width = 1280
        self.height = 960

        #Statut de la vidéo
        self.framePos = 0
        #self.image = QImage()
        self.image = None
        self.moviePlayFlg = False
        self.imgWidth = 0
        self.imgHeight = 0
        self.frameRate = 0

        self.initUI()

    #Résumer le processus d'initialisation
    def initUI(self):
        #Définir le titre de la fenêtre principale
        self.setWindowTitle(self.title)
        #Position initiale de la fenêtre principale
        self.setGeometry(self.left, self.top, self.width, self.height)
        hbox = QHBoxLayout(self)

        #Définir le menu de la fenêtre principale
        mainMenu = self.menuBar()
        fileMenu = mainMenu.addMenu('File')
        editMenu = mainMenu.addMenu('Edit')
        optionMenu = mainMenu.addMenu('Option')
        helpMenu = mainMenu.addMenu('Help')

        #Réglez le menu pour ouvrir le fichier
        fileOpenButton = QAction(self.style().standardIcon(getattr(QStyle, 'SP_FileDialogStart')), 'File Open', self)
        fileOpenButton.setShortcut('Ctrl+O')
        fileOpenButton.triggered.connect(self.openFileDialog)
        fileMenu.addAction(fileOpenButton)

        #Définir le menu de sortie de l'application
        exitButton = QAction(self.style().standardIcon(getattr(QStyle, 'SP_DialogCloseButton')), 'Exit', self)
        exitButton.setShortcut('Ctrl+Q')
        exitButton.setStatusTip('Exit application')
        exitButton.triggered.connect(self.close)
        fileMenu.addAction(exitButton)

        #Placer des pièces dans la fenêtre principale
        #Définir la zone de dessin de l'image
        #self.showFrameLabel = QLabel(self)
        #self.painter = QPainter()
        #self.showFramePixmap = QPixmap()
        #self.painter.drawPixmap(0,0, self.imgWidth, self.imgHeight, self.showFramePixmap)
        #self.showFrameLabel.setPixmap(self.showFramePixmap)
        #self.resize(self.showFramePixmap.width(), self.showFramePixmap.height())

        #hbox.addWidget(self.showFrameLabel)
        self.setLayout(hbox)

        #Réglez le bouton de lecture vidéo
        moviePlayBtn = QPushButton(self.style().standardIcon(getattr(QStyle, 'SP_MediaPlay')), 'Play', self)
        moviePlayBtn.move(20, self.height-50)
        moviePlayBtn.clicked.connect(self.moviePlay)

        #Réglez le bouton d'arrêt vidéo
        movieStopBtn = QPushButton(self.style().standardIcon(getattr(QStyle, 'SP_MediaStop')), 'Stop', self)
        movieStopBtn.move(120, self.height-50)
        movieStopBtn.clicked.connect(self.movieStop)

        #Minuterie de mise à jour de dessin
        #self.updateTimer = QTimer(self)
        #self.updateTimer.timeout.connect(self.showNextFrame)
        ##self.updateTimer.start(self)

        #Affichage de la fenêtre principale
        self.show()

    def openFileDialog(self):
        options = QFileDialog.Options()
        #options |= QFileDialog.DontUseNativeDialog
        inputFileName, _ = QFileDialog.getOpenFileName(self, 'Open File', '', 'Movie files(*.avi *.wmv)', options=options)
        #Afficher le nom du fichier dans la barre d'état pour le débogage
        #self.statusBar().showMessage(inputFileName[0])
        self.statusBar().showMessage(inputFileName)
        print(inputFileName)

        #Charger la vidéo avec OpenCV
        self.video = cv2.VideoCapture(inputFileName)
        #déboguer
        print('OpenCV movie read success.')
        #Obtenez le nombre d'images
        self.frameNum = self.video.get(cv2.CAP_PROP_FRAME_COUNT)
        #déboguer
        print('movie frameNum: ', str(self.frameNum))
        #Obtenir la fréquence d'images
        self.frameRate = self.video.get(cv2.CAP_PROP_FPS)
        #déboguer
        print('movie frameRate: ', str(self.frameRate))

        #Afficher la première image
        self.framePos = 0
        self.video.set(cv2.CAP_PROP_POS_FRAMES, self.framePos)
        ret, frame = self.video.read()
        #déboguer
        print('openCV current frame read')
        #Convertir l'image de lecture du format OpenCV en PyQt QImage
        self.image = self.openCV2Qimage(frame)
        #déboguer
        print('convert openCV to QImage')
        self.imgWidth = self.image.width()
        self.imgHeith = self.image.height()
        #afficher
        #déboguer
        print('movie properties read success')
        #self.painter.drawPixmap(0, 0, self.imgWidth, self.imgHeight, self.image)

    def moviePlay(self):
        self.moviePlayFlg = True
        self.updateTimer.start((1/self.frameRate) * 1000)

    def movieStop(self):
        self.moviePlayFlg = False
        self.updateTimer.stop()

    def showNextFrame(self):
        if self.moviePlayFlg == False:
            return

        self.framePos += 1
        #Réglez la position du cadre de lecture de la vidéo avec OpenCV
        self.video.set(cv2.CAP_PROP_POS_FRAMES, self.framePos)
        ret, frame = self.video.read()
        #Convertir l'image de lecture du format OpenCV en PyQt QImage
        self.image = self.openCV2Qimage(frame)
        #self.imgWidth = self.image.width()
        #self.imgHeith  self.image.height()

    def paintEvent(self, event):
        #Pour le débogage
        print('paintEvent Start')
        painter = QPainter()
        painter.begin(self)
        painter.setPen(QColor('#FFFFFF'))
        painter.setBrush(Qt.white)
        painter.drawRect(event.rect())
        #Pour le débogage
        print('painter tool set')

        if self.image == None:
            return

        #image = QtGui.QImage('./sample01.jpg')
        #x = (self.width() - self.image.width()) / 2
        #y = (self.height() - self.image.height()) / 2

        #painter.drawImage(x, y, image)
        painter.drawPixmap(0, 0, self.ImgWidth, self.imgHeight, self.image)
        painter.end()



    def openCV2Qimage(self, cvImage):
        height, width, channel = cvImage.shape
        bytesPerLine = channel * width
        cvImageRGB = cv2.cvtColor(cvImage, cv2.COLOR_BGR2RGB)
        image = QImage(cvImageRGB, width, height, bytesPerLine, QImage.Format_RGB888)
        #image = QImage(cvImage, width, height, bytesPerLine, QImage.Format_RGB888)
        #image = image.rgbSwapped()

        return image



#Exécutez l'application
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MainWindow()
    sys.exit(app.exec_())


Recommended Posts

Exemple de programme pour afficher des vidéos avec PyQt
Programme Shell pour afficher quatre-vingt-dix-neuf
[PyQt] Afficher des graphiques multi-axes avec QtChart
Comment afficher le japonais python avec lolipop
Comment utiliser la commande CUT (avec exemple)
Exemple de conversion en ondelettes d'images en Python
Comment créer des exemples de données CSV avec hypothèse
Je souhaite afficher plusieurs images avec matplotlib.
Introduction à PyQt
Exemple de notification Slack avec python lambda
Comment afficher des images en continu avec matplotlib Memo
AWS Step Functions pour apprendre avec un exemple
Exemple de programme qui génère un syslog avec la journalisation Python
Développement basé sur les schémas avec Responder: essayez d'afficher l'interface utilisateur Swagger
Il est trop difficile d'afficher le japonais avec le python3 de Vim.
De l'achat d'un ordinateur à l'exécution d'un programme sur python
Comment boucler et lire une vidéo gif avec openCV
Un échantillon pour essayer rapidement les machines de factorisation avec fastFM
Résumé du site pour apprendre l'apprentissage automatique avec une vidéo en anglais
Afficher et prendre des images de caméra Web avec Python Kivy [GUI]
Description à afficher avec Python> fonction> Docstrings> help () / .__ doc__
Afficher l'image de la caméra USB avec OpenCV de Python avec Raspeye
Convertir 202003 en 2020-03 avec les pandas
Programme pour affaiblir le japonais
Affichage de la barre des tâches avec tqdm
Un exemple de python pour apprendre XOR avec un algorithme génétique sur un réseau neuronal
Essayez d'afficher diverses informations utiles pour le débogage avec python
Ajoutez un faux effet d'inclinaison aux vidéos avec OpenCV + Python
fonction map - grammaire Python de base apprise avec un exemple de programme intéressant
[Ev3dev] Comment afficher une image bmp sur un écran LCD avec python
Essayez d'ouvrir une sous-fenêtre avec PyQt5 et Python
Comment afficher une liste des versions installables avec pyenv
Convertir une vidéo en noir et blanc avec ffmpeg + python + opencv
Envoyer des notifications push aux applications iOS avec Python2 (avec un exemple de code)