Détecter Flappy Bird dans une vidéo à l'aide d'OpenCV

PythonPythonBeginner
Pratiquer maintenant

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Ce projet est conçu pour vous apprendre à détecter le personnage de Flappy Bird dans une vidéo à l'aide de la méthode cv2.matchTemplate fournie par OpenCV, une puissante bibliothèque pour le traitement d'images et la vision par ordinateur. La fonction cv2.matchTemplate est un outil pratique pour la correspondance de modèles, qui est une technique dans le traitement d'images numériques pour trouver de petites parties d'une image qui correspondent à une image modèle. Dans ce projet, nous allons créer un projet Python qui applique cette méthode pour détecter le personnage de Flappy Bird dans une vidéo, en en faisant un exemple pratique pour les débutants et les intermédiaires en Python et OpenCV.

👀 Aperçu

🎯 Tâches

Dans ce projet, vous allez apprendre :

  • Comment importer et utiliser la bibliothèque OpenCV pour le traitement d'images.
  • Comment écrire une fonction pour traiter les données vidéo et d'image.
  • Comment implémenter la correspondance de modèles pour la détection d'objets dans les trames vidéo.
  • Comment annoter et afficher les résultats dans une vidéo.

🏆 Réalisations

Après avoir terminé ce projet, vous serez capable de :

  • Utiliser OpenCV pour les tâches de base de traitement d'images et de vidéo.
  • Appliquer les techniques de correspondance de modèles pour détecter des objets dans les données vidéo.
  • Annoter et visualiser les résultats de la détection d'objets dans une vidéo.

Créer les fichiers du projet

Commencez par préparer votre espace de travail de projet. Créez un seul fichier de script Python nommé bird_detection.py.

touch bird_detection.py

De plus, assurez-vous d'avoir un fichier vidéo (par exemple, flappybird.mp4) et un fichier image d'oiseau (par exemple, bird.png) dans votre répertoire de projet. Ces fichiers seront utilisés pour détecter l'oiseau dans la vidéo.

Structure du répertoire de projet

projet/

├── bird_detection.py ## Votre script Python
├── flappybird.mp4 ## Fichier vidéo à traiter
└── bird.png ## Image d'oiseau à détecter dans la vidéo

✨ Vérifier la solution et pratiquer

Importer OpenCV

Dans bird_detection.py, commençons par importer la bibliothèque OpenCV. Cette bibliothèque fournit des fonctions pour le traitement d'images et la vision par ordinateur.

import cv2

En important cv2, nous avons accès à toutes les fonctionnalités d'OpenCV.

✨ Vérifier la solution et pratiquer

Définir la fonction de détection d'oiseau

Définissez une fonction appelée trouver_et_afficher_oiseau. Cette fonction prendra les chemins d'un fichier vidéo et d'une image d'oiseau, et elle affichera l'oiseau dans chaque trame de la vidéo.

def trouver_et_afficher_oiseau(chemin_video, chemin_image_oiseau):
    ## Les détails de la fonction seront ajoutés dans les étapes suivantes

Cette fonction est le cœur de notre projet, où la plupart de notre logique de détection résidera.

✨ Vérifier la solution et pratiquer

Charger la vidéo et l'image d'oiseau

Dans cette étape, le script charge les fichiers vidéo et d'image d'oiseau à l'aide d'OpenCV, ce qui est essentiel pour le processus de détection.

    ## Charger la vidéo et l'image d'oiseau
    cap = cv2.VideoCapture(chemin_video)
    oiseau = cv2.imread(chemin_image_oiseau)

    ## Vérifier si les fichiers ont été chargés avec succès
    if not cap.isOpened():
        print(f"Erreur : Impossible d'ouvrir la vidéo {chemin_video}")
        return
    if oiseau is None:
        print(f"Erreur : Impossible de charger l'image d'oiseau {chemin_image_oiseau}")
        return

