Flappy Bird in Video mit OpenCV erkennen

PythonPythonBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

Dieses Projekt ist darauf ausgelegt, Ihnen zu beibringen, wie Sie mithilfe der cv2.matchTemplate-Methode aus der OpenCV, einer leistungsstarken Bibliothek für die Bildverarbeitung und die computergestützte Vision, den Flappy Bird-Charakter in einem Video erkennen. Die cv2.matchTemplate-Funktion ist ein nützliches Tool für die Template-Matching, eine Technik in der digitalen Bildverarbeitung zum Finden kleiner Teile eines Bildes, die einem Template-Bild entsprechen. In diesem Projekt werden wir ein Python-Projekt erstellen, das diese Methode anwendet, um den Flappy Bird-Charakter in einem Video zu erkennen, was ein praktisches Beispiel für Einsteiger und Fortgeschrittene in Python und OpenCV ist.

👀 Vorschau

🎯 Aufgaben

In diesem Projekt lernen Sie:

  • Wie Sie die OpenCV-Bibliothek für die Bildverarbeitung importieren und verwenden.
  • Wie Sie eine Funktion zum Verarbeiten von Videodaten und Bilddaten schreiben.
  • Wie Sie die Template-Matching-Implementierung für die Objekterkennung in Videoframes durchführen.
  • Wie Sie die Ergebnisse in einem Video annotieren und anzeigen.

🏆 Errungenschaften

Nach Abschluss dieses Projekts können Sie:

  • OpenCV für grundlegende Bild- und Videoverarbeitungstasks verwenden.
  • Template-Matching-Techniken anwenden, um Objekte in Videodaten zu erkennen.
  • Die Ergebnisse der Objekterkennung in Videos annotieren und visualisieren.

Projekt-Dateien erstellen

Beginnen Sie mit der Vorbereitung Ihres Projektarbeitsbereichs. Erstellen Sie eine einzelne Python-Skriptdatei namens bird_detection.py.

touch bird_detection.py

Sicherstellen Sie außerdem, dass Sie in Ihrem Projektverzeichnis eine Videodatei (z.B. flappybird.mp4) und eine Vogel-Bilddatei (z.B. bird.png) haben. Diese Dateien werden verwendet, um den Vogel im Video zu erkennen.

Projektverzeichnisstruktur

project/

├── bird_detection.py ## Ihr Python-Skript
├── flappybird.mp4 ## Videodatei zur Verarbeitung
└── bird.png ## Vogel-Bild, das im Video erkannt werden soll

✨ Lösung prüfen und üben

OpenCV importieren

In bird_detection.py beginnt man mit dem Importieren der OpenCV-Bibliothek. Diese Bibliothek bietet Funktionen für die Bildverarbeitung und die computergestützte Vision.

import cv2

Durch das Importieren von cv2 haben wir Zugang zu allen OpenCV-Funktionalitäten.

✨ Lösung prüfen und üben

Funktion zur Vogelerkennung definieren

Definieren Sie eine Funktion namens find_and_display_bird. Diese Funktion wird die Pfade zu einer Videodatei und einem Vogelbild entgegennehmen und den Vogel in jedem Frame des Videos anzeigen.

def find_and_display_bird(video_path, bird_image_path):
    ## Function details will be added in the next steps

Diese Funktion ist der Kern unseres Projekts, in der sich die meiste unserer Erkennungslogik befinden wird.

✨ Lösung prüfen und üben

Videodatei und Vogelbild laden

In diesem Schritt lädt das Skript die Videodatei und das Vogelbild mit Hilfe von OpenCV, was für den Erkennungsprozess unerlässlich ist.

    ## Load video and bird image
    cap = cv2.VideoCapture(video_path)
    bird = cv2.imread(bird_image_path)

    ## Check if files were loaded successfully
    if not cap.isOpened():
        print(f"Error: Could not open video {video_path}")
        return
    if bird is None:
        print(f"Error: Could not load bird image {bird_image_path}")
        return

