Detector de movimiento WebCam en Python

Este programa de Python le permitirá detectar movimiento y también almacenar el intervalo de tiempo del movimiento.

Requisito: 

  1. Python3
  2. OpenCV (bibliotecas)
  3. Pandas (bibliotecas)

Requisitos de instalación: instale Python3 , instale las bibliotecas Pandas y OpenCV .

Lógica principal: los videos se pueden tratar como una pila de imágenes llamadas marcos. Aquí estoy comparando diferentes fotogramas (imágenes) con el primer fotograma que debería ser estático (inicialmente sin movimientos). Comparamos dos imágenes comparando el valor de intensidad de cada píxel. En python podemos hacerlo fácilmente como puedes ver en el siguiente código:

Python3

# Python program to implement 
# Webcam Motion Detector
  
# importing OpenCV, time and Pandas library
import cv2, time, pandas
# importing datetime class from datetime library
from datetime import datetime
  
# Assigning our static_back to None
static_back = None
  
# List when any moving object appear
motion_list = [ None, None ]
  
# Time of movement
time = []
  
# Initializing DataFrame, one column is start 
# time and other column is end time
df = pandas.DataFrame(columns = ["Start", "End"])
  
# Capturing video
video = cv2.VideoCapture(0)
  
# Infinite while loop to treat stack of image as video
while True:
    # Reading frame(image) from video
    check, frame = video.read()
  
    # Initializing motion = 0(no motion)
    motion = 0
  
    # Converting color image to gray_scale image
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
  
    # Converting gray scale image to GaussianBlur 
    # so that change can be find easily
    gray = cv2.GaussianBlur(gray, (21, 21), 0)
  
    # In first iteration we assign the value 
    # of static_back to our first frame
    if static_back is None:
        static_back = gray
        continue
  
    # Difference between static background 
    # and current frame(which is GaussianBlur)
    diff_frame = cv2.absdiff(static_back, gray)
  
    # If change in between static background and
    # current frame is greater than 30 it will show white color(255)
    thresh_frame = cv2.threshold(diff_frame, 30, 255, cv2.THRESH_BINARY)[1]
    thresh_frame = cv2.dilate(thresh_frame, None, iterations = 2)
  
    # Finding contour of moving object
    cnts,_ = cv2.findContours(thresh_frame.copy(), 
                       cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
  
    for contour in cnts:
        if cv2.contourArea(contour) < 10000:
            continue
        motion = 1
  
        (x, y, w, h) = cv2.boundingRect(contour)
        # making green rectangle around the moving object
        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 3)
  
    # Appending status of motion
    motion_list.append(motion)
  
    motion_list = motion_list[-2:]
  
    # Appending Start time of motion
    if motion_list[-1] == 1 and motion_list[-2] == 0:
        time.append(datetime.now())
  
    # Appending End time of motion
    if motion_list[-1] == 0 and motion_list[-2] == 1:
        time.append(datetime.now())
  
    # Displaying image in gray_scale
    cv2.imshow("Gray Frame", gray)
  
    # Displaying the difference in currentframe to
    # the staticframe(very first_frame)
    cv2.imshow("Difference Frame", diff_frame)
  
    # Displaying the black and white image in which if
    # intensity difference greater than 30 it will appear white
    cv2.imshow("Threshold Frame", thresh_frame)
  
    # Displaying color frame with contour of motion of object
    cv2.imshow("Color Frame", frame)
  
    key = cv2.waitKey(1)
    # if q entered whole process will stop
    if key == ord('q'):
        # if something is movingthen it append the end time of movement
        if motion == 1:
            time.append(datetime.now())
        break
  
# Appending time of motion in DataFrame
for i in range(0, len(time), 2):
    df = df.append({"Start":time[i], "End":time[i + 1]}, ignore_index = True)
  
# Creating a CSV file in which time of movements will be saved
df.to_csv("Time_of_movements.csv")
  
video.release()
  
# Destroying all the windows
cv2.destroyAllWindows()

Análisis de todas las ventanas 
Después de ejecutar el código, aparecerán 4 nuevas ventanas en la pantalla. Vamos a analizarlo uno por uno: 

1. Marco gris: en el marco gris, la imagen está un poco borrosa y en escala de grises lo hicimos porque, en las imágenes grises solo hay un valor de intensidad, mientras que en la imagen RGB (rojo, verde y azul) hay tres valores de intensidad. Entonces sería fácil calcular la diferencia de intensidad en escala de grises. 
 

2. Cuadro de diferencia: el cuadro de diferencia muestra la diferencia de intensidades del primer cuadro con el cuadro actual. 

3. Marco de umbral: si la diferencia de intensidad para un píxel en particular es superior a 30 (en mi caso), ese píxel será blanco y si la diferencia es inferior a 30, ese píxel será negro. 

4. Marco de color: en este marco, puede ver las imágenes en color en un marco de color junto con el contorno verde alrededor de los objetos en movimiento. 

Tiempo Registro de movimientos

El archivo Time_of_movements se almacenará en la carpeta donde se almacena su archivo de código. Este archivo tendrá la extensión csv. En este archivo se registrará la hora de inicio del movimiento y la hora de finalización del movimiento. Como se puede ver en la imagen:  

Demostración en vídeo 

Publicación traducida automáticamente

Artículo escrito por ujjwal sharma 1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *