2 Stimmen

Extrahieren Sie den Vordergrund aus einzelnen Frames mit OpenCV für Python

Das Problem

Ich arbeite mit einer Kamera, die alle 5 Sekunden oder so einen Schnappschuss ins Internet stellt. Die Kamera überwacht eine Menschenreihe. Ich möchte, dass mein Skript mir sagen kann, wie lang die Menschenreihe ist.

Was ich versucht habe

  • Zuerst dachte ich, dass ich dies mit BackgroundSubtractorMOG machen könnte, aber das erzeugt nur ein schwarzes Bild. Hier ist mein Code dazu, angepasst um ein Bild anstelle einer Videoaufnahme zu verwenden:

    import numpy as np
    import cv2
    
    frame = cv2.imread('sample.jpg')
    fgbg = cv2.BackgroundSubtractorMOG()
    
    fgmask = fgbg.apply(frame)
    
    cv2.imshow('frame', fgmask)
    cv2.waitKey()
  • Dann habe ich mir Vordergrundextraktion auf einem Bild angesehen, aber das ist interaktiv und passt nicht zu meinem Anwendungsfall, bei dem das Skript mir sagen soll, wie lang die Menschenreihe ist.

  • Ich habe auch versucht peopledetect.py zu verwenden, aber da das Bild der Reihe aus einer erhöhten Position stammt, erkennt dieses Skript keine Menschen.

Ich bin ganz neu in opencv, also bin ich für jede Hilfe sehr dankbar. Ich kann auf Anfrage weitere Details liefern.

Hinweis:

Ich suche nicht unbedingt nach jemandem, der das Gesamtproblem löst, sondern ich versuche nur herauszufinden, wie man die Menschen vom Hintergrund trennen kann. Allerdings bin ich offen dafür, das Problem auf eine andere Weise anzugehen, wenn Sie glauben, dass Sie eine bessere Lösung haben.

EDIT: Hier ist ein Beispielbild wie angefordert: Beispiel

6voto

Willem Ellis Punkte 4743

Ich habe es herausgefunden! @QED hat mir dabei geholfen. Grundsätzlich kann man das nicht mit nur einem Bild machen. Du brauchst MINDESTENS 2 Frames zum Vergleichen, damit der Algorithmus erkennen kann, was sich unterscheidet (Vordergrund) und was gleich ist (Hintergrund). Also habe ich 2 Frames genommen und sie durchlaufen lassen, um den Algorithmus zu "trainieren". Hier ist mein Code:

import numpy as np
import cv2

i = 1
while(1):
  fgbg = cv2.BackgroundSubtractorMOG()
  while(i < 3):
    print 'img' + `i` + '.jpg'
    frame = cv2.imread('img' + `i` + '.jpg')

    fgmask = fgbg.apply(frame)

    cv2.imshow('frame', fgmask)
    i += 1

    k = cv2.waitKey(30) & 0xff
    if k == 27:
        break

  cv2.destroyAllWindows()

Und hier ist das Ergebnis von 2 aufeinanderfolgenden Bildern!

Bildbeschreibung hier eingeben

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X