La sustracción de fondo es una de las principales tareas de procesamiento de imágenes. Se utiliza en varias aplicaciones de procesamiento de imágenes como segmentación de imágenes, detección de objetos, etc. OpenCV nos proporciona 3 tipos de algoritmos de sustracción de fondo:-
- FondoSubtractorMOG
- FondoSubtractorMOG2
- FondoSubtractorGMG
Normalmente, podemos realizar la sustracción de fondo usando la sustracción de array, es decir, simplemente sustrayendo el cuadro estático del video. Pero esto tiene muchos inconvenientes. Es un algoritmo muy menos eficiente para la sustracción de fondo porque no se actualiza solo. Este problema está siendo manejado por los algoritmos de sustracción de fondo proporcionados por OpenCV.
Uso de BackgroundSubtractorMOG
Para usar BackgroundSubtractorMOG podemos usar
cv2.bgsegm.createBackgroundSubtractorMOG()
Luego podemos aplicarlo usando el método «aplicar» en cada cuadro del video. Considere el siguiente ejemplo para una mejor comprensión del tema.
Ejemplo:
import numpy as np import cv2 cap = cv2.VideoCapture('sample.mp4') # initializing subtractor fgbg = cv2.bgsegm.createBackgroundSubtractorMOG() while(1): ret, frame = cap.read() # applying on each frame fgmask = fgbg.apply(frame) cv2.imshow('frame', fgmask) k = cv2.waitKey(30) & 0xff if k == 27: break cap.release() cv2.destroyAllWindows()
Producción :
Usando BackgroundSubtractorMOG2
En el sustractor anterior funcionaba bastante bien pero en situaciones del mundo real, también hay presencia de sombras. En BackgroundSubtractorMOG2, también podemos detectar sombras y en la salida del siguiente código, se ve claramente. Para aplicar BackgroundSubtractorMOG2, utilice
cv2.createBackgroundSubtractorMOG2()
Ejemplo:
import numpy as np import cv2 cap = cv2.VideoCapture('sample.mp4') # initializing subtractor fgbg = cv2.createBackgroundSubtractorMOG2() while(1): ret, frame = cap.read() # applying on each frame fgmask = fgbg.apply(frame) cv2.imshow('frame', fgmask) k = cv2.waitKey(30) & 0xff if k == 27: break cap.release() cv2.destroyAllWindows()
Producción :
Usando BackgroundSubtractorGMG
Este algoritmo combina la estimación estadística de la imagen de fondo y la segmentación bayesiana por píxel. Emplea un algoritmo de segmentación de primer plano probabilístico que identifica posibles objetos de primer plano mediante la inferencia bayesiana. Para usar BackgroundSubtractorGMG, use
cv2.bgsegm.createBackgroundSubtractorGMG()
Nota: obtendremos una ventana negra durante los primeros fotogramas.
import numpy as np import cv2 cap = cv2.VideoCapture('sample.mp4') kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3)) # initializing subtractor fgbg = cv2.bgsegm.createBackgroundSubtractorGMG() while(1): ret, frame = cap.read() # applying on each frame 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()
Producción :
Publicación traducida automáticamente
Artículo escrito por ayushmankumar7 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA