Comment effectuer une détection de mouvement à l’aide de Python

Comment effectuer une détection de mouvement à l'aide de Python
Source: gfycat

Aperçu

La détection de mouvement à l’aide de Python est facile grâce aux multiples bibliothèques open source fournies par le langage de programmation Python. La détection de mouvement a de nombreuses applications dans le monde réel. Par exemple, il peut être utilisé pour la surveillance des examens en ligne ou à des fins de sécurité dans les magasins, les banques, etc.

Le langage de programmation Python est un langage riche en bibliothèque open source qui fournit une pléthore d’applications à son utilisateur et compte un certain nombre d’utilisateurs. Ainsi, il se développe rapidement sur le marché. Il n’y a pas de fin à la liste des avantages du langage Python en raison de sa syntaxe simple, de ses erreurs faciles à trouver et de son processus de débogage rapide qui le rend plus convivial.

Pourquoi devriez-vous apprendre Python ? une représentation picturale :

Comment effectuer une détection de mouvement à l'aide de Python
Source : Sujets de mise à l’échelle

Python a été conçu en 1991 et il est développé par la Python Software Foundation. Il existe de nombreuses versions de python qui sont publiées. Parmi eux, python2 et python3 sont les plus célèbres. Actuellement, python3 est principalement utilisé et les utilisateurs de python3 augmentent rapidement. Dans ce projet ou script, nous allons utiliser python3.

Selon la physique, lorsqu’un objet est immobile et n’a pas de vitesse, il est alors considéré comme au repos, et c’est exactement le contraire lorsqu’un objet n’est pas au repos complet et a un mouvement ou une vitesse dans une direction, soit à gauche. droite, avant-arrière ou haut-bas, il est alors considéré comme étant en mouvement. Dans cet article, nous allons essayer de le détecter.

Comment effectuer une détection de mouvement à l'aide de Python
Source: gtycat

La détection de mouvement a de nombreuses implémentations ou utilisations réelles où elle peut prouver sa valeur, comme pour la surveillance des examens en ligne à l’aide d’une webcam (que nous allons implémenter dans cet article), en tant qu’agent de sécurité, etc.

Dans cet article, nous essaierons d’implémenter un script à travers lequel nous détecterons le mouvement à l’aide de la Web-Camera de l’ordinateur de bureau ou de l’ordinateur portable. L’idée est que nous allons prendre deux images des vidéos et essayer de trouver des différences entre elles. S’il y a une sorte de différence entre les deux images, il est clair qu’il y a une sorte de mouvement d’un objet devant la caméra, ce qui crée la différence.

Avant de commencer l’implémentation du code, examinons certains des modules ou bibliothèques que nous utiliserons via notre code pour la détection de mouvement avec une webcam. Comme nous avons discuté des bibliothèques jouent un rôle important dans la renommée de python, examinons ce dont nous avons besoin :

  1. OpenCV
  2. Pandas

Les deux bibliothèques mentionnées ci-dessus, OpenCV et Pandas, sont des bibliothèques purement basées sur Python, gratuites et open source et nous allons les utiliser avec la version Python3 du langage de programmation Python.

1. OpenCV

OpenCV est une bibliothèque open-source qui peut être utilisée avec de nombreux langages de programmation comme C++, Python, etc. Il est utilisé pour travailler sur les images et les vidéos et en l’utilisant ou en l’intégrant aux bibliothèques panda/NumPy de python, nous pouvons tirer le meilleur parti des fonctionnalités OpenCV.

2. Panda :

Comme nous en avons discuté, “pandas” est une bibliothèque open-source de Python et fournit de riches outils intégrés pour l’analyse des données grâce à laquelle il est largement utilisé dans le flux de la science des données et de l’analyse des données. Nous disposons de trames de données sous la forme d’une structure de données dans les pandas qui est utile pour manipuler et stocker des données tabulaires dans une structure de données bidimensionnelle.

Les deux modules décrits ci-dessus ne sont pas intégrés à Python et nous devons d’abord les installer avant de les utiliser. En dehors de cela, il y a deux autres modules que nous allons utiliser dans notre projet.

  1. Module Python DateHeure
  2. Module de temps Python

Ces deux modules sont intégrés en python et il n’est pas nécessaire de les installer ultérieurement. Ces modules traitent respectivement des fonctions liées à la date et à l’heure.

Jusqu’à présent, nous avons vu les bibliothèques que nous allons utiliser dans notre code, commençons son implémentation avec l’idée que la vidéo n’est qu’une combinaison de plusieurs images ou cadres statiques et que tous ces cadres combinés créent une vidéo :

