Introduction au suivi d'objets avec OpenCV

Contenu

Cet article a été publié dans le cadre du Blogathon sur la science des données

introduction

OpenCV est un excellent outil pour jouer avec des images et des vidéos. Ou vous voulez donner à vos photos un aspect noir et blanc du 90 ou effectuer des opérations mathématiques complexes, OpenCV est toujours prêt à servir. Si vous aimez la vision par ordinateur, la connaissance d'OpenCV est indispensable. La bibliothèque comprend plus de 2500 algorithmes optimisés pouvant être utilisés pour effectuer une grande variété de tâches. Il est utilisé par de nombreux géants de l'industrie comme Google, Microsoft, IBM et est largement utilisé dans les groupes de recherche. La bibliothèque prend en charge plusieurs langues, y compris java, c ++ et python.

Cet article vous montrera comment accomplir la tâche complexe de suivi d'objets en utilisant certaines des fonctions de base d'OpenCV.

Vous pouvez considérer un exemple de match de football. Vous avez une diffusion en direct du match et votre tâche est de suivre la position du ballon à tout moment. La tâche semble simple à un humain moyen, mais c'est trop complexe pour même la machine la plus intelligente. Comment saurez-vous, les ordinateurs ne comprennent que les chiffres. Vous ne comprenez pas ce qu'est une image, mais les valeurs de pixels associées à l'image. Deux images qui semblent être exactement les mêmes à l'œil humain peuvent ne pas être le même cas pour votre ordinateur, puisque même un petit changement dans un pixel entraînera une différence. Pour cela, le suivi d'objets est considéré comme l'une des tâches les plus complexes de la vision par ordinateur. Bien que complexe, ce n'est pas quelque chose d'inatteignable.

El seguimiento de objetos se puede realizar mediante el aprendizaje automático y también con enfoques basados ​​en el l'apprentissage en profondeur. L'approche d'apprentissage en profondeur d'une part donne de meilleurs résultats dans des tâches complexes et est assez répandue, requiere muchos datos de entraînement. Alors que les approches basées sur le ML sont assez simples mais peu répandues. Pour cet article, nous utilisons une approche basée sur le ML en conjonction avec diverses techniques de vision par ordinateur dont nous discuterons plus loin dans cet article.

La technique est largement utilisée en surveillance, Sécurité, surveillance du trafic, vision robotique, communication vidéo et bien plus encore. En outre, le suivi d'objet a plusieurs cas d'utilisation, comme la foule compte, véhicules autonomes, détection facial, etc. Pouvez-vous penser à d'autres exemples où vous pouvez utiliser le suivi d'objets dans votre vie quotidienne ??

En raison de tant d'applications réelles, des recherches constantes sont menées dans ce domaine pour atteindre une plus grande précision et rendre le modèle plus robuste.

Pour cet article, nous allons utiliser ceci vidéo. Comme vous le verrez, il y a une boule rouge qui se déplace dans un labyrinthe et notre tâche est de détecter l'emplacement de la boule et de trouver son centroïde. Je pourrais aussi voir un gros bruit (désolé les gens), Contexte, pour rendre les devoirs un peu plus difficiles.

22521capture d'écran2025-6154785

1.

En premier lieu, nous importons les bibliothèques nécessaires à utiliser.

importer numpy en tant que np
importer cv2

2.

Nous allons définir une fonction qui redimensionnera les images pour qu'elles s'adaptent à notre écran au cas où elles seraient assez grandes. Cette étape est totalement facultative et vous pouvez l'ignorer.

redimensionner par défaut(img):
        retourner cv2.resize(img,(512,512)) # argument1- image d'entrée, argument- largeur_sortie, sortie_hauteur

3.

Comment saurez-vous, les vidéos sont faites de cadres. Les cadres ne sont qu'une des nombreuses images fixes qui, ensemble, constituent l'ensemble de l'image en mouvement. La prochaine étape sera de lire ces images à l'aide de la fonction VideoCapture () dans OpenCV et en utilisant la boucle while, on peut voir les images bouger. Vous pouvez ajuster la vitesse de la vidéo à l'aide de cv2.waitKey (X) qui met l'écran en pause pendant x millisecondes.

cap=cv2.Capture vidéo(chemin_fichier_vid)
droit,frame=cap.lire()

tandis que ret==Vrai:
    droit,frame=cap.lire()
    cv2.imshow("Cadre",redimensionner(Cadre))
    clé=cv2.waitKey(1)
    si clé==ord('q'):
        Pause
cv2.waitKey(0)
cv2.destroyAllWindows()

4.

OpenCV lit les images au format BGR, nous allons donc convertir l'espace colorimétrique de BGR en HSV. Pourquoi HSV et non BGR ou tout autre format?

Nous utilisons le format de couleur HSV car il est plus sensible aux changements mineurs de l'éclairage extérieur. Donc, donnera des masques plus précis et, donc, meilleurs résultats.

Après avoir converti l'espace colorimétrique, ce que nous devons faire est de filtrer le canal rouge et de créer un cadre de masque.

Le canal rouge au format hsv est présent dans [0,230,170] à [255,255,220] distance.

cap=cv2.Capture vidéo(chemin_fichier_vid)


droit,frame=cap.lire()
l_b=np.array([0,230,170])# limite inférieure du hsv pour le rouge
u_b=np.array([255,255,220])# hsv supérieur lié au rouge

tandis que ret==Vrai:
    droit,frame=cap.lire()

    hsv=cv2.cvtCouleur(Cadre,cv2.COLOR_BGR2HSV)
    masque=cv2.inRange(hsv,kg,u_b)

    cv2.imshow("Cadre",redimensionner(Cadre))

    cv2.imshow("masque",masque)


    clé=cv2.waitKey(1)
    si clé==ord('q'):
        Pause
cv2.waitKey(0)
cv2.destroyAllWindows()
68572masqué-4189669

(Cette image a été redimensionnée)

5.

Jusqu'à maintenant, nous avons créé l'image masquée du cadre et filtré la plupart du bruit. Ce qui suit est d'obtenir les limites de la balle. Pour cela nous utiliserons le concept de détection de contour. Les contours ne sont que des limites qui entoureront notre boule. Heureusement, nous n'avons pas à trouver ces limites par nous-mêmes, puisque OpenCV permet une fonction findContours () que nous pouvons utiliser à nos fins. Prend une image masquée et renvoie un tableau de contours. Pour plus d'informations sur les contours, visite moi. Idéalement, dans notre cas, la valeur des contours doit être un, puisque nous n'avons qu'une balle, mais parce que certaines personnes portaient des chapeaux rouges, nous en aurons plus d'un. Pouvez-vous penser à quelque chose pour réduire davantage ce bruit?

Pour gérer ce problème, nous utiliserons une autre fonction OpenCV qui est cv2.contourArea (). Nous savons dans l'image masquée, la balle a la plus grande surface et son contour aussi. Donc, on obtiendra le contour avec la plus grande surface.

On a les contours de la balle et on peut directement dessiner ces contours à l'aide de la fonction cv2.drawContours (). Mais pour les tâches de détection, ce que nous faisons généralement est d'utiliser un rectangle bien délimité pour montrer que l'objet a été détecté. Pour le faire, nous utiliserons la fonction cv2.boundingRect (). Cette fonction retournera les coordonnées du rectangle puis la fonction cv2.rectangle () dessinera le rectangle pour nous.

cap=cv2.Capture vidéo(chemin_fichier_vid)


droit,frame=cap.lire()
l_b=np.array([0,230,170])# limite inférieure du hsv pour le rouge
u_b=np.array([255,255,220])# hsv supérieur lié au rouge

