[PYTHON] Erstellen Sie einen Videoplayer mit PySimpleGUI + OpenCV

Einführung

OpenCV (Open Source Computer Vision Library) ist eine Sammlung von BSD-lizenzierten Open Source Video- / Bildverarbeitungsbibliotheken. Verschiedene Bibliotheken wie verschiedene Filter, Vorlagenabgleich, Objekterkennung und maschinelles Lernen für Bilder und Videos stehen zur Verfügung.

https://opencv.org/

Wir erstellen einen Videoplayer mit PySimpleGUI, damit Sie den ROI, die Maske usw. einstellen können, während Sie das Bild bei der Analyse des Videos überprüfen.

Über diesen Artikel

Zum ersten Mal erstellen wir eine GUI, mit der Sie das Video abspielen / stoppen und den Start- / End-Frame festlegen können. Die Wiedergabegeschwindigkeit des Videos und die Anzahl der Bildsprünge können eingestellt werden. pic1-3.jpg

Anzahl der Framesprünge = 1: test.gif

Anzahl der Framesprünge = 5: test.gif

Datei lesen

Erstellen Sie mit PySimpleGUI eine Datei zum Lesen der Benutzeroberfläche. pic1-1.jpg

Klicken Sie auf Senden, um den Dateiauswahldialog anzuzeigen. pic1-2.jpg

import numpy as np
import PySimpleGUI as sg
import cv2
from pathlib import Path

def file_read():
    '''
Wählen Sie eine Datei aus und laden Sie sie
    '''
    fp = ""
    #GUI-Layout
    layout = [
        [
            sg.FileBrowse(key="file"),
            sg.Text("Datei"),
            sg.InputText()
        ],
        [sg.Submit(key="submit"), sg.Cancel("Exit")]
    ]
    #WINDOW-Generation
    window = sg.Window("Dateiauswahl", layout)

    #Ereignisschleife
    while True:
        event, values = window.read(timeout=100)
        if event == 'Exit' or event == sg.WIN_CLOSED:
            break
        elif event == 'submit':
            if values[0] == "":
                sg.popup("Es wurde keine Datei eingegeben.")
                event = ""
            else:
                fp = values[0]
                break
    window.close()
    return Path(fp)

Video wird geladen

Laden Sie das Video und stellen Sie verschiedene Parameter ein. Wenn es nicht geladen werden kann, wird ein Popup angezeigt und der Vorgang wird beendet.