Importation des bibliothèques requises

Dans cette section, nous allons importer toutes les bibliothèques, comme pandas et panda. Ensuite, nous importons les fonctions cv2, time et DateTime du module DateTime.

# Importing the Pandas libraries  
import pandas as panda  

# Importing the OpenCV libraries  
import cv2  

# Importing the time module  
import time  

# Importing the datetime function of the datetime module  
from datetime import datetime 

Initialisation de nos variables de données

Dans cette section, nous avons initialisé certaines de nos variables que nous allons utiliser plus loin dans le code. Nous définissons l’état initial comme “Aucun” et allons stocker le mouvement suivi dans une autre variable motionTrackList.

Nous avons défini une liste ‘motionTime’ pour stocker l’heure à laquelle le mouvement est repéré et initialisé la liste dataFrame à l’aide du module panda.

# Assigning our initial state in the form of variable initialState as None for initial frames  
initialState = None  

# List of all the tracks when there is any detected of motion in the frames  
motionTrackList= [ None, None ]  

# A new list ‘time’ for storing the time when movement detected  
motionTime = []  

# Initialising DataFrame variable ‘dataFrame’ using pandas libraries panda with Initial and Final column  
dataFrame = panda.DataFrame(columns = ["Initial", "Final"])  

Processus de capture principal

Dans cette section, nous allons effectuer nos principales étapes de détection de mouvement. Comprenons-les par étapes:

  1. Tout d’abord, nous allons commencer à capturer la vidéo à l’aide du module cv2 et la stocker dans la variable video.
  2. Ensuite, nous utiliserons une boucle while infinie pour capturer chaque image de la vidéo.
  3. Nous utiliserons la méthode read() pour lire chaque image et les stocker dans des variables respectives.
  4. Nous avons défini un mouvement variable et l’avons initialisé à zéro.
  5. Nous avons créé deux autres variables grayImage et grayFrame en utilisant les fonctions cv2 cvtColor et GaussianBlur pour trouver les changements dans le mouvement.
  6. Si notre initialState est None, nous attribuons le grayFrame actuel à initialState sinon et arrêtons le processus suivant en utilisant le mot-clé ‘continue’.
  7. Dans la section suivante, nous avons calculé la différence entre les cadres initiaux et en niveaux de gris que nous avons créés dans l’itération actuelle.
  8. Ensuite, nous mettrons en évidence les changements entre les images initiales et actuelles à l’aide des fonctions de seuil et de dilatation cv2.
  9. Nous trouverons les contours de l’objet en mouvement dans l’image ou le cadre actuel et indiquerons l’objet en mouvement en créant une limite verte autour de lui à l’aide de la fonction rectangle.
  10. Après cela, nous ajouterons notre motionTrackList en y ajoutant l’élément actuellement détecté.
  11. Nous avons affiché tous les cadres comme les niveaux de gris et les cadres d’origine, etc., en utilisant la méthode imshow.
  12. De plus, nous avons créé une clé en utilisant la méthode witkey() du module cv2 pour terminer le processus, et nous pouvons terminer notre processus en utilisant la clé ‘m’.
# starting the webCam to capture the video using cv2 module  
video = cv2.VideoCapture(0)  

