2014-09-06 12 views
5

Ich habe versucht, BackgroundSubtractorMOG zu verwenden, um den Hintergrund zu entfernen, aber einige Objekte haben den Rahmen bereits verlassen, aber das Ergebnis von BackgroundSubtractorMOG.apply() zeigt immer noch an, dass das Objekt immer noch auf dem Szene.BackgroundSubtractorMOG behält das Objekt, nachdem es den Rahmen verlassen hat

Hier ist mein Code

inputVideo = cv2.VideoCapture('input.avi') 
fgbg = cv2.BackgroundSubtractorMOG() 

while inputVideo.isOpened(): 
    retVal, frame = inputVideo.read() 

    fgmask = fgbg.apply(frame) 

    cv2.imshow('Foreground', fgmask) 
    cv2.imshow('Original', frame) 
    if cv2.waitKey(1) & 0xFF == 27: 
     break 

ich auch BackgroundSubtractorMOG mit benutzerdefinierten Parametern (Geschichte = 200, nmixtures = 5, Verhältnis = 0,8), aber Ergebnis ist das gleiche versucht haben. Habe ich etwas falsch gemacht oder irgendwelche Empfehlungen? Bitte helfen Sie.

+0

ich das gleiche Problem. Der Protokollparameter wird scheinbar ignoriert. Die Verwendung von zwei verschiedenen Werten erzeugt genau das gleiche Bild. Ich denke, der History-Parameter ist standardmäßig auf 0 gesetzt, was bedeutet, dass das ursprüngliche Hintergrundbild das einzige verwendete Bild ist und der Algorithmus niemals lernt. – RussellStewart

Antwort

8

Das Problem ist in fgbg.apply. Aus irgendeinem Grund ist learningRate auf 0 eingestellt. Machen Sie wie folgt aufrufen:

history = 10 # or whatever you want it to be 

fgmask = fgbg.apply(frame, learningRate=1.0/history) 

Credit Sebastian Ramirez gehen sollte, die ein Ticket in opencv gestartet und fand die Lösung

+0

Vielen Dank für den Kommentar, es hilft mir. – Arsen