Suivi d'objet à l'aide d'OpenCV

Manav Narula 21 juin 2022
  1. Trackers pour le suivi d’objets dans OpenCV
  2. Utiliser les suivis d’objets OpenCV en Python
  3. Conclusion
Suivi d'objet à l'aide d'OpenCV

Le suivi d’objets est l’une des tâches importantes de la vision par ordinateur qui a de nombreuses applications dans le monde réel. Dans le suivi d’objets, nous essayons de distinguer différents objets en fonction de certains paramètres donnés et de suivre leur mouvement.

Rappelez-vous que le suivi d’objet est différent de la détection d’objet. En effet, le suivi d’objet est beaucoup plus rapide car nous n’avons pas tendance à détecter l’objet dans chaque image, ce qui augmente la charge de calcul.

L’application réelle la plus courante du suivi d’objets est le suivi du mouvement des véhicules sur les routes. Nous pouvons identifier différents véhicules et observer s’ils respectent ou non le code de la route en suivant leur trajectoire.

Nous pouvons utiliser la bibliothèque opencv pour travailler avec des problèmes de suivi d’objets en Python. Ce tutoriel abordera les différents trackers disponibles dans opencv pour le suivi d’objets.

Trackers pour le suivi d’objets dans OpenCV

Le premier tracker est le cv2.TrackerBoosting_create basé sur l’algorithme AdaBoost de Machine Learning. Il apprend en utilisant les échantillons positifs et négatifs de l’objet à suivre lors de l’exécution, et il n’a pas de bons antécédents ces derniers temps et est considéré comme très lent.

Ensuite, nous avons le tracker cv2.TrackerMIL_create basé sur l’algorithme MIL. Il a été conçu comme une amélioration du tracker BOOSTING et est basé sur des concepts et des facteurs similaires au voisinage d’échantillons positifs pour distinguer les objets améliorant la précision globale.

Le tracker cv2.TrackerKCF_create est basé sur l’approche mathématique des régions qui se chevauchent de plusieurs correspondances positives dans un MIL. La forme complète de KCF est Kernelized Correlation Filters, et il est considéré comme un tracker décent et fonctionne très bien dans le suivi d’objets uniques.

Le tracker cv2.TrackerCSRT_create est basé sur le Filtre de Corrélation Discriminant avec fiabilité canal et spatiale. Il filtre des parties de l’image à l’aide de la carte de fiabilité spatiale qui aide à sélectionner l’objet requis, et pour des fréquences d’images inférieures, il donne une précision élevée.

Le tracker cv2.TrackerMedianFlow_create est un tracker avancé qui vise à minimiser les échecs de suivi et à choisir le chemin le plus fiable. Un objet est détecté en temps réel, son déplacement pour le mouvement vers l’avant et vers l’arrière est calculé, et la mesure de l’erreur et de la différence entre les deux valeurs est comparée pour suivre la trajectoire de l’objet donné.

Nous avons aussi le tracker cv2.TrackerTLD_create. TLD signifie suivi, apprentissage et détection, et il suit la trajectoire d’un objet image par image. Il utilise la position de l’image précédente pour corriger et améliorer le suivi.

La partie détecteur permet de redresser le tracker si besoin en utilisant la trame précédente. Il gère très efficacement le chevauchement d’objets.

Le tracker cv2.TrackerMOSSE_create, où MOSSE signifie Minimum Output Sum of Squared Error, utilise des corrélations adaptatives dans l’espace de Fourier pour suivre les objets. Il utilise ces valeurs de corrélation et essaie de minimiser la somme des erreurs au carré entre la corrélation réelle et prédite.

Ce tracker a une vitesse de suivi très élevée et s’adapte bien aux changements de lumière et à l’environnement de l’objet.

Utiliser les suivis d’objets OpenCV en Python

Nous utiliserons le tracker cv2.TrackerKCF_create dans notre exemple pour suivre un objet. Nous allons commencer par lire l’exemple de vidéo en utilisant la fonction capture().

Ensuite, nous initialisons une variable qui garde la trace de l’objet. Initialement, il est affecté comme None et exécute une boucle qui lit cette vidéo image par image.

Dans un premier temps, on vérifie s’il y a eu un tracking effectué dans la trame précédente et on continue si la variable initialisée n’est pas None. Sinon, nous sélectionnons l’objet que nous voulons suivre à l’aide de la fonction selectROI.

Après cela, nous utilisons l’objet de suivi défini pour suivre cet objet dans chaque image et afficher les informations de suivi.

Exemple de code :

import cv2
import imutils

vid = cv2.VideoCapture("sample1.mp4")
initial_box = None
tracker = cv2.TrackerKCF_create()
while True:
    fr = vid.read()
    if fr is None:
        break
    if initial_box is not None:
        (success, box) = tracker.update(fr)
        if success:
            (x, y, w, h) = [int(v) for v in box]
            cv2.rectangle(fr, (x, y), (x + w, y + h), (0, 255, 0), 2)
        fps.update()
        fps.stop()
        information = [
            ("Success", "Yes" if success else "No"),
            ("FPS", "{:.3f}".format(fps.fps())),
        ]
        for (i, (k, v)) in enumerate(information):
            text = "{}: {}".format(k, v)
            cv2.putText(
                fr,
                text,
                (10, H - ((i * 20) + 20)),
                cv2.FONT_HERSHEY_SIMPLEX,
                0.6,
                (0, 0, 255),
                2,
            )
        cv2.imshow("Output Frame", fr)
        key = cv2.waitKey(1) & 0xFF
    initial_box = cv2.selectROI("fr", fr, fromCenter=False, showCrosshair=True)
    tracker.init(fr, initial_box)
    fps = FPS().start()

cv2.destroyAllWindows()

Conclusion

Nous avons discuté des différents algorithmes utilisés pour le suivi d’objets disponibles dans la bibliothèque opencv. Tout d’abord, nous avons discuté du suivi d’objets et de ses utilisations dans la vie réelle.

Ensuite, nous avons discuté en détail des huit trackers disponibles de la bibliothèque opencv et d’un exemple de code sur la gestion du suivi d’objets à l’aide de ces trackers.

Auteur: Manav Narula
Manav Narula avatar Manav Narula avatar

Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.

LinkedIn

Article connexe - Python OpenCV