# using infinite loop to capture the frames from the video 
while True:  

   # Reading each image or frame from the video using read function 

   check, cur_frame = video.read()  

   

   # Defining 'motion' variable equal to zero as initial frame 

   var_motion = 0  

   

   # From colour images creating a gray frame 

   gray_image = cv2.cvtColor(cur_frame, cv2.COLOR_BGR2GRAY)  

   

   # To find the changes creating a GaussianBlur from the gray scale image  

   gray_frame = cv2.GaussianBlur(gray_image, (21, 21), 0)  

   

   # For the first iteration checking the condition

   # we will assign grayFrame to initalState if is none  

   if initialState is None:  

       initialState = gray_frame  

       continue  

       

   # Calculation of difference between static or initial and gray frame we created  

   differ_frame = cv2.absdiff(initialState, gray_frame)  

   

   # the change between static or initial background and current gray frame are highlighted 

   

   thresh_frame = cv2.threshold(differ_frame, 30, 255, cv2.THRESH_BINARY)[1]  

   thresh_frame = cv2.dilate(thresh_frame, None, iterations = 2)  

   

   # For the moving object in the frame finding the coutours 

   cont,_ = cv2.findContours(thresh_frame.copy(),   

                      cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)  

   

   for cur in cont:  

       if cv2.contourArea(cur) < 10000:  

           continue  

       var_motion = 1  

       (cur_x, cur_y,cur_w, cur_h) = cv2.boundingRect(cur)  

       

       # To create a rectangle of green color around the moving object  

       cv2.rectangle(cur_frame, (cur_x, cur_y), (cur_x + cur_w, cur_y + cur_h), (0, 255, 0), 3)  

       

  # from the frame adding the motion status   

   motionTrackList.append(var_motion)  

   motionTrackList = motionTrackList[-2:]  

   

   # Adding the Start time of the motion 

   if motionTrackList[-1] == 1 and motionTrackList[-2] == 0:  

       motionTime.append(datetime.now())  

       

  # Adding the End time of the motion 

   if motionTrackList[-1] == 0 and motionTrackList[-2] == 1:  

       motionTime.append(datetime.now())  

       

  # In the gray scale displaying the captured image 

   cv2.imshow("The image captured in the Gray Frame is shown below: ", gray_frame)  

   

   # To display the difference between inital static frame and the current frame 

   cv2.imshow("Difference between the  inital static frame and the current frame: ", differ_frame)  

   

   # To display on the frame screen the black and white images from the video  

   cv2.imshow("Threshold Frame created from the PC or Laptop Webcam is: ", thresh_frame)  

   

   # Through the colour frame displaying the contour of the object

   cv2.imshow("From the PC or Laptop webcam, this is one example of the Colour Frame:", cur_frame)  

   

   # Creating a key to wait  

   wait_key = cv2.waitKey(1)  

   

   # With the help of the 'm' key ending the whole process of our system   

   if wait_key == ord('m'):  

       # adding the motion variable value to motiontime list when something is moving on the screen  

       if var_motion == 1:  

           motionTime.append(datetime.now())  

       break 

Finir le code

Après avoir fermé la boucle, nous ajouterons nos données des listes dataFrame et motionTime dans le fichier CSV et enfin éteindrons la vidéo.

# At last we are adding the time of motion or var_motion inside the data frame  
for a in range(0, len(motionTime), 2):  

   dataFrame = dataFrame.append({"Initial" : time[a], "Final" : motionTime[a + 1]}, ignore_index = True)  

   
# To record all the movements, creating a CSV file  
dataFrame.to_csv("EachMovement.csv")  

# Releasing the video   
video.release()  

# Now, Closing or destroying all the open windows with the help of openCV  
cv2.destroyAllWindows()

Nous avons créé le code ; maintenant, discutons à nouveau du processus en bref.

Tout d'abord, nous avons capturé une vidéo à l'aide de la webcam de notre appareil, puis avons pris l'image initiale de la vidéo d'entrée comme référence et avons vérifié les images suivantes de temps en temps. Si une image différente de la première a été trouvée, le mouvement était présent. Cela sera marqué dans le rectangle vert.

Nous avons vu le code dans différentes sections. Maintenant, combinons-le :

# Importing the Pandas libraries  
import pandas as panda  

# Importing the OpenCV libraries  
import cv2  

# Importing the time module  
import time  

# Importing the datetime function of the datetime module  
from datetime import datetime 

# Assigning our initial state in the form of variable initialState as None for initial frames  
initialState = None  

# List of all the tracks when there is any detected of motion in the frames  
motionTrackList= [ None, None ]  

# A new list 'time' for storing the time when movement detected  
motionTime = []  

# Initialising DataFrame variable 'dataFrame' using pandas libraries panda with Initial and Final column  
dataFrame = panda.DataFrame(columns = ["Initial", "Final"])

# starting the webCam to capture the video using cv2 module  
video = cv2.VideoCapture(0)  

