2011-08-21 18 views
10

मैं मूल रूप से जावा पर टेम्पलेट मिलान करने की कोशिश कर रहा हूं। मैंने मिलान खोजने के लिए सीधा एल्गोरिदम का उपयोग किया। यहां कोड है:टेम्पलेट मिलान पर ओपनसीवी प्रदर्शन

minSAD = VALUE_MAX; 
// loop through the search image 
for (int x = 0; x <= S_rows - T_rows; x++) { 
    for (int y = 0; y <= S_cols - T_cols; y++) { 
     SAD = 0.0; 

     // loop through the template image 
     for (int i = 0; i < T_rows; i++) 
      for (int j = 0; j < T_cols; j++) { 

       pixel p_SearchIMG = S[x+i][y+j]; 

       pixel p_TemplateIMG = T[i][j]; 

       SAD += abs(p_SearchIMG.Grey - p_TemplateIMG.Grey); 
      } 
    } 

    // save the best found position 
    if (minSAD > SAD) { 
     minSAD = SAD; 
     // give me VALUE_MAX 
     position.bestRow = x; 
     position.bestCol = y; 
     position.bestSAD = SAD; 
    } 
} 

लेकिन यह बहुत धीमा दृष्टिकोण है। मैंने 2 छवियों (768 × 1280) और उपमहाद्वीप (384 x 640) का परीक्षण किया। यह उम्र के लिए रहता है। क्या OpenCV टेम्पलेट को बहुत तेज़ी से मेल खाता है या तैयार फ़ंक्शन cvMatchTemplate() के साथ नहीं करता है?

उत्तर

32

आपको ओपनसीवी सीवीएमच टेम्पलेट() आपके द्वारा लागू की गई विधि से बहुत तेज है। आपने जो बनाया है वह एक सांख्यिकीय टेम्पलेट मिलान विधि है। यह सबसे आम है और लागू करने के लिए सबसे आसान है हालांकि बड़ी छवियों पर बहुत धीमी है। आइए मूलभूत गणित पर एक नज़र डालें जो आपके पास एक छवि है जो 768x1280 है, आप इनमें से प्रत्येक पिक्सल के किनारों के माध्यम से लूप करते हैं क्योंकि यह आप टेम्पलेट सीमाएं हैं (768 - 384) x (1280 - 640) कि 384 x 640 = 245 ' 760 ऑपरेशंस जिसमें आप अपने लूप में किसी भी गणित को जोड़ने से पहले अपने टेम्पलेट के प्रत्येक पिक्सेल (एक और 245'760 ऑपरेशंस) के माध्यम से लूप करते हैं, आपके पास पहले से ही (245'760 x 245'760) 60'397'977'600 ऑपरेशंस हैं। 60 अरब से अधिक संचालन सिर्फ अपनी छवि के माध्यम से लूप करने के लिए यह और आश्चर्य की बात है कि कितनी जल्दी मशीनें यह कर सकती हैं।

हालांकि इसके 245'760 एक्स (245'760 एक्स गणित संचालन) याद रखें, इसलिए कई और संचालन हैं।

अब cvMatchTemplate() वास्तव में फूरियर विश्लेषण टेम्पलेट मिलान ऑपरेशन का उपयोग करता है। यह एक फास्ट फूरियर ट्रांसफॉर्म (एफएफटी) को उस छवि पर लागू करता है जिसमें तीव्रता में पिक्सेल परिवर्तन करने वाले संकेतों को प्रत्येक संबंधित तरंग रूपों में विभाजित किया जाता है। विधि को अच्छी तरह से समझाना मुश्किल है लेकिन छवि जटिल संख्याओं के सिग्नल प्रतिनिधित्व में परिवर्तित हो गई है। यदि आप और अधिक समझना चाहते हैं तो fast fourier transform के लिए गोगल पर खोजें। अब टेम्पलेट पर एक ही ऑपरेशन किया जाता है जो टेम्पलेट बनाने वाले सिग्नल का उपयोग आपकी छवि से किसी अन्य सिग्नल को फ़िल्टर करने के लिए किया जाता है।

सरल में यह उस छवि के भीतर सभी सुविधाओं को दबा देता है जिनमें आपके टेम्पलेट के समान सुविधाएं नहीं हैं। छवि को तब एक छवियों का उत्पादन करने के लिए एक व्यस्त तेज़ चौकोर परिवर्तन का उपयोग करके वापस परिवर्तित किया जाता है जहां उच्च मूल्यों का मतलब एक मैच होता है और कम मान विपरीत होते हैं। इस छवि को अक्सर सामान्यीकृत किया जाता है, इसलिए 1 एक मैच और 0 का प्रतिनिधित्व करता है या इसका अर्थ यह है कि वस्तु कहीं नजदीकी नहीं है।

