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:
history
ist nicht wirklich1/alpha
als die Quellcode Staaten. Aber dann: Was ist das? Wie beeinflusst es den Algorithmus?history
ist wirklich1/alpha
, aber es ist ein Fehler in der Java-Wrapper, der diehistory
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++).
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
Das 'min' bedeutet, dass es im ersten Frame' alpha = 0.5' verwendet und dann langsam auf 'alpha = 1/history' geht. Interessant. – natario