So entfernen Sie den Hintergrund in einem Video mit OpenCV

Was brauche ich?

  • Jeder dedizierte oder virtuelle Server
  • Ubuntu
  • OpenCV
  • Python

Was ist eine Hintergrundsubtraktion?

Die Hintergrundsubtraktion ist in vielen visionbasierten Anwendungen ein wichtiger Vorverarbeitungsschritt. Betrachten Sie beispielsweise Fälle wie einen Besucherschalter, bei dem eine statische Kamera die Anzahl der Besucher erfasst, die den Raum betreten oder verlassen, oder eine Verkehrskamera, die Informationen über die Fahrzeuge usw. extrahiert. In all diesen Fällen müssen Sie zunächst die Person oder Person extrahieren Fahrzeuge allein. Technisch gesehen müssen Sie den bewegten Vordergrund aus dem statischen Hintergrund extrahieren.

Wenn Sie nur ein Bild des Hintergrunds haben, beispielsweise ein Bild des Raums ohne Besucher, ein Bild der Straße ohne Fahrzeuge usw., ist das eine einfache Aufgabe. Subtrahieren Sie einfach das neue Bild vom Hintergrund. Sie erhalten nur die Vordergrundobjekte. Aber in den meisten Fällen verfügen Sie möglicherweise nicht über ein solches Bild, daher müssen wir den Hintergrund aus den Bildern extrahieren, die wir haben. Komplizierter wird es, wenn die Fahrzeuge einen Schatten haben. Da sich auch der Schatten bewegt, wird er durch einfache Subtraktion ebenfalls als Vordergrund markiert. Es verkompliziert die Dinge. Zu diesem Zweck wurden jedoch mehrere fantastische Algorithmen entwickelt und eingeführt. OpenCV hat eine Reihe dieser Algorithmen implementiert, die sehr einfach zu verwenden sind.

  1. HintergrundSubtractorMOG

Es handelt sich um einen auf einer Gaußschen Mischung basierenden Hintergrund-/Vordergrund-Segmentierungsalgorithmus. Es wurde 2001 von P. KadewTrKuPong und R. Bowden in einem Artikel mit dem Titel „ Ein verbessertes adaptives Hintergrundmischungsmodell für Echtzeitverfolgung mit Schattenerkennung “ vorgestellt. Es verwendet eine Methode, um jedes Hintergrundpixel durch eine Mischung aus K Gaußschen Verteilungen (K = 3 bis 5) zu modellieren. Die Gewichte der Mischung stellen die Zeitanteile dar, in denen diese Farben in der Szene verbleiben. Die wahrscheinlichen Hintergrundfarben bleiben länger erhalten und sind statischer.

Beim Codieren müssen Sie mithilfe der Funktion cv2.bgsegm.createBackgroundSubtractorMOG() ein Hintergrundobjekt erstellen . Es verfügt über einige optionale Parameter, wie z. B. Verlaufslänge, Anzahl der Gaußschen Mischungen, Schwellenwert usw. Es ist außerdem auf Standardwerte eingestellt. Verwenden Sie dann innerhalb der Videoschleife die Methode „backgroundsubtractor.apply()“,  um die Vordergrundmaske abzurufen.

HintergrundSubtractorMOG.py

importieren

 Numpy

als

 np

importieren

 Lebenslauf 2

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

fgbg = cv2.bgsegm.createBackgroundSubtractorMOG()

während

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

fgmask = fgbg.apply(frame)

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

Wenn

 k == 27:

brechen

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

Es handelt sich außerdem um einen auf einer Gaußschen Mischung basierenden Hintergrund-/Vordergrund-Segmentierungsalgorithmus. Dies basiert auf zwei Veröffentlichungen von Z. Zivkovic, „ Improved adaptive Gausian mixe model for background subtraction “ aus dem Jahr 2004 und „ Efficient Adaptive Density Estimation per Image Pixel for the Task of Background Subtraction “ aus dem Jahr 2006. Ein wichtiges Merkmal dieses Algorithmus ist, dass er wählt die entsprechende Anzahl von Gaußschen Verteilungen für jedes Pixel aus. Denken Sie daran, dass Sie im letzten Fall im gesamten Algorithmus eine K-Gauß-Verteilung verwendet haben. Es bietet eine bessere Anpassungsfähigkeit an unterschiedliche Szenen aufgrund von Beleuchtungsänderungen usw.