चेतावनी दी जानी चाहिए कि अगर वे छवि में छवि नहीं हैं और यह सामान्यीकृत है तो झूठी पहचान की जाएगी क्योंकि गणना की गई उच्चतम मूल्य को एक मैच के रूप में माना जाएगा। मैं इस बात के बारे में उम्र के लिए जा सकता हूं कि विधि कैसे काम करती है और इसके लाभ या समस्याएं हो सकती हैं लेकिन ...

इस विधि इतनी तेज़ी से कारण है: 1) opencv अत्यधिक अनुकूल सी ++ कोड है। 2) आपके प्रोसेसर को संभालने के लिए एफएफटी फ़ंक्शन आसान है क्योंकि बहुमत में इस ऑपरेशन को हार्डवेयर में करने की क्षमता है। जीपीयू ग्राफिक कार्ड हर सेकेंड में लाखों एफएफटी ऑपरेशंस करने के लिए डिज़ाइन किए गए हैं क्योंकि ये गणना उच्च प्रदर्शन गेमिंग ग्राफिक्स या वीडियो एन्कोडिंग में उतनी ही महत्वपूर्ण है। 3) आवश्यक संचालन की मात्रा बहुत कम है।

सारांश में सांख्यिकीय टेम्पलेट मिलान विधि धीमी है और उम्र लेती है जबकि ओपनसीवी एफएफटी या सीवीएमच टेम्पलेट() त्वरित और अत्यधिक अनुकूल है।

सांख्यिकीय टेम्पलेट मिलान त्रुटियों का उत्पादन नहीं करेगा यदि कोई ऑब्जेक्ट नहीं है, जबकि ओपनसीवी एफएफटी तब तक अपने आवेदन में देखभाल नहीं की जा सकती है।

मुझे आशा है कि यह आपको मूल समझ देता है और आपके प्रश्न का उत्तर देता है।

चीयर्स

क्रिस

[संपादित करें]

आगे आपके सवालों के जवाब:

हाय,

cvMatchTemplate CCOEFF_NORMED और CCORR_NORMED और SQDIFF_NORMED गैर सहित के साथ काम कर सकते हैं इनमें से सामान्यीकृत संस्करण। Here दिखाता है कि आप किस प्रकार के परिणाम की उम्मीद कर सकते हैं और कोड को खेलने के लिए देता है।

http://dasl.mem.drexel.edu/~noahKuntz/openCVTut6.html#Step%202

तीन तरीकों में अच्छी तरह से उद्धृत किया जाता है और कई कागजात Google scholar माध्यम से उपलब्ध हैं। मैंने कुछ कागजात दिए हैं। प्रत्येक व्यक्ति केवल एफएफटी सिग्नल के बीच सहसंबंध खोजने के लिए एक अलग समीकरण का उपयोग करता है जो छवि के भीतर मौजूद टेम्पलेट और एफएफटी सिग्नल बनाता है, सहसंबंध गुणांक मेरे अनुभव में बेहतर परिणाम प्रदान करता है और संदर्भों को ढूंढना आसान है। स्क्वायर अंतर का योग एक और तरीका है जिसका उपयोग तुलनात्मक परिणामों के साथ किया जा सकता है। मुझे आशा है कि इनमें से कुछ मदद:

Fast normalized cross correlation for defect detection डु-मिंग त्सई; चियान-ता लिन; पैटर्न पहचान पत्र वॉल्यूम 24, अंक 15, नवंबर 2003, पेज 2625-2631

Template Matching using Fast Normalised Cross Correlation काई Briechle; उवे डी हेनबेक;

Relative performance of two-dimensional speckle-tracking techniques: normalized correlation, non-normalized correlation and sum-absolute-difference Friemel, B.H ;; बोह्स, एलएन .; ट्रेहे, जीई .; अल्ट्रासोनिक्स संगोष्ठी, 1 99 5। कार्यवाही।, 1 99 5 आईईईई

A Class of Algorithms for Fast Digital Image Registration बर्निया, डैनियल I .; सिल्वरमैन, हार्वे एफ .;
कंप्यूटर, फ़रवरी 1972

पर आईईईई लेनदेन यह अक्सर एक मैच है कि एक 1 के बराबर होती है कुछ भी रूप में इन तरीकों में से सामान्यीकृत संस्करण का उपयोग करने का समर्थन किया है लेकिन है अगर आपत्ति नहीं आप गलत परिणामों की प्राप्त कर सकते हैं मौजूद है। विधि कंप्यूटर भाषा में उत्तेजित होने के तरीके के कारण तेज़ी से काम करती है। शामिल संचालन प्रोसेसर आर्किटेक्चर के लिए आदर्श हैं जिसका अर्थ है कि यह कई घड़ी चक्रों के आसपास स्मृति और जानकारी को स्थानांतरित करने के बजाय कुछ घड़ी चक्रों के साथ प्रत्येक ऑपरेशन को पूरा कर सकता है। प्रोसेसर कई वर्षों से एफएफटी समस्याओं को हल कर रहे हैं और जैसे मैंने कहा कि ऐसा करने के लिए इनबिल्ट हार्डवेयर है। हार्डवेयर आधारित सॉफ्टवेयर से हमेशा तेज है और टेम्पलेट मिलान की सांख्यिकीय विधि मूल सॉफ्टवेयर आधारित है।हार्डवेयर के लिए अच्छा पढ़ने यहां पाया जा सकता:

