[PYTHON] Beispielprogramm zum Anzeigen von Videos mit PyQt

Ich habe eine GUI erstellt, um Videos mit Python anzuzeigen

Ich habe den Programmcode gefunden, den ich vor langer Zeit mit PyQt5 und OpenCV für Python erstellt habe, daher werde ich ihn als Memorandum veröffentlichen.


"""
@author : koharite

Funktion:
Zeigen Sie die Videodatei an.
Wenn die richtigen Antwortrahmeninformationen angegeben sind, werden sie über dem Rahmen angezeigt.
"""

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)


#Konfiguration des Hauptfensters
class MainWindow(QMainWindow):

    #Stellen Sie den Anfangswert des Hauptfensters ein
    def __init__(self):
        #Fensterstatus
        super().__init__()
        self.title = 'Movie Viewer for PDET'
        self.left = 10
        self.top = 10
        self.width = 1280
        self.height = 960

        #Videostatus
        self.framePos = 0
        #self.image = QImage()
        self.image = None
        self.moviePlayFlg = False
        self.imgWidth = 0
        self.imgHeight = 0
        self.frameRate = 0

        self.initUI()

    #Fassen Sie den Initialisierungsprozess zusammen
    def initUI(self):
        #Legen Sie den Titel des Hauptfensters fest
        self.setWindowTitle(self.title)
        #Ausgangsposition des Hauptfensters
        self.setGeometry(self.left, self.top, self.width, self.height)
        hbox = QHBoxLayout(self)

        #Stellen Sie das Hauptfenstermenü ein
        mainMenu = self.menuBar()
        fileMenu = mainMenu.addMenu('File')
        editMenu = mainMenu.addMenu('Edit')
        optionMenu = mainMenu.addMenu('Option')
        helpMenu = mainMenu.addMenu('Help')

        #Stellen Sie das Menü ein, um die Datei zu öffnen
        fileOpenButton = QAction(self.style().standardIcon(getattr(QStyle, 'SP_FileDialogStart')), 'File Open', self)
        fileOpenButton.setShortcut('Ctrl+O')
        fileOpenButton.triggered.connect(self.openFileDialog)
        fileMenu.addAction(fileOpenButton)

        #Stellen Sie das Exit-Menü der App ein
        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)

        #Teile in das Hauptfenster legen
        #Stellen Sie den Bildzeichnungsbereich ein
        #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)

        #Stellen Sie die Videowiedergabetaste ein
        moviePlayBtn = QPushButton(self.style().standardIcon(getattr(QStyle, 'SP_MediaPlay')), 'Play', self)
        moviePlayBtn.move(20, self.height-50)
        moviePlayBtn.clicked.connect(self.moviePlay)

        #Stellen Sie die Video-Stopp-Taste ein
        movieStopBtn = QPushButton(self.style().standardIcon(getattr(QStyle, 'SP_MediaStop')), 'Stop', self)
        movieStopBtn.move(120, self.height-50)
        movieStopBtn.clicked.connect(self.movieStop)

        #Zeichnungsaktualisierungs-Timer
        #self.updateTimer = QTimer(self)
        #self.updateTimer.timeout.connect(self.showNextFrame)
        ##self.updateTimer.start(self)

        #Anzeige des Hauptfensters
        self.show()

    def openFileDialog(self):
        options = QFileDialog.Options()
        #options |= QFileDialog.DontUseNativeDialog
        inputFileName, _ = QFileDialog.getOpenFileName(self, 'Open File', '', 'Movie files(*.avi *.wmv)', options=options)
        #Dateinamen in der Statusleiste zum Debuggen anzeigen
        #self.statusBar().showMessage(inputFileName[0])
        self.statusBar().showMessage(inputFileName)
        print(inputFileName)

        #Laden Sie das Video mit OpenCV
        self.video = cv2.VideoCapture(inputFileName)
        #debuggen
        print('OpenCV movie read success.')
        #Holen Sie sich die Anzahl der Frames
        self.frameNum = self.video.get(cv2.CAP_PROP_FRAME_COUNT)
        #debuggen
        print('movie frameNum: ', str(self.frameNum))
        #Bildrate abrufen
        self.frameRate = self.video.get(cv2.CAP_PROP_FPS)
        #debuggen
        print('movie frameRate: ', str(self.frameRate))

        #Erstes Bild anzeigen
        self.framePos = 0
        self.video.set(cv2.CAP_PROP_POS_FRAMES, self.framePos)
        ret, frame = self.video.read()
        #debuggen
        print('openCV current frame read')
        #Konvertieren Sie den Wiedergaberahmen vom OpenCV-Format in PyQt QImage
        self.image = self.openCV2Qimage(frame)
        #debuggen
        print('convert openCV to QImage')
        self.imgWidth = self.image.width()
        self.imgHeith = self.image.height()
        #Anzeige
        #debuggen
        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
        #Stellen Sie die Position des Wiedergabebilds des Videos mit OpenCV ein
        self.video.set(cv2.CAP_PROP_POS_FRAMES, self.framePos)
        ret, frame = self.video.read()
        #Konvertieren Sie den Wiedergaberahmen vom OpenCV-Format in PyQt QImage
        self.image = self.openCV2Qimage(frame)
        #self.imgWidth = self.image.width()
        #self.imgHeith  self.image.height()

    def paintEvent(self, event):
        #Zum Debuggen
        print('paintEvent Start')
        painter = QPainter()
        painter.begin(self)
        painter.setPen(QColor('#FFFFFF'))
        painter.setBrush(Qt.white)
        painter.drawRect(event.rect())
        #Zum Debuggen
        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



