Sustracción de fondo – OpenCV

La sustracción de fondo es una forma de eliminar el fondo de la imagen. Para lograr esto, extraemos el primer plano en movimiento del fondo estático.

La sustracción de fondo tiene varios casos de uso en la vida cotidiana. Se utiliza para la segmentación de objetos, la mejora de la seguridad, el seguimiento de peatones, el recuento del número de visitantes, el número de vehículos en el tráfico, etc. Es capaz de aprender e identificar la máscara de primer plano.

En OpenCV tenemos 3 algoritmos para hacer esta operación –

BackgroundSubtractorMOG: es un algoritmo de segmentación de fondo/primer plano basado en una mezcla gaussiana.

BackgroundSubtractorMOG2: también es un algoritmo de segmentación de fondo/primer plano basado en una mezcla gaussiana. Proporciona una mejor adaptabilidad a diferentes escenas debido a cambios de iluminación, etc.

BackgroundSubtractorGMG: este algoritmo combina la estimación estadística de la imagen de fondo y la segmentación bayesiana por píxel.

Cómo aplicar las funciones integradas de OpenCV para la resta de fondo –
Paso n. ° 1: cree un objeto para indicar el algoritmo que estamos usando para la resta de fondo.
Paso #2 – Aplicar backgroundsubtractor.apply()la función en la imagen.

A continuación se muestra la implementación de Python para la sustracción de fondo:

# importing libraries
import numpy as np
import cv2
  
# creating object
fgbg1 = cv2.bgsegm.createBackgroundSubtractorMOG();   
fgbg2 = cv2.createBackgroundSubtractorMOG2();
fgbg3 = cv2.bgsegm.createBackgroundSubtractorGMG();
  
# capture frames from a camera 
cap = cv2.VideoCapture(0);
while(1):
    # read frames
    ret, img = cap.read();
      
    # apply mask for background subtraction
    fgmask1 = fgbg1.apply(img);
    fgmask2 = fgbg2.apply(img);
    fgmask3 = fgbg3.apply(img);
      
    cv2.imshow('Original', img);
    cv2.imshow('MOG', fgmask1);
    cv2.imshow('MOG2', fgmask2);
    cv2.imshow('GMG', fgmask3);
    k = cv2.waitKey(30) & 0xff;
    if k == 27:
        break;
  
cap.release();
cv2.destroyAllWindows();

Producción:

Podemos ver que hay mucho ruido en la imagen resultante para BackgroundSubtractorGMG, por lo que siempre se prefiere usar la transformación morfológica del resultado para eliminar los ruidos.

# importing libraries
import numpy as np
import cv2
  
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3));
  
# creating object
fgbg = cv2.bgsegm.createBackgroundSubtractorGMG();
  
# capture frames from a camera 
cap = cv2.VideoCapture(0);
while(1):
    # read frames
    ret, img = cap.read();
      
    # apply mask for background subtraction
    fgmask = fgbg.apply(img);
      
    # with noise frame
    cv2.imshow('GMG noise', fgmask);
      
    # apply transformation to remove noise
    fgmask = cv2.morphologyEx(fgmask, cv2.MORPH_OPEN, kernel);
      
    # after removing noise
    cv2.imshow('GMG', fgmask);
      
    k = cv2.waitKey(30) & 0xff;
    if k == 27:
        break;
  
cap.release();
cv2.destroyAllWindows();

Producción:

Publicación traducida automáticamente

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