Digital signal processor हालांकि एक विकी पेज संदर्भ के लायक हैं एक देखो एक प्रभावी रूप से इस हार्डवेयर कि FFT गणना करता है

A new Approach to Pipeline FFT Processor Shousheng वह है, मैट Torkelson; मेरा पसंदीदा यह है कि यह दिखाता है कि प्रोसेसर के अंदर क्या हो रहा है

An Efficient Locally Pipelined FFT Processor लिआंग यांग; केवी झांग; हांगक्सिया लियू; जिन हुआंग; शिटन हुआंग;

ये पत्र वास्तव में बताएंगे कि कैसे जटिल FFT जब लागू किया है, लेकिन इस प्रक्रिया के पाइप अस्तर क्या आपरेशन में कुछ घड़ी चक्र में प्रदर्शन किया जा करने की अनुमति देता है। यही कारण है वास्तविक समय दृष्टि आधारित सिस्टम का उपयोग FPGA है के रूप में वे डिजाइन वास्तुकला में अत्यंत समानांतर और पाइप अस्तर हो सकता है लागू करने के लिए आसान है (विशेष रूप से प्रोसेसर है कि आप एक सेट कार्य को लागू करने के लिए डिजाइन कर सकते हैं डिजाइन)।

हालांकि मुझे यह जिक्र करना चाहिए कि किसी छवि के एफएफटी के लिए आप वास्तव में एफएफटी 2 का उपयोग कर रहे हैं जो क्षैतिज मैदान का एफएफटी और लंबवत मैदान का एफएफटी है, इसलिए जब आप इसका संदर्भ पाते हैं तो कोई भ्रम नहीं होता है। मैं नहीं कह सकता कि मैं कितना समीकरणों को लागू किया और FFT कार्यान्वित किया जाता है मैं अभी तक की खोज के लिए एक अच्छा गाइड बहुत मुश्किल इतना मैं अभी तक एक (नहीं एक मैं समझ सकता हूँ नहीं मिला है है अच्छा गाइड को खोजने की कोशिश की है में विशेष ज्ञान होता है कम से कम)। एक दिन मैं उन्हें समझ सकता हूं लेकिन पता के लिए मुझे अच्छी तरह समझ है कि वे कैसे काम करते हैं और किस प्रकार के परिणामों की उम्मीद की जा सकती है।

इसके अलावा मैं वास्तव में आपकी मदद नहीं कर सकता अगर आप अपना खुद का संस्करण लागू करना चाहते हैं या समझते हैं कि यह लाइब्रेरी को हिट करने का समय कैसे काम करता है, लेकिन मैं आपको चेतावनी देता हूं कि ओपनसीवी कोड इतना अच्छा अनुकूलित है कि आप बढ़ने के लिए संघर्ष करेंगे इसके प्रदर्शन हालांकि कौन जानता है कि आप एक तरह से यह पता लगाने के लिए बेहतर परिणाम सभी बेहतरीन और गुड लक

क्रिस

+0

बहुत बढ़िया जवाब क्रिस हासिल करने के लिए कर सकते हैं। Thanx! – AraZZ

+0

उत्कृष्ट जवाब क्रिस। Thanx! मैं पहली बार (एफएफटी) के बारे में सुनता हूं। मेरे कार्यक्रम में मैं cvMatchTemplate() का उपयोग करता हूं और इसके प्रदर्शन के बारे में आश्वस्त हूं। मुझे लगता है कि यह विधि मानदंड पार सहसंबंध के बारे में है। आर (एक्स, वाई) = sumx ', वाई' [टी (एक्स ', वाई') • मैं (x + एक्स ', y + वाई')]/sqrt [: कई लेख को पढ़ने के बाद मैं इस सूत्र = CV_TM_CCORR_NORMED पाया sumx ', y'T (एक्स', वाई ') 2 • sumx', y'I (x + एक्स ', वाई + y') 2] असल में यहाँ भी 4 चर और 4 छोरों मुझे लगता है। यह तेजी से कैसे काम करता है? क्या आप इस सहसंबंध के बारे में कुछ जानते हैं? मैं खुश रहूंगा यदि आप अपने उत्तर को उद्धरण प्रदान कर सकते हैं। – AraZZ

+0

हाय Arazz मैं तुम्हें क्या अनुरोध किया या कम से कम मैं क्या जवाब दे मुझे आशा है कि यह मदद करता है के साथ सवाल को अद्यतन किया है। – Chris

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