tandis que ret==Vrai:
    droit,frame=cap.lire()

    hsv=cv2.cvtCouleur(Cadre,cv2.COLOR_BGR2HSV)
    masque=cv2.inRange(hsv,kg,u_b)

    contours,_= cv2.findContours(masque,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

    max_contour = contours[0]
         pour contour dans contours:
                si cv2.contourArea(contour)>cv2.contourArea(max_contour):

                      max_contour=contour

         contour=max_contour
         approx=cv2.approxPolyDP(contour, 0.01*cv2.arcLength(contour,Vrai),Vrai)
         X,Oui,w,h=cv2.boundingRect(environ)
         cv2.rectangle(Cadre,(X,Oui),(x+w,y+h),(0,255,0),4)

    cv2.imshow("Cadre",redimensionner(Cadre))

    cv2.imshow("masque",masque)
528745-3351114

(Cette image a été redimensionnée)

6.

En outre, ce que nous pouvons faire, c'est détecter le centroïde de la balle simultanément. Pour ça, nous utiliserons cv2.moments. cv2.moments calcule la somme moyenne pondérée des intensités de pixels dans le contour et, donc, vous permet d'obtenir des informations plus utiles du blob, comme ta radio, centre de gravité, etc. Assurez-vous de convertir l'image au format binaire avant d'utiliser la fonction. Vous pouvez en savoir plus sur les moments ici.

cap=cv2.Capture vidéo(chemin_fichier_vid)


droit,frame=cap.lire()
l_b=np.array([0,230,170])# limite inférieure du hsv pour le rouge
u_b=np.array([255,255,220])# hsv supérieur lié au rouge

tandis que ret==Vrai:
    droit,frame=cap.lire()

    hsv=cv2.cvtCouleur(Cadre,cv2.COLOR_BGR2HSV)
    masque=cv2.inRange(hsv,kg,u_b)

    contours,_= cv2.findContours(masque,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

    max_contour = contours[0]
         pour contour dans contours:


                si cv2.contourArea(contour)>cv2.contourArea(max_contour):

                  max_contour = contour

         approx=cv2.approxPolyDP(contour, 0.01*cv2.arcLength(contour,Vrai),Vrai)
         X,Oui,w,h=cv2.boundingRect(environ)
         cv2.rectangle(Cadre,(X,Oui),(x+w,y+h),(0,255,0),4)

         M=cv2.moments(contour)

cx = entier (M['M10']//MÉTRO['m00'])
cy = entier (M[« M01 »]//MÉTRO['m00'])
cv2.cercle (marc, (cx, cy), 3, (255,0,0), – 1)


    cv2.imshow("Cadre",redimensionner(Cadre))

    cv2.imshow("masque",masque)

    clé=cv2.waitKey(1)
    si clé==ord('q'):
        Pause
cv2.waitKey(0)
cv2.destroyAllWindows()
200486-8346694

(Cette image a été redimensionnée)

Où aller en partant d'ici

Dans cet article, nous avons utilisé la détection d'objets dans chaque image pour la tâche de suivi d'objets. Bien qu'il soit utile, cela peut ne pas bien fonctionner dans tous les cas. En lisant l'article, plusieurs questions peuvent avoir frappé votre cerveau. Que faire s'il y a plus d'un objet dans la vidéo? Que faire si les images de masque n'aident pas à détecter l'objet? Que faire si l'objet se déplace constamment dans et hors du cadre? Et s'il n'y a pas d'objet?

La seule façon de les trouver est de les essayer par vous-même.. Vous pouvez toujours modifier les entrées et rendre la tâche un peu plus difficile jusqu'à ce que le plaisir s'arrête.

Les médias présentés dans cet article ne sont pas la propriété de DataPeaker et sont utilisés à la discrétion de l'auteur.

Abonnez-vous à notre newsletter

Nous ne vous enverrons pas de courrier SPAM. Nous le détestons autant que vous.