2015-09-07 3 views
6

मैं जावा के लिए OpenCV पर हूँ (लेकिन यह प्रासंगिक नहीं है मुझे लगता है कि)। मैं BackgroundSubtractorMOG2 कक्षा का उपयोग कर रहा हूं जो कि (खराब) संदर्भित है here। मैंने एल्गोरिदम के बारे में ज़िकोकोविक पेपर को पढ़ और समझ लिया है जिसे आप here पा सकते हैं।BackgroundSubtractorMOG2 के अंदर "इतिहास" का अर्थ क्या है?

BackgroundSubtractorMOG2 इसके निर्माता एक पैरामीटर history कहा जाता है में ले जाता है। यह क्या है, और यह परिणाम को कैसे प्रभावित करता है? क्या आप मुझे कागज के अंदर इसके संदर्भ में इंगित कर सकते हैं, उदाहरण के लिए?

class source code से, लाइन 106, यह उस alpha = 1/history कहा जाता है। इसका मतलब यह होगा कि इतिहास पेपर के अंदर टी पैरामीटर है, यानी (अधिक या कम) प्रशिक्षण सेट का निर्माण करने वाले फ्रेम की संख्या।

हालांकि यह इतना प्रतीत नहीं होता। 10 से 500 करने के लिए या परे, निर्माता के मान में बदलाव, अंतिम परिणाम पर कोई प्रभाव नहीं है । यह मैं क्या फोन कर रहा हूँ है:

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 

इससे कोई फर्क नहीं पड़ता कि इतिहास मैं निर्धारित करते हैं, हो सकता है यह 5, 10, 500, 1000 - परिणाम हमेशा एक ही है।

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); 

अगर मैं यहाँ अल्फा बदलने के लिए, परिणाम एक बहुत है, जो समझा जा सकता है परिवर्तन: जबकि, अगर मैं apply() के माध्यम से alpha मूल्य (सीखने की दर) बदलने के लिए, मैं अपनी असली प्रभाव देख सकते हैं। तो, दो अनुमान:

  1. history वास्तव में 1/alpha स्रोत कोड राज्यों के रूप में नहीं है। लेकिन फिर: यह क्या है? यह एल्गोरिदम को कैसे प्रभावित करता है?

  2. history वास्तव में 1/alpha है, लेकिन जावा आवरण आप निर्माता बेकार में सेट history मूल्य बनाता है में एक बग है।

क्या आप मेरी मदद कर सकते हैं?

(टैगिंग सी ++ भी मुख्य रूप से ओपनसीवी कक्षा के बारे में एक प्रश्न है और पूरे ओपनसीवी जावा फ्रेमवर्क सी ++ के आसपास सिर्फ एक रैपर है)

उत्तर

3

यह स्पष्ट लगता है कि alpha = 1/history (कुछ अस्थायी instants को छोड़कर)। शून्य BackgroundSubtractorMOG2Impl::apply विधि में:

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

अगर BackgroundSubtractorMOG2 वस्तु इतिहास मूल्य है कि आप getHistory() पद्धति का उपयोग करके निर्माता में पारित उपयोग कर रहा है परीक्षण कर सकते हैं।

+0

यही वह है जो मैंने समझा था, लेकिन मेरे परीक्षणों के खिलाफ हैं, जैसा कि मैंने दिखाया है - बदलते इतिहास परिणाम को नहीं बदलता है। अपनी लाइन देखकर, शायद ऐसा इसलिए है क्योंकि '2 * nframes natario

+0

कि 'min' का अर्थ है कि पहले फ्रेम में यह 'अल्फा = 0.5' का उपयोग कर रहा है, फिर धीरे-धीरे' अल्फा = 1/इतिहास' पर जा रहा है। दिलचस्प। – natario

संबंधित मुद्दे