2012-07-04 15 views
6

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

मैं फिडियस मार्करों, यानी cvFindContours() को खोजने के लिए क्लासिक आयताकार पहचान प्रक्रिया कर रहा हूं, इसके बाद समोच्चों से वर्गों का अनुमान लगाया जाता है। कई मामलों में, कई मार्कर दिखाई देते हैं (या आपदाजनक रूप से, जब आयताकारों का घना ग्रिड मार्कर नहीं होता है), तो अकेले सीवीएफआईंडकंटर्स() को कॉल आईफोन पर 30 एमएम ले सकता है।

मैंने पहले ही अविश्वसनीय रूप से महंगा सी ++ सीवी :: FindContours() को cvFindContours() के साथ बदल दिया है। विशेष रूप से यदि एक वेक्टर पारित किया गया है, तो C++ संस्करण ने अपने आंतरिक cvFindContours() को ले लिया है, वैसे भी वैक्टर आवंटित और पॉप्युलेटिंग बिताया!

अब, मैं cvFindContours में, या विशेष रूप से cvFindNextContour() में पूरी तरह से बाध्य हूं। CvFindNextContour के अंदर कोड शाखा-भारी है, और वेक्टरिज़ के लिए स्पष्ट रूप से आसान नहीं है। यह एक जटिल एल्गोरिदम भी लागू करता है कि मुझे विश्वास नहीं है कि ऑप्टिमाइज़ करने के किसी भी प्रयास में गलत न हो।

मैंने पहले से ही cvBlobLib (असंबद्धता के लिए, मेरा मतलब यह है: http://code.google.com/p/cvblob/) यह देखने के लिए कि क्या यह वैकल्पिक एल्गोरिदम प्रदान करता है जो एक ही चीज़ को तेज़ कर सकता है। स्रोत का आधार डाउनलोड अविश्वसनीय रूप से धीमा है क्योंकि यह एक std :: सूची() में रूपों को रिकॉर्ड करता है, और लगभग सभी समय स्मृति आवंटन में खर्च करता है। एक एसटीडी के साथ उस सूची की जगह :: वेक्टर पूर्व आकार 256 तत्वों को push_back पर प्रारंभिक प्रतियां खत्म करने के लिए() अभी भी एक समारोह है कि 3x cvFindContours() से अधिक समय लेता, CVB में सीधे उस के 66% के साथ छोड़ देता है :: cvLabel ()। तो यह इस तरह से जाने के लिए व्यवहार्य प्रतीत नहीं होता है।

क्या किसी के पास कोई विचार है कि मैं कई आयताकारों का पता लगाने के अनुकूलन कैसे कर सकता हूं। मेरे अस्पष्ट handwaving में शामिल हैं:

  1. किसी भी तेजी से कार्यान्वयन बराबर, आदर्श स्रोत कोड के रूप में वहाँ हैं cvFindContour() के रूप में मैं बहु हूँ, वहाँ बाहर?

  2. आकृति के बहुमत की आवश्यकता नहीं है, केवल "सफल" आयतों उपयोगी होते हैं। विशेष रूप से, उनके आंतरिक रूप तब उपयोगी नहीं होते हैं। सैद्धांतिक रूप से, मैं cvFindContours बिल्कुल कॉल नहीं कर सका, और बदले cvStartFindContours/cvFindNextContour कहते हैं, प्रत्येक समोच्च परीक्षण के रूप में पाया जाता है और, अगर मैं एक आयत मैं तलाश कर रहा हूँ पाया recursing नहीं के रूप में subrectangles तो बेकार होने की गारंटी कर रहे हैं?

  3. क्या क्लासिक FindContours()/ApproxPoly() दृष्टिकोण से मैं एक पूरी तरह से अलग आयताकार पहचान एल्गोरिदम का उपयोग कर सकता हूं?

  4. वहाँ एक रास्ता ब्याज की उपयोगी क्षेत्रों के साथ करने के लिए "प्रधानमंत्री" cvFindContours है? जैसे एक तेज कोने का पता लगाना लगभग हमेशा एक बहुत ही आक्रामक दहलीज के साथ भी मेरे फिडियस मार्कर कोनों को लौटाता है। पहचान को सीमित करने के लिए उस बिंदु सेट का उपयोग करने का कोई तरीका है? (दुर्भाग्य से, मुझे यकीन नहीं है कि यह कितने मदद करता है, फिर से कई मार्करों या घने ग्रिडलाइनों के मामले में मार्कर से संबंधित नहीं होता है, जो अक्सर मेरे ऐप में होता है।)

  5. उपरोक्त के समान ही, ब्लॉब पहचान (अगर मैं सही ढंग से समझ) पुनरावर्ती बाढ़ भरने के रूप में लागू किया जा सकता है, इस के किसी भी तेजी से vectorized कार्यान्वयन है कि तब किसी भी तरह वहाँ से दिलचस्प ब्लॉब आयत और बीज समोच्च का पता लगाने बाहर निकलने के लिए इस्तेमाल किया जा सकता है?

किसी भी विचार का स्वागत किया जाएगा!

+0

बस अपने बिंदु पर एक टिप्पणी 5. बाढ़ भरना आम तौर पर ब्लॉब का पता लगाने के लिए सबसे प्रभावी तरीका नहीं है। इसके बजाय, आप दो-पास या एक-पास एल्गोस का उपयोग करना चाहते हैं, जिनमें से कुछ समांतर हैं। "कनेक्ट किए गए घटकों लेबलिंग" पर विकिपीडिया पृष्ठ एक अच्छा प्रारंभिक बिंदु है। –

+0

यहां कोई अपडेट? नई अंतर्दृष्टि? मुझे एक ही समस्या है। – Antonvh

उत्तर

2

चूंकि आपका लक्ष्य आयत का पता लगाने और समोच्च पहचान नहीं है, इसलिए मैं गणना के लिए अभिन्न छवियों का उपयोग करने का सुझाव दूंगा। अभिन्न छवियों का एक स्पष्टीकरण here पाया जा सकता है। अपनी वांछित छवि की अभिन्न छवि की गणना करने के बाद, आयत के पिक्सेल योग की गणना तीन परिचालनों के साथ की जा सकती है।

मान लीजिए कि आप प्रत्येक गैर-काले वस्तु के चारों ओर आयतों को आकर्षित करना चाहते हैं, आप निम्नानुसार एक विधि का उपयोग कर सकते हैं। रिक्त रूप से छवि और उसके उपखंडों को 4 तक विभाजित रखें और आयत को अपनी वांछित दहलीज के नीचे एक पिक्सेल योग के साथ छोड़ दें। आपको अपनी वस्तुओं का अनुमान लगाने वाले कई छोटे आयतों के साथ छोड़ा जाएगा। पड़ोसी आयताकारों को मर्ज करने से आपके पता लगाए गए वस्तुओं का तेजी से अनुमान लगाया जाएगा।