#Führen Sie die App aus
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MainWindow()
    sys.exit(app.exec_())


Recommended Posts

Beispielprogramm zum Anzeigen von Videos mit PyQt
Shell-Programm zur Anzeige von neunundneunzig
[PyQt] Mehrachsendiagramme mit QtChart anzeigen
So zeigen Sie Python-Japanisch mit Lolipop an
Verwendung des CUT-Befehls (mit Beispiel)
Beispiel für die Wavelet-Konvertierung von Bildern in Python
Erstellen von CSV-Beispieldaten mit Hypothese
Ich möchte mehrere Bilder mit matplotlib anzeigen.
Einführung in PyQt
Beispiel für eine Slack-Benachrichtigung mit Python Lambda
So zeigen Sie Bilder kontinuierlich mit matplotlib Memo an
AWS-Schrittfunktionen zum Lernen anhand eines Beispiels
Beispielprogramm, das Syslog mit Python-Protokollierung ausgibt
Schemagesteuerte Entwicklung mit Responder: Versuchen Sie, die Swagger-Benutzeroberfläche anzuzeigen
Es ist zu mühsam, Japanisch in Vims Python3 anzuzeigen.
Vom Kauf eines Computers bis zur Ausführung eines Programms auf Python
So schleifen und spielen Sie ein GIF-Video mit openCV ab
Ein Beispiel, um Faktorisierungsmaschinen schnell mit fastFM auszuprobieren
Site-Zusammenfassung zum Erlernen des maschinellen Lernens mit englischen Videos
Anzeigen und Aufnehmen von Webkamerabildern mit Python Kivy [GUI]
Erklärender Text, der mit Python> Funktion> Docstrings> help () / .__ doc__ angezeigt werden soll
Zeigen Sie das Bild der USB-Kamera mit OpenCV von Python mit Raspeye an
Konvertieren Sie 202003 bis 2020-03 mit Pandas
Programm zur Schwächung der japanischen Sprache
Taskleistenanzeige mit tqdm
Eine Python-Probe zum Lernen von XOR mit einem genetischen Algorithmus in einem neuronalen Netz
Versuchen Sie, verschiedene Informationen anzuzeigen, die für das Debuggen mit Python nützlich sind
Fügen Sie Videos mit OpenCV + Python einen gefälschten Tilt-Shift-Effekt hinzu
Kartenfunktion - Grundlegende Python-Grammatik, die mit einem interessanten Beispielprogramm gelernt wurde
[Ev3dev] So zeigen Sie ein BMP-Bild mit Python auf dem LCD an
Versuchen Sie, ein Unterfenster mit PyQt5 und Python zu öffnen
So zeigen Sie eine Liste der mit pyenv installierbaren Versionen an
Konvertieren Sie Videos mit ffmpeg + python + opencv in Schwarzweiß
Senden Sie Push-Benachrichtigungen mit Python2 an iOS-Apps (mit Beispielcode).