Com realitzar la detecció de moviment amb Python


Font: gfycat

Visió general

La detecció de moviment amb Python és fàcil a causa de les múltiples biblioteques de codi obert que ofereix el llenguatge de programació Python. La detecció de moviment té moltes aplicacions al món real. Per exemple, es pot utilitzar per a la vigilància en exàmens en línia o amb finalitats de seguretat a botigues, bancs, etc.

El llenguatge de programació Python és un llenguatge ric en biblioteques de codi obert que proporciona una gran quantitat d’aplicacions al seu usuari i té diversos usuaris. Per tant, està creixent ràpidament al mercat. La llista d’avantatges del llenguatge Python no té fi a causa de la seva simple sintaxi, errors fàcils de trobar i procés de depuració ràpid que el fa més fàcil d’utilitzar.

Per què hauríeu d’aprendre Python? una representació pictòrica:

Com realitzar la detecció de moviment amb Python
Font: Scaler Topics

Python va ser dissenyat l’any 1991 i està desenvolupat per la Python Software Foundation. Hi ha moltes versions de Python que es publiquen. D’ells, python2 i python3 són els més famosos. Actualment, python3 s’utilitza principalment i els usuaris de python3 augmenten ràpidament. En aquest projecte o script, farem servir python3.

Segons la Física, quan un objecte està immòbil i no té velocitat, llavors es considera que està en repòs, i tot el contrari és quan un objecte no està en repòs complet i té algun moviment o velocitat en alguna direcció, ja sigui a l’esquerra. dreta, endavant-enrere o amunt-baix llavors es considera que està en moviment. En aquest article, intentarem detectar-ho.

Com realitzar la detecció de moviment amb Python
Font: gtycat

La detecció de moviment té moltes implementacions o usos de la vida real on pot demostrar la seva validesa, com per exemple per a la vigilància d’exàmens en línia mitjançant una càmera web (que implementarem en aquest article), com a guàrdia de seguretat, etc.

En aquest article, intentarem implementar un script mitjançant el qual detectarem moviment mitjançant la Web-Camera de l’escriptori o portàtil. La idea és que agafarem dos fotogrames dels vídeos i intentarem trobar diferències entre ells. Si hi ha algun tipus de diferència entre els dos fotogrames, és clar que hi ha algun tipus de moviment d’un objecte davant de la càmera, que crea la diferència.

Abans de començar la implementació del codi, mirem alguns dels mòduls o biblioteques que utilitzarem a través del nostre codi per a la detecció de moviment amb una càmera web. Com hem comentat que les biblioteques tenen un paper important en la fama de Python, mirem què necessitem:

  1. OpenCV
  2. Pandes

Les dues biblioteques esmentades anteriorment, OpenCV i Pandas són biblioteques purament basades en Python, gratuïtes i de codi obert i les farem servir amb la versió Python3 del llenguatge de programació Python.

1.OpenCV

OpenCV és una biblioteca de codi obert que es pot utilitzar amb molts llenguatges de programació com C++, Python, etc. S’utilitza per treballar les imatges i els vídeos i mitjançant l’ús o la integració amb les biblioteques panda/NumPy de Python podem fer el millor ús de les funcions d’OpenCV.

2. Pandes:

Com hem comentat, “pandas” és una biblioteca de codi obert de Python i proporciona riques eines integrades per a l’anàlisi de dades, per la qual cosa s’utilitza àmpliament en el flux de ciència de dades i anàlisi de dades. Ens proporcionen marcs de dades en forma d’estructura de dades en pandas que són útils per manipular i emmagatzemar dades tabulars en una estructura de dades bidimensional.

Els dos mòduls comentats anteriorment no estan integrats en Python i els hem d’instal·lar abans d’utilitzar-los. A part d’això, hi ha dos mòduls més que utilitzarem en el nostre projecte.

  1. Mòdul Python DateTime
  2. Python TimeModule

Tots dos mòduls estan integrats en Python i no cal instal·lar-los més tard. Aquests mòduls tracten les funcions relacionades amb la data i l’hora respectivament.

Fins ara hem vist les biblioteques que farem servir en el nostre codi, comencem la seva implementació amb la idea que el vídeo és només una combinació de moltes imatges estàtiques o fotogrames i tots aquests fotogrames combinats crea un vídeo:

Importació de les biblioteques necessàries

En aquesta secció, importarem totes les biblioteques, com ara panda i panda. A continuació, importem la funció cv2, time i DateTime des del mòdul 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 