Erklärung des Ladevorgangs:

  • cv2.VideoCapture(video_path): Diese Funktion wird verwendet, um ein Video zu erfassen.
    • video_path ist der Pfad zur Videodatei.
    • Sie gibt ein Videoverarbeitungsobjekt (cap) zurück, mit dem Sie Frames aus dem Video lesen können.
  • cv2.imread(bird_image_path): Diese Funktion liest ein Bild aus der angegebenen Datei.
    • bird_image_path ist der Pfad zum Vogelbild.
    • Sie gibt das Bild (bird) in Form eines mehrdimensionalen Arrays zurück, das die Pixel des Bildes repräsentiert.

Überprüfung des erfolgreichen Dateiladens:

  • Es ist von entscheidender Bedeutung, zu überprüfen, ob die Videodatei und das Bild erfolgreich geladen wurden, um Fehler während der Verarbeitung zu vermeiden.
  • cap.isOpened(): Diese Methode überprüft, ob die Videokaprur richtig initialisiert wurde. Wenn sie False zurückgibt, bedeutet dies, dass die Videodatei nicht geöffnet werden konnte.
  • if bird is None: Diese Bedingung überprüft, ob das Vogelbild richtig geladen wurde. Wenn bird None ist, bedeutet dies, dass die Bilddatei nicht gelesen werden konnte.

Das korrekte Laden der Videodatei und des Vogelbildes ist ein grundlegender Schritt im Vogelerkennungsprozess, da dadurch sichergestellt wird, dass die für die Verarbeitung erforderlichen Daten zugänglich und im richtigen Format vorliegen.

✨ Lösung prüfen und üben

Videoframe für Frame verarbeiten

In diesem Schritt verarbeitet das Skript jeden Frame des Videos, um den Vogel mithilfe zweier Schlüsselfunktionen von OpenCV zu erkennen: cv2.matchTemplate und cv2.minMaxLoc.

    print("Processing video...")

    ## Process video frame by frame
    while True:
        success, im = cap.read()
        if not success:
            break

        res = cv2.matchTemplate(im, bird, cv2.TM_CCOEFF)
        _, max_val, _, max_loc = cv2.minMaxLoc(res)

        ## Drawing and text annotation code will be added in the next step

Erklärung von cv2.matchTemplate:

  • cv2.matchTemplate wird für die Template-Matching verwendet, eine Methode in der computergestützten Vision, um ein Teilbild in einem größeren Bild zu finden.
  • In dieser Funktion:
    • im ist der aktuelle Frame aus dem Video.
    • bird ist das Template-Bild (in diesem Fall das Vogelbild, das wir suchen).
    • cv2.TM_CCOEFF ist die Methode, die für das Template-Matching verwendet wird. Es gibt mehrere Methoden in OpenCV, aber TM_CCOEFF ist für diesen Zweck effektiv, da es den Korrelationskoeffizienten für die Übereinstimmung verwendet.
  • Die Funktion gibt ein Graustufenbild res zurück, wobei jeder Pixel angibt, wie gut die Nachbarschaft dieses Pixels mit dem Template übereinstimmt.

Erklärung von cv2.minMaxLoc:

  • cv2.minMaxLoc wird verwendet, um die Position der Minimal- und Maximalwerte in einem Graustufenbild zu finden.
  • In diesem Zusammenhang wird es verwendet, um die höchste Übereinstimmungsfläche im res-Bild zu finden.
    • Die Funktion gibt vier Werte zurück: den Minimalwert, den Maximalwert, die Position des Minimalwerts und die Position des Maximalwerts.
    • Für TM_CCOEFF sind der Maximalwert (max_val) und seine Position (max_loc) von Interesse, da sie den Punkt darstellen, an dem das Template (Vogel) die höchste Übereinstimmung hat.
  • max_loc gibt uns die obere linke Ecke des Rechtecks, in dem der Vogel im Frame gefunden wird.

Indem diese beiden Funktionen wiederholt auf jeden Frame des Videos angewendet werden, kann das Skript den Vogel in jedem Frame lokalisieren, was eine Echtzeit-Erkennung ermöglicht, während das Video abgespielt wird. Dies ist eine grundlegende Technik in der Videoanalyse und der computergestützten Vision, die die Identifizierung und Verfolgung von Objekten über mehrere Frames ermöglicht.

✨ Lösung prüfen und üben

Ergebnisse annotieren und anzeigen

