¿Qué necesito?

  • Cualquier servidor dedicado o virtual
  • Ubuntu
  • OpenCV
  • pitón

¿Qué es una resta de fondo?

La sustracción de fondo es un paso de preprocesamiento importante en muchas aplicaciones basadas en imágenes. Por ejemplo, considere casos como un contador de visitantes donde una cámara estática registra el número de visitantes que entran o salen de la habitación, una cámara de tráfico que extrae información sobre los vehículos, etc. En todos estos casos, debe identificar a la persona o los vehículos. solo primero. Técnicamente, necesitas extraer el primer plano en movimiento del fondo estático.

Si solo tiene una imagen del fondo, p. Ej. Por ejemplo, una foto de la habitación sin visitas, una foto de la calle sin vehículos, etc., esta es una tarea sencilla. Simplemente retire la nueva imagen del fondo. Obtienes los objetos de primer plano solo. Pero en la mayoría de los casos, es posible que no tenga una imagen de este tipo, por lo que debemos extraer el fondo de todas las imágenes que tenemos. Se vuelve más complicado cuando hay una sombra en los vehículos. Dado que la sombra también se mueve, también se marca como primer plano mediante una simple resta. Complica las cosas. Sin embargo, se han desarrollado e implementado varios algoritmos excelentes para este propósito. OpenCV ha implementado varios de estos algoritmos que son muy fáciles de usar.

  1. FondoSustractorMOG

Es un algoritmo de segmentación de fondo / primer plano basado en una mezcla gaussiana. Fue introducido en 2001 por P. KadewTrKuPong y R. Bowden en un artículo titulado “Un modelo de mezcla de fondo adaptable mejorado para el seguimiento en tiempo real con detección de sombras”. Utiliza un método para modelar cada píxel de fondo mediante una mezcla de distribuciones K gaussianas (K = 3 a 5). Los pesos de la mezcla representan las proporciones de tiempo que estos colores permanecen en la escena. Los colores de fondo probables permanecen más tiempo y son más estáticos.

Al codificar, debe utilizar la función cv2.bgsegm.createBackgroundSubtractorMOG () para crear un objeto de fondo. Tiene algunos parámetros opcionales como la longitud del gradiente, el número de mezclas gaussianas, el valor de umbral, etc. También se establece en los valores predeterminados. Luego, dentro del bucle de video, use el método backgroundsubtractor.apply () para obtener la máscara de primer plano.

backgroundSubtractorMOG.py

import numpy as np
import cv2

cap = cv2.VideoCapture('hollywood-people-walking-around.mp4')

fgbg = cv2.bgsegm.createBackgroundSubtractorMOG()

while(1):
ret, frame = cap.read()

fgmask = fgbg.apply(frame)

cv2.imshow('frame',fgmask)
k = cv2.waitKey(30) & 0xff
if k == 27:
break

cap.release()
cv2.destroyAllWindows()
  1. FondoSustractorMOG2

También es un algoritmo de segmentación de fondo / primer plano basado en una mezcla gaussiana. Esto se basa en dos publicaciones de Zivkovic, “Modelo mixto gausiano adaptativo mejorado para la resta de fondo” en 2004 y “Estimación de densidad adaptativa eficiente por píxel de imagen para la tarea de resta de fondo” en 2006 selecciona el número apropiado de distribuciones gaussianas para cada píxel. Recuerda que en el último caso usaste una distribución K-Gaussiana a través del algoritmo. Ofrece una mejor adaptabilidad a diferentes escenas debido a cambios de iluminación, etc.

Como en el caso anterior, debe crear un objeto sustractor de fondo. Aquí puede elegir si se deben reconocer o no las sombras. Si DetectShadows = Cierto, detecta y marca sombras, pero ralentiza. Las sombras están marcadas en gris.

backgroundSubtractorMOG2

import numpy as np
import cv2cap = cv2.VideoCapture('hollywood-people-walking-around.mp4')fgbg = cv2.createBackgroundSubtractorMOG2()

while(1):
ret, frame = cap.read()

fgmask = fgbg.apply(frame)

cv2.imshow('frame',fgmask)
k = cv2.waitKey(30) & 0xff
if k == 27:
break

cap.release()
cv2.destroyAllWindows()
  1. De FondoSustractorGMG

Este algoritmo es realmente genial porque es capaz de detectar y distinguir sombras. Combina la estimación estadística de la imagen de fondo y la segmentación bayesiana por píxel. Fue presentado en 2012 por Andrew B. Godbehere, Akihiro Matsukawa, Ken Goldberg en su artículo “Seguimiento visual de visitantes humanos bajo condiciones de iluminación variable para una instalación de arte de audio sensible”. Instalación titulada ‘¿Ya llegamos?’ 31 de marzo al 31 de julio de 2011 en el Contemporary Jewish Museum de San Francisco, California.

Utiliza los primeros 120 fotogramas para el modelado de fondo de forma predeterminada. Utiliza un algoritmo probabilístico de segmentación en primer plano que identifica posibles objetos en primer plano mediante inferencia bayesiana. Las estimaciones son adaptativas, las observaciones más nuevas se ponderan más que las observaciones anteriores para tener en cuenta la iluminación variable. Se realizan varias operaciones de filtrado morfológico como cierre y apertura para eliminar ruidos no deseados, etc. Durante los primeros fotogramas obtendrá una ventana negra. Es preferible abrir morfológicamente el resultado para eliminar el ruido.

fondoSustractorGMG

import numpy as np
import cv2cap = cv2.VideoCapture('hollywood-people-walking-around.mp4')

kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(3,3))
fgbg = cv2.bgsegm.createBackgroundSubtractorGMG()

while(1):
ret, frame = cap.read()

fgmask = fgbg.apply(frame)
fgmask = cv2.morphologyEx(fgmask, cv2.MORPH_OPEN, kernel)

cv2.imshow('frame',fgmask)
k = cv2.waitKey(30) & 0xff
if k == 27:
break

cap.release()
cv2.destroyAllWindows()

VIDEO ORIGINAL

Cómo eliminar el fondo en un video usando OpenCV
Cómo eliminar el fondo en un video usando OpenCV

GATITO

Cómo eliminar el fondo en un video usando OpenCVCómo eliminar el fondo en un video usando OpenCV

MOG 2

Cómo eliminar el fondo en un video usando OpenCVCómo eliminar el fondo en un video usando OpenCV

Conclusión

Con esta técnica, es posible crear aplicaciones que puedan separar con éxito los elementos de primer plano y de fondo. OpenCV ha madurado mucho en los últimos años y ahora incluye más de 6 algoritmos de segmentación de fondo diferentes de forma predeterminada. Asegúrese de echar un vistazo a los scripts de Python incluidos en esta guía. Si desea probar sus propios videos con los scripts, simplemente cambie cv2.VideoCapture (‘your-video-name.mp4’) para que coincida con el nombre del video que desea editar.

python3 backgroundSubtractorMOG.py
python3 backgroundSubtractorMOG2.py
python3 backgroundSubtractorGMG.py

Descargar scripts y videos de substracter de fondo