# using infinite loop to capture the frames from the video 
while True:  

   # Reading each image or frame from the video using read function 

   check, cur_frame = video.read()  

   

   # Defining 'motion' variable equal to zero as initial frame 

   var_motion = 0  

   

   # From colour images creating a gray frame 

   gray_image = cv2.cvtColor(cur_frame, cv2.COLOR_BGR2GRAY)  

   

   # To find the changes creating a GaussianBlur from the gray scale image  

   gray_frame = cv2.GaussianBlur(gray_image, (21, 21), 0)  

   

   # For the first iteration checking the condition

   # we will assign grayFrame to initalState if is none  

   if initialState is None:  

       initialState = gray_frame  

       continue  

       

   # Calculation of difference between static or initial and gray frame we created  

   differ_frame = cv2.absdiff(initialState, gray_frame)  

   

   # the change between static or initial background and current gray frame are highlighted 

   

   thresh_frame = cv2.threshold(differ_frame, 30, 255, cv2.THRESH_BINARY)[1]  

   thresh_frame = cv2.dilate(thresh_frame, None, iterations = 2)  

   

   # For the moving object in the frame finding the coutours 

   cont,_ = cv2.findContours(thresh_frame.copy(),   

                      cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)  

   

   for cur in cont:  

       if cv2.contourArea(cur) < 10000:  

           continue  

       var_motion = 1  

       (cur_x, cur_y,cur_w, cur_h) = cv2.boundingRect(cur)  

       

       # To create a rectangle of green color around the moving object  

       cv2.rectangle(cur_frame, (cur_x, cur_y), (cur_x + cur_w, cur_y + cur_h), (0, 255, 0), 3)  

       

  # from the frame adding the motion status   

   motionTrackList.append(var_motion)  

   motionTrackList = motionTrackList[-2:]  

   

   # Adding the Start time of the motion 

   if motionTrackList[-1] == 1 and motionTrackList[-2] == 0:  

       motionTime.append(datetime.now())  

       

  # Adding the End time of the motion 

   if motionTrackList[-1] == 0 and motionTrackList[-2] == 1:  

       motionTime.append(datetime.now())  

       

  # In the gray scale displaying the captured image 

   cv2.imshow("The image captured in the Gray Frame is shown below: ", gray_frame)  

   

   # To display the difference between inital static frame and the current frame 

   cv2.imshow("Difference between the  inital static frame and the current frame: ", differ_frame)  

   

   # To display on the frame screen the black and white images from the video  

   cv2.imshow("Threshold Frame created from the PC or Laptop Webcam is: ", thresh_frame)  

   

   # Through the colour frame displaying the contour of the object

   cv2.imshow("From the PC or Laptop webcam, this is one example of the Colour Frame:", cur_frame)  

   

   # Creating a key to wait  

   wait_key = cv2.waitKey(1)  

   

   # With the help of the 'm' key ending the whole process of our system   

   if wait_key == ord('m'):  

       # adding the motion variable value to motiontime list when something is moving on the screen  

       if var_motion == 1:  

           motionTime.append(datetime.now())  

       break 

# At last we are adding the time of motion or var_motion inside the data frame  
for a in range(0, len(motionTime), 2):  

   dataFrame = dataFrame.append({"Initial" : time[a], "Final" : motionTime[a + 1]}, ignore_index = True)  

   
# To record all the movements, creating a CSV file  
dataFrame.to_csv("EachMovement.csv")  

# Releasing the video   
video.release()  

# Now, Closing or destroying all the open windows with the help of openCV  
cv2.destroyAllWindows()

Les résultats obtenus après l'exécution du code ci-dessus seraient similaires à ce que l'on peut voir ci-dessous.

Comment effectuer une détection de mouvement à l'aide de Python

Ici, nous pouvons voir que le mouvement de l'homme dans la vidéo a été suivi. Ainsi, la sortie peut être vue en conséquence.

Cependant, dans ce code, le suivi se ferait à l'aide de cases rectangulaires autour d'objets en mouvement, similaires à ce que l'on peut voir ci-dessous. Une chose intéressante à noter ici est que la vidéo est une séquence de caméra de sécurité sur laquelle une détection a été effectuée.

Comment effectuer une détection de mouvement à l'aide de Python

  • Le langage de programmation Python est un langage riche en bibliothèque open source qui fournit un certain nombre d'applications à son utilisateur.
  • Lorsqu'un objet est immobile et n'a pas de vitesse, il est considéré comme au repos, et c'est tout le contraire lorsqu'un objet n'est pas au repos complet, alors il est considéré comme en mouvement.
  • OpenCV est une bibliothèque open-source qui peut être utilisée avec de nombreux langages de programmation, et en l'intégrant aux bibliothèques panda/NumPy de python, nous pouvons tirer le meilleur parti des fonctionnalités OpenCV.
  • L'idée principale est que chaque vidéo n'est qu'une combinaison de nombreuses images statiques appelées cadres, et une différence entre les cadres est utilisée pour la détection

Vaishnavi Amira Yada est un rédacteur de contenu technique. Elle a des connaissances en Python, Java, DSA, C, etc. Elle s'est retrouvée dans l'écriture et elle a adoré ça.

Leave a Comment