Inicialització de les nostres variables de dades

En aquesta secció, hem inicialitzat algunes de les nostres variables que utilitzarem més al codi. Definim l’estat inicial com “Cap” i emmagatzemarem el moviment seguit en una altra variable motionTrackList.

Hem definit una llista “motionTime” per emmagatzemar l’hora en què es detecta el moviment i la llista dataFrame inicialitzada mitjançant el mòdul del 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"])  

Procés de captura principal

En aquesta secció realitzarem els nostres passos principals de detecció de moviment. Entenem-los per passos:

  1. Primer, començarem a capturar vídeo mitjançant el mòdul cv2 i emmagatzemar-lo a la variable de vídeo.
  2. A continuació, utilitzarem un bucle while infinit per capturar cada fotograma del vídeo.
  3. Utilitzarem el mètode read() per llegir cada fotograma i emmagatzemar-los en les variables respectives.
  4. Hem definit un moviment variable i l’hem inicialitzat a zero.
  5. Hem creat dues variables més grayImage i grayFrame utilitzant les funcions cv2 cvtColor i GaussianBlur per trobar els canvis en el moviment.
  6. Si el nostre initialState és None, assignem el grayFrame actual a initialState en cas contrari i aturem el següent procés mitjançant la paraula clau “continua”.
  7. A la següent secció, vam calcular la diferència entre els fotogrames inicials i en escala de grisos que vam crear a la iteració actual.
  8. A continuació, destacarem els canvis entre els fotogrames inicial i actual mitjançant les funcions de llindar i dilatació cv2.
  9. Trobarem els contorns de l’objecte en moviment a la imatge o marc actual i indicarem l’objecte en moviment creant un límit verd al seu voltant mitjançant la funció de rectangle.
  10. Després d’això, afegirem la nostra motionTrackList afegint-hi l’element detectat actual.
  11. Hem mostrat tots els fotogrames com l’escala de grisos i els fotogrames originals, etc., mitjançant el mètode imshow.
  12. A més, hem creat una clau mitjançant el mètode witkey() del mòdul cv2 per finalitzar el procés, i podem acabar el nostre procés utilitzant la clau ‘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 

Acabar el codi

Després de tancar el bucle, afegirem les nostres dades del dataFrame i les llistes de motionTime al fitxer CSV i finalment desactivarem el vídeo.

# 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()

Hem creat el codi; ara tornem a parlar breument del procés.

Primer, vam capturar un vídeo mitjançant la càmera web del nostre dispositiu, després vam prendre el fotograma inicial del vídeo d'entrada com a referència i vam comprovar els fotogrames següents de tant en tant. Si es trobava un fotograma diferent del primer, hi havia moviment. Això estarà marcat al rectangle verd.

Hem vist el codi en diferents apartats. Ara, combinem-ho:

# 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()

Els resultats obtinguts després de l'execució del codi anterior serien similars al que es pot veure a continuació.

Com realitzar la detecció de moviment amb Python

Aquí, podem veure que el moviment de l'home al vídeo ha estat rastrejat. Així, la sortida es pot veure en conseqüència.

Tanmateix, en aquest codi, el seguiment es faria amb l'ajuda de caixes rectangulars al voltant d'objectes en moviment, de manera similar al que es pot veure a continuació. Una cosa interessant a destacar aquí és que el vídeo és una imatge de la càmera de seguretat en què s'ha fet la detecció.

Com realitzar la detecció de moviment amb Python

  • El llenguatge de programació Python és un llenguatge ric en biblioteques de codi obert que proporciona diverses aplicacions al seu usuari.
  • Quan un objecte està immòbil i no té velocitat, es considera que està en repòs, i tot el contrari és quan un objecte no està en repòs complet es considera que està en moviment.
  • OpenCV és una biblioteca de codi obert que es pot utilitzar amb molts llenguatges de programació i, integrant-la amb les biblioteques panda/NumPy de Python, podem fer el millor ús de les funcions d'OpenCV.
  • La idea principal és que cada vídeo és només una combinació de moltes imatges estàtiques anomenades fotogrames, i s'utilitza una diferència entre els fotogrames per a la detecció.

Vaishnavi Amira Yada és un escriptor de contingut tècnic. Té coneixements de Python, Java, DSA, C, etc. Es va trobar escrivint i li va encantar.

Leave a Comment

Your email address will not be published. Required fields are marked *