Wie im vorherigen Fall müssen Sie ein Hintergrundsubtrahiererobjekt erstellen. Hier haben Sie die Möglichkeit auszuwählen, ob Schatten erkannt werden sollen oder nicht. Wenn discoverShadows = True ist, werden Schatten erkannt und markiert, die Geschwindigkeit wird jedoch verringert. Schatten werden in grauer Farbe markiert.

HintergrundSubtractorMOG2

importieren

 Numpy

als

 np

importieren

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

während

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

fgmask = fgbg.apply(frame)

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

Wenn

 k == 27:

brechen

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

Dieser Algorithmus ist wirklich großartig, weil er Schatten erkennen und unterscheiden kann. Es kombiniert statistische Hintergrundbildschätzung und pixelweise Bayes’sche Segmentierung. Es wurde 2012 von Andrew B. Godbehere, Akihiro Matsukawa und Ken Goldberg in ihrer Arbeit „ Visual Tracking of Human Visitors under Variable-Lighting Conditions for a Responsive Audio Art Installation “ vorgestellt. Laut der Arbeit führte das System eine erfolgreiche interaktive Audiokunst aus Installation mit dem Titel „ Are We There Yet?“ ‘ vom 31. März bis 31. Juli 2011 im Contemporary Jewish Museum in San Francisco, Kalifornien.

Standardmäßig werden die ersten 120 Frames für die Hintergrundmodellierung verwendet. Es verwendet einen probabilistischen Vordergrundsegmentierungsalgorithmus, der mögliche Vordergrundobjekte mithilfe der Bayes’schen Inferenz identifiziert. Die Schätzungen sind adaptiv, neuere Beobachtungen werden stärker gewichtet als alte Beobachtungen, um variable Beleuchtungsverhältnisse zu berücksichtigen. Mehrere morphologische Filtervorgänge wie Schließen und Öffnen werden durchgeführt, um unerwünschtes Rauschen usw. zu entfernen. Während der ersten paar Frames wird ein schwarzes Fenster angezeigt. Es ist vorzuziehen, das Ergebnis morphologisch zu öffnen, um das Rauschen zu entfernen.

HintergrundSubtractorGMG

importieren

 Numpy

als

 np

importieren

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

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

während

(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

Wenn

 k == 27:

brechen

cap.release()
cv2.destroyAllWindows()

ORIGINALVIDEO

So entfernen Sie den Hintergrund in einem Video mit OpenCV So entfernen Sie den Hintergrund in einem Video mit OpenCV

MOG

So entfernen Sie den Hintergrund in einem Video mit OpenCV So entfernen Sie den Hintergrund in einem Video mit OpenCV

MOG 2

So entfernen Sie den Hintergrund in einem Video mit OpenCV So entfernen Sie den Hintergrund in einem Video mit OpenCV

 

Abschluss

Mit dieser Technik ist es möglich, mit der Erstellung von Anwendungen zu beginnen, die Vorder- und Hintergrundelemente erfolgreich trennen können. OpenCV ist in den letzten Jahren stark ausgereift und umfasst nun standardmäßig über 6 verschiedene Hintergrundsegmentierungsalgorithmen. Schauen Sie sich unbedingt die in dieser Anleitung enthaltenen Python-Skripte an. Wenn Sie Ihre eigenen Videos mit den Skripten ausprobieren möchten, ändern Sie einfach cv2.VideoCapture(‘your-video-name.mp4’) so, dass es mit dem Namen des Videos übereinstimmt, das Sie verarbeiten möchten.

Python3-HintergrundSubtractorMOG.py
Python3-HintergrundSubtractorMOG2.py
Python3-HintergrundSubtractorGMG.py

Laden Sie Hintergrund-Subtrahierer-Skripte und Videos herunter

  • Möchten Sie Probleme beim Shared Hosting vermeiden? Klicken Sie hier und erfahren Sie mehr über das beste Hosting für dedizierte Server .