Explication du processus de chargement :

  • cv2.VideoCapture(chemin_video) : Cette fonction est utilisée pour capturer une vidéo.
    • chemin_video est le chemin vers le fichier vidéo.
    • Elle renvoie un objet de capture vidéo (cap), qui vous permet de lire les trames de la vidéo.
  • cv2.imread(chemin_image_oiseau) : Cette fonction lit une image à partir du fichier spécifié.
    • chemin_image_oiseau est le chemin vers l'image d'oiseau.
    • Elle renvoie l'image (oiseau) sous forme d'un tableau multidimensionnel, qui représente les pixels de l'image.

Vérification du succès du chargement des fichiers :

  • Il est crucial de vérifier si les fichiers vidéo et image ont été chargés avec succès pour éviter les erreurs pendant le traitement.
  • cap.isOpened() : Cette méthode vérifie si la capture vidéo a été initialisée correctement. Si elle renvoie False, cela signifie que le fichier vidéo n'a pas pu être ouvert.
  • if oiseau is None : Cette condition vérifie si l'image d'oiseau a été chargée correctement. Si oiseau est None, cela signifie que le fichier image n'a pas pu être lu.

Charger correctement la vidéo et l'image d'oiseau est une étape fondamentale dans le processus de détection d'oiseau, car cela garantit que les données nécessaires au traitement sont accessibles et au bon format.

✨ Vérifier la solution et pratiquer

Traiter chaque trame de la vidéo

Dans cette étape, le script traite chaque trame de la vidéo pour détecter l'oiseau à l'aide de deux fonctions clés d'OpenCV : cv2.matchTemplate et cv2.minMaxLoc.

    print("Traitement de la vidéo...")

    ## Traiter chaque trame de la vidéo
    while True:
        success, im = cap.read()
        if not success:
            break

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

        ## Le code de dessin et d'annotation de texte sera ajouté dans l'étape suivante

Explication de cv2.matchTemplate :

  • cv2.matchTemplate est utilisé pour la correspondance de modèles, une méthode en vision par ordinateur pour trouver une sous-image dans une image plus grande.
  • Dans cette fonction :
    • im est la trame actuelle de la vidéo.
    • oiseau est l'image de modèle (dans ce cas, l'image d'oiseau que nous cherchons).
    • cv2.TM_CCOEFF est la méthode utilisée pour la correspondance de modèles. Plusieurs méthodes sont disponibles dans OpenCV, mais TM_CCOEFF est efficace à cet effet car elle utilise le coefficient de corrélation pour la correspondance.
  • La fonction renvoie une image en niveaux de gris res, où chaque pixel indique dans quelle mesure le voisinage de ce pixel correspond au modèle.

Explication de cv2.minMaxLoc :

  • cv2.minMaxLoc est utilisé pour trouver l'emplacement des valeurs minimales et maximales dans une image en niveaux de gris.
  • Dans ce contexte, il est utilisé pour trouver la zone de correspondance la plus élevée dans l'image res.
    • La fonction renvoie quatre valeurs : la valeur minimale, la valeur maximale, l'emplacement de la valeur minimale et l'emplacement de la valeur maximale.
    • Pour TM_CCOEFF, la valeur maximale (max_val) et son emplacement (max_loc) sont les plus intéressants, car ils représentent le point où le modèle (oiseau) a la meilleure correspondance.
  • max_loc nous donne le coin supérieur gauche du rectangle où l'oiseau est trouvé dans la trame.

En appliquant répétitivement ces deux fonctions à chaque trame de la vidéo, le script peut localiser l'oiseau dans chaque trame, permettant une détection en temps réel tandis que la vidéo joue. C'est une technique fondamentale en analyse vidéo et en vision par ordinateur, permettant l'identification et le suivi d'objets à travers les trames.

✨ Vérifier la solution et pratiquer

Annoter et afficher les résultats

