2011-10-14 14 views
7

मैं पृष्ठभूमि औसत विधि को कार्यान्वित करना चाहता हूं। मेरे पास एक सेकंड में ली गई छवियों के 50 फ्रेम हैं और कुछ फ्रेम में बिजली है जिसमें मैं अग्रभूमि के रूप में निकालना चाहता हूं। फ्रेम को एक स्थिर कैमरे से लिया जाता है और फ्रेम ग्रेस्केल के रूप में लिया जाता है। मुझे क्या करना चाहते हैं:ओपनसीवी (सी ++) में पृष्ठभूमि घटाव

  1. , पृष्ठभूमि मॉडल
  2. के बाद प्राप्त निर्धारित करने के लिए है कि फ्रेम या नहीं में प्रकाश व्यवस्था है कि क्या वहाँ पृष्ठभूमि मॉडल के लिए प्रत्येक फ्रेम की तुलना करें।

मैंने कुछ दस्तावेज पढ़े हैं कि सीवीएसीसी() का उपयोग करके यह कैसे किया जा सकता है लेकिन यह समझने में कठिनाई हो रही है कि यह कैसे किया जा सकता है। मैं कोड के एक टुकड़े की सराहना करता हूं जो मुझे मार्गदर्शन करता है और दस्तावेजों के लिंक जो मुझे समझने में मदद कर सकता है कि मैं इसे कैसे कार्यान्वित कर सकता हूं।

अग्रिम धन्यवाद।

उत्तर

18

हमारे पास हमारी परियोजनाओं में से एक ही कार्य था।

पृष्ठभूमि मॉडल प्राप्त करने के लिए, हम बस एक वर्ग पृष्ठभूमि मॉडल बनाते हैं, पहले (कैप्चर करें) 50 फ्रेम कैप्चर करते हैं और पृष्ठभूमि मॉडल में पिक्सेल त्रुटियों से बचने के लिए औसत फ्रेम की गणना करते हैं।

उदाहरण के लिए, यदि आपको अपने कैमरे से 8-बिट ग्रेस्केल छवि (सीवी_8 यूसी 1) मिलती है, तो आप क्लिपिंग से बचने के लिए अपने मॉडल को CV_16UC1 से प्रारंभ करते हैं।

cv::Mat model = cv::Mat(HEIGHT, WIDTH, CV_16UC1, cv::Scalar(0)); 

अब, अपने मॉडल की गणना सिर्फ मॉडल के लिए हर फ्रेम जोड़ सकते हैं और प्राप्त तख्ते की राशि की गणना करने के पहले फ्रेम के लिए इंतजार कर।

void addFrame(cv::Mat frame) { 
    cv::Mat convertedFrame; 
    frame.convertTo(convertedFrame, CV_16UC1); 
    cv::add(convertedFrame, model, model); 
    if (++learnedFrames >= FRAMES_TO_LEAN) { // FRAMES_TO_LEARN = 50 
     createMask(); 
    } 
} 

createMask() फ़ंक्शन उस औसत फ्रेम की गणना करता है जिसका हम मॉडल के लिए उपयोग करते हैं।

void createMask() { 
    cv::convertScaleAbs(model, mask, 1.0/learnedFrames); 
    mask.convertTo(mask, CV_8UC1); 
} 

अब, आप पृष्ठभूमि फ्रेम मॉडल के माध्यम से फ़ंक्शन सबट्रैक्ट() में सभी फ़्रेम भेजते हैं। यदि परिणाम एक खाली सीवी :: मैट है, तो मुखौटा अभी भी गणना की जाती है। अन्यथा, आप एक घटाया फ्रेम मिलता है।

cv::Mat subtract(cv::Mat frame) { 
    cv::Mat result; 
    if (++learnedFrames >= FRAMES_TO_LEAN) { // FRAMES_TO_LEARN = 50 
     cv::subtract(frame, mask, result); 
    } 
    else { 
     addFrame(frame); 
    } 
    return result; 
} 

इतना ही नहीं बल्कि, आप पिक्सेल योग की गणना और अगर यह इस पर रोशनी के साथ एक फ्रेम है तय करने के लिए अदिश राशि (स्थिरांक चटाई & MTX) उपयोग कर सकते हैं।

+0

आपको बहुत अधिक पिंग (",) – user854576

+3

@ user854576 यदि यह सही उत्तर है, तो आपको अच्छा होना चाहिए और इसे स्वीकार करना चाहिए। [यह पृष्ठ] देखें (http://stackoverflow.com/faq#howtoask) अकसर किये गए सवाल जवाब कैसे स्वीकार करें। –

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