In diesem Schritt annotiert das Skript und zeigt jeden Frame mit der detektierten Vogelregion an, indem es ein Rechteck um sie zeichnet und die Position anzeigt.

        ## Draw rectangle around the bird
        left, top = max_loc
        right, bottom = left + bird.shape[1], top + bird.shape[0]
        cv2.rectangle(im, (left, top), (right, bottom), 255, 2)

        ## Add text annotation for position
        position_text = f"Position: ({left}, {top})"
        cv2.putText(im, position_text, (left, top), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 1)

        ## Display the image
        cv2.imshow('Bird Detection', im)

        ## Break loop on 'q' key press
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

Rechteck um den Vogel zeichnen:

  • cv2.rectangle(im, (left, top), (right, bottom), 255, 2): Diese Funktion zeichnet ein Rechteck auf dem Frame.
    • Die Parameter (left, top) und (right, bottom) definieren die oberen linken und unteren rechten Ecken des Rechtecks.
    • 255 setzt die Farbe des Rechtecks (weiß in diesem Fall).
    • 2 ist die Dicke der Rechtecklinien.

Textannotation hinzufügen:

  • cv2.putText: Diese Funktion setzt Text auf dem Frame.
    • Sie zeigt die Position des Vogels im Frame an.
    • position_text ist der Text, der angezeigt werden soll, der die obere linke Ecke der detektierten Vogelregion zeigt.
    • Die Position, an der der Text angezeigt wird, ist auf (left, top) gesetzt, was die obere linke Ecke des Rechtecks ist.
    • cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 1 setzen die Schriftart, die Größe, die Farbe (weiß) und die Dicke des Texts.

Bild anzeigen:

  • cv2.imshow('Bird Detection', im): Diese Funktion zeigt den aktuellen Frame mit dem Rechteck und den Textannotationen an.
  • cv2.waitKey(1) & 0xFF == ord('q'): Diese Zeile ermöglicht es dem Skript, den Frame für eine kurze Zeit anzuzeigen und wartet auf das Drücken der 'q'-Taste, um die Schleife zu beenden. Dies ermöglicht das Echtzeit-Videoabspielen mit Annotationsen.

Das Echtzeit-Annotieren und Anzeigen der Ergebnisse ist entscheidend für die Visualisierung der Effektivität des Vogelerkennungsprozesses. Es ermöglicht es Benutzern, die Erkennung in Aktion zu sehen und ihre Genauigkeit zu verifizieren.

✨ Lösung prüfen und üben

Ressourcen freigeben und Fenster schließen

Nachdem das Video verarbeitet wurde, werden alle Ressourcen freigegeben und alle geöffneten Fenster geschlossen.

    ## Release resources and close windows
    cap.release()
    cv2.destroyAllWindows()
    print("Video processing complete.")

Dieser Bereinigungsschritt ist entscheidend für die effiziente Ressourcenverwaltung in jeder Anwendung, die Dateien und Fenster behandelt.

✨ Lösung prüfen und üben

Beispielverwendung

Schließlich wird ein Beispiel dafür gegeben, wie die Funktion find_and_display_bird verwendet werden kann.

## Example usage
if __name__ == "__main__":
    find_and_display_bird('flappybird.mp4', 'bird.png')

Jetzt haben wir alle Schritte abgeschlossen. Wir können den Code im Desktop-Umgebung mithilfe des folgenden Befehls ausführen:

cd ~/project
python bird_detection.py

✨ Lösung prüfen und üben

Zusammenfassung

In diesem Projekt haben Sie gelernt, wie Sie ein Python-Projekt einrichten, um einen Vogel in einem Video mit OpenCV zu erkennen. Von der Erstellung von Projektdateien über das Importieren von OpenCV, die Definition der Vogelerkennungsfunktion, das Laden und Verarbeiten von Videoframes, die Annotation und Anzeige von Ergebnissen bis hin zur Bereinigung von Ressourcen haben Sie alle wesentlichen Schritte zur Erstellung einer grundlegenden computergestützten Vision-Anwendung durchlaufen. Dieses Projekt dient als Grundlage für die Fähigkeiten in der Bildverarbeitung und der computergestützten Vision mit Python und OpenCV.