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.
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.
Anzahl der Framesprünge = 1:
Anzahl der Framesprünge = 5:
Erstellen Sie mit PySimpleGUI eine Datei zum Lesen der Benutzeroberfläche.
Klicken Sie auf Senden, um den Dateiauswahldialog anzuzeigen.
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)
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
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)))
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()
Windows10(64bit) python 3.5.2 OpenCV 4.1.0
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