[Python] Smasher hat versucht, den Video-Ladevorgang mithilfe eines Generators zu einer Funktion zu machen

Der Anfang der Dinge

Es gab eine Anfrage und ich beschloss, ungefähr 10 Stunden Spielvideos maschinell zu lernen. Ich habe ein Modul zum Lesen des Videos erstellt, während der Fortschrittsstatus an die Konsole ausgegeben wurde.

Gewöhnliches Programm

import cv2
import sys

fpath = 'data/videos/sample_video.mp4'

video = cv2.VideoCapture(fpath)
can_read, first = video.read()

if not can_read:
    sys.exit()

progress_step = 60    #Zeige den Fortschritt einmal alle 60 Frames
count = 0
max = int(video.get(cv2.CAP_PROP_FRAME_COUNT))

while video.isOpened():
    if(count % progress_step == 0):
        print(f'Progress rate: {count}/{max}')

    ok, frame = video.read()
    if ok:
        #Was willst du tun
    else:
        break

video.release()

Ausführungsergebnis

Progress rate: 0/2700
Progress rate: 60/2700
Progress rate: 120/2700
Progress rate: 180/2700
...

Impressionen

Ich habe den Zweck erreicht, aber andere Programme haben auch eine Videoladeverarbeitung, und ich möchte sie dort wiederverwenden. Deshalb habe ich beschlossen, sie zu einer Funktion zu machen, die von überall aufgerufen werden kann.

Funktionalisierte Ver

Funktion

reader.py


def video_read(input):
    """
    Parameters
    ----------
    input: str
        Input video path

    Returns
    ------
    Iterator[np.ndarray]
        Generator of video frame
    """

    # video capture start
    video = cv2.VideoCapture(input)
    can_read, first = video.read()

    if not can_read:
        print('Cannot read video file')
        return

    max = int(video.get(cv2.CAP_PROP_FRAME_COUNT))
    yield first

    progress_step = 60    #Zeige den Fortschritt einmal alle 60 Frames
    count = 0
    while video.isOpened():
        if(count % progress_step == 0):
            print(f'Progress rate: {count}/{max}')

        ok, frame = video.read()
        if ok:
            count += 1
            yield frame
        else:
            break
    video.release()

Anrufer

import reader

it = reader.video_read('data/videos/sample_video.mp4')
try:
    first = next(it)
except StopIteration:
    sys.exit()

for image in it:
    #Was willst du tun

Zusammenfassung

Der Anrufer war sehr erfrischend. Ich denke, dass der Video-Ladevorgang und der Hauptvorgang, den Sie ausführen möchten, getrennt und geklärt wurden. Ich habe das Gefühl, den Python-Generator gut genutzt zu haben. Es tut mir leid, dass mir dieser Artikel egal ist, Smasher ...

Recommended Posts

[Python] Smasher hat versucht, den Video-Ladevorgang mithilfe eines Generators zu einer Funktion zu machen
[Python] Machen Sie die Funktion zu einer Lambda-Funktion
Ich habe eine Stoppuhr mit tkinter mit Python gemacht
Ich habe versucht, mit Python einen regulären Ausdruck für "Betrag" zu erstellen
Ich habe versucht, mit Python einen regulären Ausdruck von "Zeit" zu erstellen
Ich habe versucht, mit Python einen regulären Ausdruck von "Datum" zu erstellen
Ich habe versucht, mit Selenium und Python einen regelmäßigen Ausführungsprozess durchzuführen
Ich habe auch versucht, die Funktionsmonade und die Zustandsmonade mit dem Generator in Python nachzuahmen
Ich habe versucht, eine ToDo-App mit einer Flasche mit Python zu erstellen
[Python] Ich habe versucht, mit argparse ein einfaches Programm zu erstellen, das in der Befehlszeile funktioniert
Teilen und Verarbeiten eines Datenrahmens mithilfe der Groupby-Funktion
Ich habe ein ○ ✕ Spiel mit TensorFlow gemacht
Django super Einführung von Python-Anfängern! Teil 3 Ich habe versucht, die Vererbungsfunktion für Vorlagendateien zu verwenden
Ich habe versucht, einen periodischen Prozess mit CentOS7, Selenium, Python und Chrome durchzuführen
[Circuit x Python] So ermitteln Sie die Übertragungsfunktion eines Schaltkreises mit Lcapy
[Python] Ich habe versucht, den Typnamen als Zeichenfolge aus der Typfunktion abzurufen
Ich habe versucht, die Sündenfunktion mit Chainer zu approximieren
So erstellen Sie ein Python-Paket mit VS Code
[Python] Stellen Sie sicher, dass die empfangene Funktion eine benutzerdefinierte Funktion ist
So testen Sie eine Funktion, die die aktuelle Zeit enthält, mit Freezegun in Python
Ich habe eine Funktion zum Abrufen von Daten aus der Datenbank spaltenweise mithilfe von SQL mit SQLite3 von Python [SQLite3, SQL, Pandas] erstellt.
So geben Sie char * in einer Rückruffunktion mit ctypes in Python zurück
Ich habe versucht, die Mail-Sendefunktion in Python zu implementieren
Ich habe versucht, die Sündenfunktion mit Chainer zu approximieren (Re-Challenge)
Ich habe mit PyQt einen einfachen Texteditor erstellt
Django super Einführung von Python-Anfängern! Teil 6 Ich habe versucht, die Login-Funktion zu implementieren
[C / C ++] Übergeben Sie den in C / C ++ berechneten Wert an eine Python-Funktion, um den Prozess auszuführen, und verwenden Sie diesen Wert in C / C ++.
Ich habe versucht, das Masami-Broadcast-Video wie IPPON Grand Prix (OpenCV: Python-Version) zu machen.
Ich habe versucht, einen Generator zu erstellen, der mit Python eine C # -Containerklasse aus CSV generiert
Ich habe versucht, eine Funktion zu erstellen, um zu beurteilen, ob die wichtigsten Aktien der Welt Sommerzeit mit Python sind
[5.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
Rubyist hat versucht, eine einfache API mit Python + Flasche + MySQL zu erstellen
Ich habe versucht, den Index der Liste mithilfe der Aufzählungsfunktion abzurufen
[2nd] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
[Einführung in Python] So teilen Sie eine Zeichenfolge mit der Funktion split
Verarbeiten Sie das Ausführungsergebnis von Splunk mit Python und speichern Sie es in einer Datei
[3.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
Ich habe versucht, die Videowiedergabezeit anzuzeigen (OpenCV: Python-Version)
Ich habe versucht, mit Python eine 2-Kanal-Post-Benachrichtigungsanwendung zu erstellen
[Python3] Definition eines Dekorators, der die Ausführungszeit einer Funktion misst
[4.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
Ich habe versucht, ein Standbild aus dem Video auszuschneiden
[1.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
[Python] Eine einfache Funktion zum Ermitteln der Mittelkoordinaten eines Kreises
Ich habe versucht, mit Python + OpenCV eine Bildähnlichkeitsfunktion zu erstellen
"Cython" -Tutorial, um Python explosiv zu machen: Wenn eine Funktion auf der C ++ - Seite überlastet ist.
Ich habe versucht, den Unterschied zwischen A + = B und A = A + B in Python herauszufinden
[Python] Wie man eine Klasse iterierbar macht
[Einführung in die Udemy Python3 + -Anwendung] 47. Verarbeiten Sie das Wörterbuch mit einer for-Anweisung
[Python] Erklärt anhand eines konkreten Beispiels, wie die Bereichsfunktion verwendet wird
Django super Einführung von Python-Anfängern! Teil 2 Ich habe versucht, die praktischen Funktionen der Vorlage zu nutzen
[Einführung in Python] So schreiben Sie eine Zeichenfolge mit der Formatierungsfunktion
Ich habe eine Web-API erstellt
Ich habe ein Beispiel für den Zugriff auf Salesforce mit Python und Bottle erstellt
Python: Ich möchte die Verarbeitungszeit einer Funktion genau messen
Ich habe versucht, die Neujahrskarte selbst mit Python zu analysieren
Ich möchte eine Webanwendung mit React und Python Flask erstellen
Ich habe eine Funktion erstellt, um die Bewegung eines zweidimensionalen Arrays (Python) zu sehen.
Ich habe versucht, die Lernfunktion im neuronalen Netzwerk sorgfältig zu verstehen, ohne die Bibliothek für maschinelles Lernen zu verwenden (erste Hälfte).
"Cython" -Tutorial, das Python explosiv macht: Handhabung, wenn Funktionen auf der C ++ - Seite als Referenz übergeben werden.