परिचय
मैंने इस लेख को " बड़े पैमाने पर समानांतर छवि स्थिरीकरण " पढ़ने के बाद लिखने का फैसला किया, जो पीटीजेड कैमरों से छवि स्थिरीकरण के लिए एक एल्गोरिदम का वर्णन करता है। तथ्य यह है कि एक समय में मैंने स्थिर कैमरों से छवियों को स्थिर करने के लिए एक एल्गोरिथ्म लागू किया था, जिसका उपयोग मैजिकबॉक्स आईपी वीडियो सर्वर और सिनेसिस कंपनी के कुछ अन्य उत्पादों में किया जाता है , जो मैं वर्तमान में काम करता हूं। एल्गोरिथ्म अपनी गति विशेषताओं के मामले में काफी सफल रहा। विशेष रूप से, यह पृष्ठभूमि के सापेक्ष वर्तमान छवि के विस्थापन को खोजने के लिए एक एल्गोरिथ्म को बहुत प्रभावी ढंग से लागू करता है। इस दक्षता ने वस्तुओं को ट्रैक करने के लिए, साथ ही साथ उनकी गतिहीनता की जांच के लिए अपने मुख्य तत्वों (कुछ संशोधनों के साथ) का उपयोग करना संभव बना दिया।
स्थिरीकरण एल्गोरिथ्म में निम्नलिखित मुख्य तत्व शामिल हैं: वर्तमान फ्रेम के लिए एक ऑफसेट का पता लगाना, इस ऑफसेट के लिए क्षतिपूर्ति करना, और समय-समय पर उस पृष्ठभूमि को अपडेट करना जिसके खिलाफ स्थिरीकरण होता है। नीचे मैं उनमें से प्रत्येक का विस्तार करूंगा।
अंजीर। 1 छवि स्थिरीकरण कभी-कभी बहुत उपयोगी होता है।
वर्तमान फ्रेम ऑफ़सेट डिटेक्शन
मूल दृष्टिकोण, जिस पर पूर्वाग्रह का निर्धारण करने के लिए सहसंबंध दृष्टिकोण आधारित है, को संक्षेप में निम्नानुसार वर्णित किया जा सकता है:
1) पृष्ठभूमि छवि का मध्य भाग लिया जाता है। इंडेंटेशन की मात्रा अधिकतम संभव ऑफसेट द्वारा निर्धारित की जाती है जिसे हम निर्धारित करना चाहते हैं। केंद्रीय भाग बहुत छोटा नहीं होना चाहिए, अन्यथा सहसंबंध समारोह (नीचे देखें) में स्थिर संचालन के लिए पर्याप्त डेटा नहीं होगा।
2) वर्तमान फ्रेम में, एक ही आकार का एक हिस्सा चुना जाता है, लेकिन तस्वीर के केंद्र के सापेक्ष स्थानांतरित कर दिया जाता है।
3) प्रत्येक ऑफसेट के लिए, एक निश्चित मीट्रिक की गणना की जाती है जो पृष्ठभूमि के मध्य भाग और वर्तमान छवि के सहसंबंध का वर्णन करता है। इसके लिए, उदाहरण के लिए, इन दो छवियों के प्रत्येक बिंदु के लिए अंतर के वर्गों का योग उपयोग किया जा सकता है, या, उदाहरण के लिए, प्रत्येक बिंदु के लिए पूर्ण अंतर का योग।
4) पूर्वाग्रह जिसके लिए सहसंबंध अधिकतम है (द्विघात अंतर के योग से कम या पूर्ण अंतर का योग) वांछित पूर्वाग्रह होगा।
अंजीर। 2 पृष्ठभूमि के सापेक्ष वर्तमान फ्रेम की ऑफसेट।
स्वाभाविक रूप से, यदि इस दृष्टिकोण को सिर पर लागू किया जाता है, तो एल्गोरिथ्म की गति भयावह रूप से कम होगी, इस तथ्य के बावजूद कि सहसंबंध कार्यों की गति बहुत अधिक हो सकती है। यह आश्चर्य की बात नहीं है, क्योंकि हमें एक दूसरे के सापेक्ष छवियों के संभावित विस्थापन के लिए सभी विकल्पों के माध्यम से सॉर्ट करने की आवश्यकता होगी (एल्गोरिथ्म की जटिलता का अनुमान ओ (n ^ 2) के रूप में लगाया जा सकता है, जहां n छवि बिंदुओं की संख्या है)।
पहला अनुकूलन सभी संभावित विकल्पों की संपूर्ण संपूर्ण खोज का उपयोग नहीं करना है, लेकिन ढाल मूल विधि का उपयोग करना है: शुरुआत में, सहसंबंध की गणना शून्य पूर्वाग्रह के लिए 3x3 क्षेत्र में की जाती है, फिर अधिकतम सहसंबंध के साथ पूर्वाग्रह का चयन किया जाता है और एक स्थानीय अधिकतम का पता चलने तक प्रक्रिया को दोहराया जाता है। यह विधि बहुत तेज़ है, लेकिन बड़े ऑफसेट के सबसे बुरे मामले में इसकी जटिलता O (n ^ 1.5) होगी, जो स्वीकार्य भी है।
चित्र 3 सहसंबंध समारोह की अधिकतम के लिए खोजें। धीरे-धीरे उतरना।
इस स्थिति से बाहर निकलने का तरीका मल्टीस्केल छवियों का उपयोग है (प्रत्येक ज़ूम स्तर छवि को आधे से कम कर देता है)। अब हम अधिकतम पैमाने के लिए स्थानीय अधिकतम सहसंबंध की खोज करेंगे, और फिर बाद में इसे छोटे पैमाने पर परिष्कृत करेंगे। इस प्रकार, एल्गोरिथ्म की जटिलता ओ (एन) तक घट जाती है, जो पहले से ही काफी स्वीकार्य है।
अंजीर। 4 बहु चित्र।
उपपिक्सेल सटीकता
यदि आप पिक्सेल की सटीकता के साथ कैमरा शेक के लिए क्षतिपूर्ति करते हैं, तो स्थिर छवि अभी भी बहुत स्पष्ट रूप से चिकोटी देगी। सौभाग्य से, यह तय किया जा सकता है। यदि हम अधिकतम के पास सहसंबंध समारोह के पड़ोस का सावधानीपूर्वक विश्लेषण करते हैं (चित्र 3 देखें), हम देख सकते हैं कि फ़ंक्शन के मान अधिकतम के संबंध में सममित नहीं हैं, जो इंगित करता है कि अधिकतम बिंदु (3, 2) पर स्थित नहीं है, इसके बीच कहीं है और बिंदु (1, 4)। अगर हम paraboloid A * x ^ 2 + B * x * y * C * y ^ 2 + D * x + E * y + F = 0 द्वारा अधिकतम के पास सहसंबंध समारोह के व्यवहार को अनुमानित करते हैं, तो paraboloid के ऐसे मापदंडों के चयन के लिए अधिकतम के निर्देशांक को परिष्कृत करने का कार्य कम हो जाता है, जिस पर ज्ञात बिंदुओं पर वास्तविक मूल्यों से इसका विचलन न्यूनतम है। अनुभव बताता है कि इस प्रकार प्राप्त शोधन की सटीकता 0.1-0.2 के क्रम की होगी। जब इतनी सटीकता के साथ घबराहट के लिए क्षतिपूर्ति की जाती है, तो स्थिर छवि अब जुड़वा नहीं होती है।
ऑफसेट मुआवजा
हम पूरे शिफ्ट के लिए ऑफसेट मुआवजे का प्रदर्शन निम्नानुसार करते हैं: हम वर्तमान छवि को विपरीत संकेत के साथ मिली शिफ्ट द्वारा स्थानांतरित करते हैं। किनारे के पास खाली क्षेत्र पृष्ठभूमि को भरते हैं। एक सबपिक्सल शिफ्ट के लिए, बिलिनियर इंटरपोलेशन का उपयोग करके क्षतिपूर्ति की जाती है। हालाँकि, स्थिर छवि का थोड़ा धुंधला होना संभव है। यदि यह महत्वपूर्ण है, तो बिकुबिक प्रक्षेप का उपयोग किया जा सकता है।
पृष्ठभूमि अद्यतन
पृष्ठभूमि के रूप में, आप किसी भी पिछले फ्रेम का उपयोग कर सकते हैं। हालाँकि, स्थिरीकरण की गुणवत्ता में सुधार होता है अगर आप एक पृष्ठभूमि के रूप में कई फ़्रेमों पर औसतन एक छवि का उपयोग करते हैं। दृश्य की चमक में संभावित परिवर्तनों की भरपाई के लिए समय-समय पर पृष्ठभूमि को अपडेट करना उचित है। पृष्ठभूमि को अपडेट करते समय, आपको यह सुनिश्चित करने की आवश्यकता होती है कि पृष्ठभूमि मूल्य काफी विपरीत और विषम है। अन्यथा, सहसंबंध समारोह में एक स्पष्ट अधिकतम नहीं होगा, जो स्टेबलाइजर की सटीकता को बहुत कम कर देगा। पृष्ठभूमि में मौजूद वस्तुओं को स्थानांतरित करने के लिए यह अत्यधिक अवांछनीय है।
एक गति डिटेक्टर के साथ मिलकर काम करते हैं
यदि स्टेबलाइजर को मोशन डिटेक्टर के साथ जोड़ा जाता है, तो इसके लिए बैकग्राउंड अपडेट करने की प्रक्रिया बहुत सरल हो जाती है। आमतौर पर, एक मोशन डिटेक्टर में पहले से ही कई फ़्रेमों पर औसतन एक पृष्ठभूमि होती है, जिसके सापेक्ष यह गति की उपस्थिति को निर्धारित करता है। स्टेबलाइजर के लिए एक ही पृष्ठभूमि का उपयोग किया जा सकता है। बदले में स्टेबलाइजर से स्थिर छवि गति डिटेक्टर की झूठी सकारात्मक की संख्या को कम करती है। आप इस तथ्य का भी उपयोग कर सकते हैं कि अपने काम की प्रक्रिया में मोशन डिटेक्टर गति की उपस्थिति के साथ क्षेत्रों का मुखौटा प्राप्त करता है। पिछले फ्रेम पर मोशन डिटेक्टर द्वारा प्राप्त इस मास्क का उपयोग गति के साथ क्षेत्रों को बाहर करने के लिए सहसंबंध समारोह की गणना में किया जा सकता है। जिससे इमेज स्टेबलाइजर पर भी सकारात्मक प्रभाव पड़ता है।
प्रस्तावित दृष्टिकोण के पेशेवरों:
1) उच्च गति एल्गोरिथ्म। विशेष रूप से, कोर i7-4470 प्रोसेसर (1 कोर शामिल) पर BGRA32 प्रारूप में 1280x720 के संकल्प के साथ छवि स्थिरीकरण के लिए, एल्गोरिथ्म को 1.5 मिलीसेकंड की आवश्यकता होती है।
2) सबपिक्सल सटीकता के साथ कैमरा शेक के लिए मुआवजा।
प्रस्तावित दृष्टिकोण के नुकसान
1) वर्तमान कार्यान्वयन में छवि स्थिरीकरण केवल स्थिर कैमरों के लिए संभव है।
2) केवल कैमरे की स्थानिक पारी का पता लगाया जाता है और मुआवजा दिया जाता है, कैमरे के रोटेशन की भरपाई नहीं की जाती है।
3) पृष्ठभूमि काफी स्पष्ट और विषम होनी चाहिए, अन्यथा सहसंबंध समारोह में कुछ भी नहीं है। इसलिए, अंधेरे या कोहरे में, स्थिरीकरण अच्छी तरह से काम नहीं करेगा।
4) पृष्ठभूमि गतिहीन होनी चाहिए। यात्रा तरंगों की पृष्ठभूमि पर स्टेबलाइजर भी असंभव है।
कार्यान्वयन नोट्स
शुरू करने के लिए, हम ध्यान दें कि शिफ्ट का निर्धारण करने के लिए, यह केवल एक ग्रे छवि का उपयोग करने के लिए पर्याप्त है, रंग की विशेषताएं व्यावहारिक रूप से सटीकता को प्रभावित नहीं करती हैं, लेकिन स्वाभाविक रूप से गणना को धीमा कर देती हैं।
स्टेबलाइजर को लागू करते समय, छवियों के साथ काम करने के लिए अनुकूलित कार्यों का उपयोग करना उचित है। मैंने इन उद्देश्यों के लिए सिमड लाइब्रेरी का उपयोग किया। इसमें, विशेष रूप से, आप पा सकते हैं:
1) SimdAbsDifferenceSum और SimdAbsDifferenceSumMasked - सहसंबंधी कार्य की गणना के लिए।
2) SimdReduceGray2x2, SimdReduceGray3x3, SimdReduceGray4x4 और SimdReduceGray5x5 - मल्टीस्केल छवियों के निर्माण के लिए।
3) SimdBgrToGray - एक ग्रे छवि प्राप्त करने के लिए।
4) SimdShiftBilinear - पारी के लिए क्षतिपूर्ति करने के लिए।
एल्गोरिदम का परिणाम देखें
उदाहरण 1:
उदाहरण 2: