Resta de fondo en una imagen usando el concepto de promedio móvil

La sustracción de fondo es una técnica para separar los elementos de primer plano del fondo y se realiza generando una máscara de primer plano. Esta técnica se utiliza para detectar objetos en movimiento dinámico desde cámaras estáticas. La técnica de sustracción de fondo es importante para el seguimiento de objetos. Hay varias técnicas para la sustracción de fondo.

En este artículo, discutimos el concepto de promedio móvil . El promedio móvil de una función se usa para separar el primer plano del fondo. En este concepto, la secuencia de video se analiza en un conjunto particular de fotogramas. Durante esta secuencia de fotogramas, se calcula el promedio móvil sobre el fotograma actual y los fotogramas anteriores. Esto nos da el modelo de fondo y cualquier objeto nuevo introducido durante la secuenciación del video se convierte en parte del primer plano. Luego, el marco actual contiene el objeto recién introducido con el fondo. Luego se realiza el cálculo de la diferencia absoluta entre el modelo de fondo (que es una función del tiempo) y el marco actual (que es un objeto recién introducido). El promedio móvil se calcula usando la ecuación dada a continuación:

                    dst(x, y) = (1-alpha).dst(x, y) + alpha.src(x, y)

Requisitos previos:

  • Una cámara web que funcione o un módulo de cámara para la entrada.
  • Descargue la versión Python 3.x, Numpy y OpenCV 2.7.x. Compruebe si su sistema operativo es compatible con 32 bits o 64 bits e instálelo en consecuencia.
  • Verifique el estado de ejecución de numpy y OpenCV

¿Cómo funciona el método del promedio móvil?

El objetivo del programa es detectar objetos activos a partir de la diferencia obtenida del marco de referencia y el marco actual. Seguimos alimentando cada fotograma a la función dada, y la función sigue encontrando los promedios de todos los fotogramas. Luego calculamos la diferencia absoluta entre los marcos.
La función utilizada es cv2.accumulateWeighted() .


cv2.accumulateWeighted(src, dst, alpha)

Los parámetros pasados ​​en esta función son:

  1. src : la imagen de origen. La imagen puede ser una imagen en color o en escala de grises y un punto flotante de 8 bits o de 32 bits.
  2. dst : El acumulador o la imagen de destino. Es un punto flotante de 32 bits o de 64 bits.
    NOTA: Debe tener los mismos canales que la imagen de origen. Además, el valor de dst debe declararse previamente inicialmente.
  3. alpha : Peso de la imagen de entrada. Alpha decide la velocidad de actualización. Si establece un valor más bajo para esta variable, el promedio móvil se realizará sobre una mayor cantidad de fotogramas anteriores y viceversa.

Código:

# Python program to illustrate
# Background subtraction using
# concept of Running Averages
  
# organize imports
import cv2
import numpy as np
  
# capture frames from a camera
cap = cv2.VideoCapture(0)
  
# read the frames from the camera
_, img = cap.read()
  
# modify the data type
# setting to 32-bit floating point
averageValue1 = np.float32(img)
  
# loop runs if capturing has been initialized. 
while(1):
    # reads frames from a camera 
    _, img = cap.read()
      
    # using the cv2.accumulateWeighted() function
    # that updates the running average
    cv2.accumulateWeighted(img, averageValue1, 0.02)
      
    # converting the matrix elements to absolute values 
    # and converting the result to 8-bit. 
    resultingFrames1 = cv2.convertScaleAbs(averageValue1)
  
    # Show two output windows
    # the input / original frames window
    cv2.imshow('InputWindow', img)
  
    # the window showing output of alpha value 0.02
    cv2.imshow('averageValue1', resultingFrames1)
      
    # Wait for Esc key to stop the program 
    k = cv2.waitKey(30) & 0xff
    if k == 27: 
        break
  
# Close the window 
cap.release() 
    
# De-allocate any associated memory usage 
cv2.destroyAllWindows()

Producción :

Como podemos ver claramente a continuación, la mano bloquea la vista de fondo.

Ahora, agitamos el objeto de primer plano, es decir, nuestra mano. Empezamos a agitar nuestra mano.

El promedio móvil muestra el fondo claramente debajo, el promedio móvil con alfa 0.02 lo ha captado como una mano transparente, con énfasis principal en el fondo.

Alternativamente, podemos usar cv.RunningAvg() para la misma tarea con los parámetros que tienen el mismo significado que los parámetros de cv2.accumulateweighted().


cv.RunningAvg(image, acc, alpha)

Referencias :

  1. https://docs.opencv.org/2.4/modules/imgproc/doc/motion_analysis_and_object_tracking.html
  2. https://en.wikipedia.org/wiki/Foreground_detection
  3. https://docs.opencv.org/3.2.0/d1/dc5/tutorial_background_subtraction.html

Publicación traducida automáticamente

Artículo escrito por rishabhsingh1304 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 *