2015-09-07 6 views
6

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:

  1. history non è davvero 1/alpha come afferma il codice sorgente. Ma allora: cos'è? come influenza l'algoritmo?

  2. history è davvero 1/alpha, ma c'è un bug nel wrapper Java che rende il valore history 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++).

risposta

3

Sembra chiaro che alpha = 1/history (ad eccezione di alcuni istanti transitori). Nel vuoto BackgroundSubtractorMOG2Impl::apply metodo:

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

È possibile verificare se l'oggetto BackgroundSubtractorMOG2 sta usando il valore storico che si passa nel costruttore con il metodo getHistory().

+0

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

+0

Quel 'min' significa che nel primo fotogramma sta usando' alpha = 0.5', poi lentamente scendendo a 'alpha = 1/history'. Interessante. – natario