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