2015-09-07 2 views
6

Ich bin auf OpenCV für Java (aber das ist nicht relevant, denke ich). Ich verwende die BackgroundSubtractorMOG2 Klasse, die (schlecht) here verwiesen wird. Ich habe das Zivkovic-Papier über den Algorithmus gelesen und verstanden, den Sie finden können here.Was bedeutet "Geschichte" in BackgroundSubtractorMOG2?

BackgroundSubtractorMOG2 nimmt in seinem Konstruktor einen Parameter history genannt. Was ist das und wie beeinflusst es das Ergebnis? Könnten Sie mich bitte auf die Referenz in der Zeitung hinweisen?

Von den class source code, Linie 106, so heißt es, dass alpha = 1/history. Das würde bedeuten, dass die Geschichte nämlich der T-Parameter innerhalb des Papiers ist, d. H. (Mehr oder weniger) die Anzahl der Rahmen, die den Trainingssatz bilden.

Allerdings scheint es nicht so. Ändern des Werts im Konstruktor von 10 auf 500 oder darüber hinaus hat keinen Effekt auf das Endergebnis. Dies ist, was ich rufe:

Mat result = new Mat(); 
int history = 10; //or 50, or 500, or whatever 
BackgroundSubtractorMOG2 sub = new BackgroundSubtractorMOG2(history, 16, false); 
for (....) { 
    sub.apply(frame[i], result); 
} 
imshow(result); //let's see last frame 

Es spielt keine Rolle, was die Geschichte Ich habe, sei es 5, 10, 500, 1000 - das Ergebnis ist immer das gleiche. Während, wenn ich den alpha Wert (die Lernrate) durch apply() ändern, kann ich seine wirklichen Einfluss sehen:

Mat result = new Mat(); 
float alpha = 0.1; //learning rate, 1/T (1/history?) 
BackgroundSubtractorMOG2 sub = new BackgroundSubtractorMOG2(whatever, 16, false); 
for (...) { 
    sub.apply(frame[i], result, alpha); 
} 
imshow(result); 

Wenn ich alpha ändern, Ergebnis ändert sich viel, was verständlich ist. Also, zwei Vermutungen:

  1. history ist nicht wirklich 1/alpha als die Quellcode Staaten. Aber dann: Was ist das? Wie beeinflusst es den Algorithmus?

  2. history ist wirklich 1/alpha, aber es ist ein Fehler in der Java-Wrapper, der die history Wert, den Sie im Konstruktor nutzlos gesetzt macht.

Können Sie mir helfen?

(Tagging C++ auch als dies in erster Linie eine Frage zu einer OpenCV-Klasse und die gesamten Java-Framework OpenCV ist nur ein Wrapper um C++).

Antwort

3

Es scheint klar, dass alpha = 1/history (mit Ausnahme einiger vorübergehender Zeitpunkte). In Leerer BackgroundSubtractorMOG2Impl::apply Methode:

learningRate = learningRate >= 0 && nframes > 1 ? learningRate : 1./std::min(2*nframes, history); 

Sie können testen, ob das Objekt BackgroundSubtractorMOG2 die Geschichte Wert verwendet, die Sie in dem Konstruktor übergeben die getHistory() Methode.

+0

Das ist, was ich verstanden habe, aber meine Tests sind gegen, wie ich gezeigt habe - ändernde Geschichte ändert das Ergebnis nicht. Wenn Sie Ihre Zeile sehen, liegt das vielleicht daran, dass '2 * nframes natario

+0

Das 'min' bedeutet, dass es im ersten Frame' alpha = 0.5' verwendet und dann langsam auf 'alpha = 1/history' geht. Interessant. – natario