Dans cette étape, le script anime et affiche chaque trame avec la zone de l'oiseau détecté en traçant un rectangle autour d'elle et en affichant la position.

        ## Dessiner un rectangle autour de l'oiseau
        left, top = max_loc
        right, bottom = left + oiseau.shape[1], top + oiseau.shape[0]
        cv2.rectangle(im, (left, top), (right, bottom), 255, 2)

        ## Ajouter une annotation de texte pour la position
        position_text = f"Position : ({left}, {top})"
        cv2.putText(im, position_text, (left, top), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 1)

        ## Afficher l'image
        cv2.imshow('Détection d\'oiseau', im)

        ## Sortir de la boucle si la touche 'q' est pressée
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

Dessiner un rectangle autour de l'oiseau :

  • cv2.rectangle(im, (left, top), (right, bottom), 255, 2) : Cette fonction trace un rectangle sur la trame.
    • Les paramètres (left, top) et (right, bottom) définissent les coins supérieur gauche et inférieur droit du rectangle.
    • 255 définit la couleur du rectangle (blanc dans ce cas).
    • 2 est l'épaisseur des lignes du rectangle.

Ajouter une annotation de texte :

  • cv2.putText : Cette fonction met du texte sur la trame.
    • Elle affiche la position de l'oiseau dans la trame.
    • position_text est le texte à afficher, montrant le coin supérieur gauche de la zone de l'oiseau détectée.
    • La position où le texte est affiché est définie sur (left, top) qui est le coin supérieur gauche du rectangle.
    • cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 1 définissent le style de police, la taille, la couleur (blanche) et l'épaisseur du texte.

Afficher l'image :

  • cv2.imshow('Détection d\'oiseau', im) : Cette fonction affiche la trame actuelle avec le rectangle et les annotations de texte.
  • cv2.waitKey(1) & 0xFF == ord('q') : Cette ligne permet au script d'afficher la trame pendant un court moment et d'attendre que la touche 'q' soit pressée pour sortir de la boucle. Cela permet une lecture vidéo en temps réel avec des annotations.

Annoter et afficher les résultats en temps réel est crucial pour visualiser l'efficacité du processus de détection d'oiseau. Cela permet aux utilisateurs de voir la détection en action et de vérifier son exactitude.

✨ Vérifier la solution et pratiquer

Libérer les ressources et fermer les fenêtres

Après avoir traité la vidéo, libérez toutes les ressources et fermez toutes les fenêtres ouvertes.

    ## Libérer les ressources et fermer les fenêtres
    cap.release()
    cv2.destroyAllWindows()
    print("Traitement vidéo terminé.")

Cette étape de nettoyage est cruciale pour une gestion efficace des ressources dans toute application qui gère des fichiers et des fenêtres.

✨ Vérifier la solution et pratiquer

Utilisation de l'exemple

Enfin, fournissez un exemple d'utilisation de la fonction trouver_et_afficher_oiseau.

## Utilisation de l'exemple
if __name__ == "__main__":
    trouver_et_afficher_oiseau('flappybird.mp4', 'bird.png')

Maintenant que nous avons terminé toutes les étapes, nous pouvons exécuter le code dans l'environnement de bureau en utilisant la commande suivante :

cd ~/projet
python bird_detection.py

✨ Vérifier la solution et pratiquer

Résumé

Dans ce projet, vous avez appris à configurer un projet Python pour détecter un oiseau dans une vidéo à l'aide d'OpenCV. Partant de la création de fichiers de projet, de l'importation d'OpenCV, de la définition de la fonction de détection d'oiseau, du chargement et du traitement des trames vidéo, de l'annotation et de l'affichage des résultats, jusqu'au nettoyage des ressources, vous avez parcouru toutes les étapes essentielles pour construire une application de base de vision par ordinateur. Ce projet constitue une compétence de base en traitement d'images et en vision par ordinateur utilisant Python et OpenCV.