class Main:
    def __init__(self):
        self.fp = file_read()
        self.cap = cv2.VideoCapture(str(self.fp))

        #Holen Sie sich das erste Bild
        #Überprüfen Sie, ob es erhältlich ist
        self.ret, self.f_frame = self.cap.read()

        if self.ret:

            self.cap.set(cv2.CAP_PROP_POS_FRAMES, 0)
            #Erfassung von Videoinformationen
            self.fps = self.cap.get(cv2.CAP_PROP_FPS)
            self.width = int(self.cap.get(cv2.CAP_PROP_FRAME_WIDTH))
            self.height = int(self.cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
            self.total_count = self.cap.get(cv2.CAP_PROP_FRAME_COUNT)

            #Rahmenbezogen
            self.frame_count = 0
            self.s_frame = 0
            self.e_frame = self.total_count

            #Pause-Flag spielen
            self.stop_flg = False

            cv2.namedWindow("Movie")

        else:
            sg.Popup("Fehler beim Lesen der Datei.")
            return

GUI-Einstellungen und Anzeige

Stellen Sie das GUI-Fenster für den Videobetrieb ein. Mit PySimpleGUI können Sie verschiedene Objekte hinzufügen, indem Sie sie einfach zur Liste hinzufügen. Dies ist also nützlicher als ein Tag, wenn Sie eine einfache GUI erstellen.


    def run(self):
        # GUI #######################################################
        #GUI-Layout
        layout = [
            [
                sg.Text("Start", size=(8, 1)),
                sg.Slider(
                    (0, self.total_count - 1),
                    0,
                    1,
                    orientation='h',
                    size=(45, 15),
                    key='-START FRAME SLIDER-',
                    enable_events=True
                )
            ],
            [
                sg.Text("End ", size=(8, 1)),
                sg.Slider(
                    (0, self.total_count - 1), self.total_count - 1,
                    1,
                    orientation='h',
                    size=(45, 15),
                    key='-END FRAME SLIDER-',
                    enable_events=True
                )
            ],
            [sg.Slider(
                (0, self.total_count - 1),
                0,
                1,
                orientation='h',
                size=(50, 15),
                key='-PROGRESS SLIDER-',
                enable_events=True
            )],
            [
                sg.Button('<<<', size=(5, 1)),
                sg.Button('<<', size=(5, 1)),
                sg.Button('<', size=(5, 1)),
                sg.Button('Play / Stop', size=(9, 1)),
                sg.Button('Reset', size=(7, 1)),
                sg.Button('>', size=(5, 1)),
                sg.Button('>>', size=(5, 1)),
                sg.Button('>>>', size=(5, 1))
            ],
            [
                sg.Text("Speed", size=(6, 1)),
                sg.Slider(
                    (0, 240),
                    10,
                    10,
                    orientation='h',
                    size=(19.4, 15),
                    key='-SPEED SLIDER-',
                    enable_events=True
                ),
                sg.Text("Skip", size=(6, 1)),
                sg.Slider(
                    (0, 300),
                    0,
                    1,
                    orientation='h',
                    size=(19.4, 15),
                    key='-SKIP SLIDER-',
                    enable_events=True
                )
            ],
            [sg.HorizontalSeparator()],
            [sg.Output(size=(65, 5), key='-OUTPUT-')],
            [sg.Button('Clear')]
        ]


        #Fenster generieren
        window = sg.Window('OpenCV Integration', layout, location=(0, 0))
        #Anzeige von Videoinformationen
        self.event, values = window.read(timeout=0)
        print("Die Datei wurde gelesen.")
        print("File Path: " + str(self.fp))
        print("fps: " + str(int(self.fps)))
        print("width: " + str(self.width))
        print("height: " + str(self.height))
        print("frame count: " + str(int(self.total_count)))

Video-Wiedergabe

Drehen Sie die Hauptschleife, um das Video abzuspielen. Während der Wiedergabe window.read (Lesen von GUI-Ereignissen)   ↓ cap.read (Lesen von Videobildern)   ↓ Verschiedene Bildverarbeitung   ↓ cv2.imshow (Video anzeigen)   ↓ frame_count + = 1 (Frame-Anzahl erhöhen) Und drehen Sie die Schleife.

Wenn Sie die Play / Stop-Taste drücken window.read (Lesen von GUI-Ereignissen)   ↓ cap.read (Lesen von Videobildern)   ↓ Verschiedene Bildverarbeitung   ↓ cv2.imshow (Video anzeigen)   ↓ Ist das gleiche bis zu cap.set(cv2.CAP_PROP_POS_FRAMES, self.frame_count) Durch Zurückgeben der Frame-Anzahl können verschiedene Bildverarbeitungen an demselben Frame durchgeführt werden, ohne die Frame-Anzahl zu erhöhen.


    #Hauptschleife#########################################################
        try:
            while True:
                self.event, values = window.read(
                    timeout=values["-SPEED SLIDER-"]
                )

                if self.event == "Clear":
                    pass

                if self.event != "__TIMEOUT__":
                    print(self.event)
                #Beenden, wenn die Schaltfläche Beenden gedrückt wird oder wenn die Schaltfläche zum Schließen des Fensters gedrückt wird
                if self.event in ('Exit', sg.WIN_CLOSED, None):
                    break

                #Video neu laden
                #Funktioniert, wenn der Startrahmen eingestellt ist
                if self.event == 'Reset':
                    self.cap.set(cv2.CAP_PROP_POS_FRAMES, self.s_frame)
                    self.frame_count = self.s_frame
                    window['-PROGRESS SLIDER-'].update(self.frame_count)

                    #Reflektieren Sie weiterhin Änderungen am Fortschrittsregler
                    continue

                #Rahmenbetrieb################################################
                #Priorität wird gegeben, wenn der Schieberegler direkt geändert wird
                if self.event == '-PROGRESS SLIDER-':
                    #Stellen Sie die Frame-Anzahl auf den Fortschrittsbalken ein
                    self.frame_count = int(values['-PROGRESS SLIDER-'])
                    self.cap.set(cv2.CAP_PROP_POS_FRAMES, self.frame_count)
                    if values['-PROGRESS SLIDER-'] > values['-END FRAME SLIDER-']:
                        window['-END FRAME SLIDER-'].update(
                            values['-PROGRESS SLIDER-'])

                #Wenn Sie den Startrahmen ändern
                if self.event == '-START FRAME SLIDER-':
                    self.s_frame = int(values['-START FRAME SLIDER-'])
                    self.cap.set(cv2.CAP_PROP_POS_FRAMES, self.s_frame)
                    self.frame_count = self.s_frame
                    window['-PROGRESS SLIDER-'].update(self.frame_count)
                    if values['-START FRAME SLIDER-'] > values['-END FRAME SLIDER-']:
                        window['-END FRAME SLIDER-'].update(
                            values['-START FRAME SLIDER-'])
                        self.e_frame = self.s_frame

                #Wenn Sie den Endrahmen ändern
                if self.event == '-END FRAME SLIDER-':
                    if values['-END FRAME SLIDER-'] < values['-START FRAME SLIDER-']:
                        window['-START FRAME SLIDER-'].update(
                            values['-END FRAME SLIDER-'])
                        self.s_frame = self.e_frame

                    #Rahmeneinstellungen beenden
                    self.e_frame = int(values['-END FRAME SLIDER-'])

                if self.event == '<<<':
                    self.frame_count = np.maximum(0, self.frame_count - 150)
                    window['-PROGRESS SLIDER-'].update(self.frame_count)
                    self.cap.set(cv2.CAP_PROP_POS_FRAMES, self.frame_count)

                if self.event == '<<':
                    self.frame_count = np.maximum(0, self.frame_count - 30)
                    window['-PROGRESS SLIDER-'].update(self.frame_count)
                    self.cap.set(cv2.CAP_PROP_POS_FRAMES, self.frame_count)

                if self.event == '<':
                    self.frame_count = np.maximum(0, self.frame_count - 1)
                    window['-PROGRESS SLIDER-'].update(self.frame_count)
                    self.cap.set(cv2.CAP_PROP_POS_FRAMES, self.frame_count)

                if self.event == '>':
                    self.frame_count = self.frame_count + 1
                    window['-PROGRESS SLIDER-'].update(self.frame_count)
                    self.cap.set(cv2.CAP_PROP_POS_FRAMES, self.frame_count)

                if self.event == '>>':
                    self.frame_count = self.frame_count + 30
                    window['-PROGRESS SLIDER-'].update(self.frame_count)
                    self.cap.set(cv2.CAP_PROP_POS_FRAMES, self.frame_count)

                if self.event == '>>>':
                    self.frame_count = self.frame_count + 150
                    window['-PROGRESS SLIDER-'].update(self.frame_count)
                    self.cap.set(cv2.CAP_PROP_POS_FRAMES, self.frame_count)

                #Wenn der Zähler den Endrahmen überschreitet, starten Sie ihn vom Startrahmen aus neu
                if self.frame_count >= self.e_frame:
                    self.cap.set(cv2.CAP_PROP_POS_FRAMES, self.s_frame)
                    self.frame_count = self.s_frame
                    window['-PROGRESS SLIDER-'].update(self.frame_count)
                    continue

                #Unterbrechen Sie das Laden des Videos mit der Stopp-Taste
                if self.event == 'Play / Stop':
                    self.stop_flg = not self.stop_flg

                #Wenn das Stopp-Flag nicht gesetzt ist und ein Ereignis eintritt, zählen Sie mit
                #Beenden Sie den Vorgang

                #Wenn die Stopp-Taste gedrückt wird, wird die Videoverarbeitung gestoppt, aber etwas
                #Wenn ein Ereignis auftritt, aktualisieren Sie nur das Image
                #Gleiches gilt für die Bedienung der Maus
                if(
                    (
                        self.stop_flg
                        and self.event == "__TIMEOUT__"
                    )
                ):
                    window['-PROGRESS SLIDER-'].update(self.frame_count)
                    continue

                #Frames überspringen
                if not self.stop_flg and values['-SKIP SLIDER-'] != 0:
                    self.frame_count += values["-SKIP SLIDER-"]
                    self.cap.set(cv2.CAP_PROP_POS_FRAMES, self.frame_count)

                #Rahmen laden##############################################
                self.ret, self.frame = self.cap.read()
                self.valid_frame = int(self.frame_count - self.s_frame)
                #Wenn der letzte Frame über sich selbst ist.s_Vom Rahmen fortsetzen
                if not self.ret:
                    self.cap.set(cv2.CAP_PROP_POS_FRAMES, self.s_frame)
                    self.frame_count = self.s_frame
                    continue

                #Beschreiben Sie anschließend die Verarbeitung für den Frame##################################
                #Führen Sie zunächst die Verarbeitung für den gesamten Frame durch##############################
                #Anzeige der Anzahl der Frames und der verstrichenen Sekunden
                cv2.putText(
                    self.frame, str("framecount: {0:.0f}".format(self.frame_count)), (
                        15, 20), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (240, 230, 0), 1, cv2.LINE_AA
                )
                cv2.putText(
                    self.frame, str("time: {0:.1f} sec".format(
                        self.frame_count / self.fps)), (15, 40), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (240, 230, 0), 1, cv2.LINE_AA
                )

                #Bild anzeigen
                cv2.imshow("Movie", self.frame)

                if self.stop_flg:
                    self.cap.set(cv2.CAP_PROP_POS_FRAMES, self.frame_count)

                else:
                    self.frame_count += 1
                    window['-PROGRESS SLIDER-'].update(self.frame_count + 1)

        finally:
            cv2.destroyWindow("Movie")
            self.cap.release()
            window.close()


if __name__ == '__main__':
    Main().run()

Umgebung

Windows10(64bit) python 3.5.2 OpenCV 4.1.0

Referenzlink

PySimpleGUI PySimpleGUI: popup_get_text Grundlegende Verwendung der PySimple-Benutzeroberfläche Erstellen Sie einen Bildverarbeitungs-Viewer mit PySimple-GUI

OpenCV Ich habe mein eigenes Tennis-Videoanalyse-Tool mit Python erstellt

Recommended Posts

Erstellen Sie einen Videoplayer mit PySimpleGUI + OpenCV
Erstellen Sie einen Videoplayer mit PySimpleGUI + OpenCV 3 Hinzufügen einer Maskenfunktion
Erstellen Sie einen Videoplayer mit PySimpleGUI + OpenCV 2 Fügen Sie die ROI-Einstellung hinzu und speichern Sie die Funktion (DIVX, MJPG, GIF).
Loop-Video-Laden mit opencv
Erstellen Sie mit OpenCV eine Funktion zum Beschreiben japanischer Schriftarten
Machen Sie eine Lotterie mit Python
Machen Sie ein Feuer mit kdeplot
Erstellen Sie mit opencv ganz einfach Miniaturansichten aus erotischen Videoordnern
Erstellen Sie mit python wxpython + openCV ein einfaches Videoanalysetool
Lassen Sie uns eine GUI mit Python erstellen.
Machen Sie einen Sound mit Jupyter Notebook
Löschen Sie bestimmte Farben mit OpenCV + PySimpleGUI
Machen wir einen Blockbruch mit wxPython
Erstellen Sie ein Empfehlungssystem mit Python
Machen Sie einen Filter mit einer Django-Vorlage
Lassen Sie uns ein Diagramm mit Python erstellen! !!
Machen wir mit xCAT einen Spacon
Erstellen Sie mit PySide einen Modelliterator
Machen Sie eine schöne Grafik mit Plotly
Trimmen mit OpenCV-Erstellen eines Peeping-Videos
So erstellen Sie eine Überwachungskamera (Überwachungskamera) mit Opencv und Python
Erstellen Sie mit Python und OpenCV ein einfaches OMR (Mark Sheet Reader)
Erstellen Sie einen Effektor für Videokonferenzen mit Spout + OpenCV + dlib (Teil 1).
Lassen Sie uns mit Python ein Shiritori-Spiel machen
Speichern Sie Videos Frame für Frame mit Python OpenCV
Machen Sie einen seltenen Gacha-Simulator mit Flask
Erstellen Sie eine Notebook-Pipeline mit Kedro + Papermill
Machen Sie mit matplotlib eine teilweise gezoomte Figur
Machen Sie ein Zeichnungsquiz mit kivy + PyTorch
Lassen Sie uns mit Python langsam sprechen
Erstellen Sie einen Kaskadenklassifizierer mit Google Colaboratory
Lassen Sie uns mit PLY 1 eine einfache Sprache erstellen
Machen Sie eine Logikschaltung mit Perceptron (Multilayer Perceptron)
Machen Sie Ja Nein Popup mit Kivy
Machen Sie einen Waschtrocknungs-Timer mit Raspberry Pi
Erstellen Sie eine GIF-Animation mit Ordnerüberwachung
Erstellen Sie ein Webframework mit Python! (1)
Machen wir mit Pylearn 2 eine dreiäugige KI
Erstellen Sie eine Desktop-App mit Python mit Electron
Machen wir einen Twitter-Bot mit Python!
Erstellen Sie ein Webframework mit Python! (2)
Ein Memorandum, um WebDAV nur mit Nginx zu erstellen
Verfolgen Sie Objekte in Ihrem Video mit OpenCV Tracker
Machen Sie Twitter Trend Bot mit Heroku + Python
Stellen Sie ein Überwachungsgerät mit einem Infrarotsensor her
Erstellen Sie mit Flask einen einfachen Punktbildgenerator
So erstellen Sie ein Wörterbuch mit einer hierarchischen Struktur.
Ich möchte ein Spiel mit Python machen
Versuchen Sie, in Python einen "Entschlüsselungs" -Code zu erstellen
Stellen Sie OpenCV3 in Python3 zur Verfügung, das mit pyenv installiert wurde
Ersetzen wir UWSC durch Python (5) Machen wir einen Roboter
Versuchen Sie, mit Python eine Diedergruppe zu bilden
[Chat De Tornado] Erstellen Sie einen Chat mit WebSocket in Tornado
Machen Sie Urlaubsdaten mit Pandas zu einem Datenrahmen
Erstellen Sie mit Amazon Lex einen LINE WORKS-Bot
(Memorandum) Erstellen Sie mit matplodlib ein 3D-Streudiagramm