Sono su OpenCV per java (ma non è rilevante, immagino). Sto usando la classe BackgroundSubtractorMOG2
che è (scarsamente) referenziata here. Ho letto e capito il documento di Zivkovic sull'algoritmo che puoi trovare here.Qual è il significato di "cronologia" all'interno di BackgroundSubtractorMOG2?
BackgroundSubtractorMOG2
prende nel suo costruttore un parametro chiamato history
. Cos'è e in che modo influenza il risultato? Potresti indicarmi il riferimento all'interno del foglio, ad esempio?
Da class source code, riga 106, si dice che alpha = 1/history
. Ciò significherebbe che la cronologia è precisamente il parametro T all'interno della carta, cioè (più o meno) il numero di fotogrammi che costituiscono il set di allenamento.
Tuttavia non sembra così. La modifica del valore nel costruttore, da 10 a 500 o oltre, ha nessun effetto sul risultato finale. Questo è quello che sto chiamando:
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
Non importa ciò che la storia ho impostato, sia esso 5, 10, 500, 1000 - il risultato è sempre lo stesso. Considerando che, se cambio il valore alpha
(il tasso di apprendimento) attraverso apply()
, posso vedere la sua reale influenza:
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);
Se cambio alpha qui, risultato cambia molto, il che è comprensibile. Così, due congetture:
history
non è davvero1/alpha
come afferma il codice sorgente. Ma allora: cos'è? come influenza l'algoritmo?history
è davvero1/alpha
, ma c'è un bug nel wrapper Java che rende il valorehistory
impostato nel costruttore inutile.
Potrebbe aiutarmi?
(Tagging C++ anche come questa è principalmente una domanda su una classe OpenCV e l'intero framework Java di OpenCV è solo un wrapper su C++).
Questo è quello che avevo capito, ma i miei test sono contrari, come ho dimostrato - cambiare la storia non cambia il risultato. Vedendo la tua linea, forse è perché '2 * nframes
natario
Quel 'min' significa che nel primo fotogramma sta usando' alpha = 0.5', poi lentamente scendendo a 'alpha = 1/history'. Interessante. – natario