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_())