OpenCV

2010-01-14 17 views
12

मैं OpenCV उपयोग करने के लिए iPhone खेल Blocked से स्क्रीनशॉट "पार्स" करने के लिए कोशिश कर रहा हूँ के साथ एक छवि में आयतों के स्थान ढूँढना। स्क्रीनशॉट इस तरह देखने के लिए क्रॉप किए गए हैं:OpenCV

Blocked screenshot

मैं अभी मैं सिर्फ 4 अंक प्रत्येक आयत बनाने में से प्रत्येक के निर्देशांक खोजने की कोशिश कर रहा हूँ के लिए लगता है। मैंने नमूना फ़ाइल squares.c देखा जो ओपनसीवी के साथ आता है, लेकिन जब मैं इस तस्वीर पर उस एल्गोरिदम को चलाता हूं, तो यह 72 आयतों के साथ आता है, जिसमें व्हाइटस्पेस के आयताकार क्षेत्रों समेत मैं स्पष्ट रूप से अपने एक के रूप में गिनना नहीं चाहता आयतों। इस दृष्टिकोण के लिए एक बेहतर तरीका क्या है? मैंने कुछ Google शोध करने की कोशिश की, लेकिन सभी खोज परिणामों के लिए, बहुत कम प्रासंगिक उपयोग योग्य जानकारी है।

+1

बस गलत रंग वाले आयतों को फेंक दें। –

उत्तर

13

समान मुद्दा पहले से ही चर्चा की गई है: How to recognize rectangles in this image?

अपने डेटा के लिए के रूप में, आयत आप को खोजने के लिए केवल काले वस्तुओं रहे हैं कोशिश कर रहे हैं। तो आप थ्रेसहोल्ड बिनराइजेशन करने का प्रयास कर सकते हैं: ब्लैक पिक्सल वे हैं जिनके पास तीन से कम आरजीबी मान 40 से कम हैं (मुझे यह अनुभवजन्य मिला है)। यह सरल ऑपरेशन अपनी तस्वीर इस तरह दिखना बनाता है:

binarized picture http://img691.imageshack.us/img691/975/rectk.png

उसके बाद आप लागू हो सकते हैं Hough लाइनों (विषय रहा करने के लिए भेजा में चर्चा) को खोजने के लिए उसे रूपांतरित करने या आप इसे आसान कर सकते हैं। एक्स और वाई अक्षों के लिए काले पिक्सेल के अभिन्न अनुमानों की गणना करें। (एक्स के लिए प्रक्षेपण x_i का एक वेक्टर है - काले पिक्सल की संख्या जैसे कि इसका पहला समन्वय x_i के बराबर है)। इसलिए, आप अनुमानों के शिखर के रूप में संभव एक्स और वाई मान प्राप्त करते हैं। फिर पाए गए एक्स और वाई द्वारा प्रतिबंधित सभी संभावित सेगमेंट देखें (यदि x_i, y_j) और (x_i, y_k) के बीच बहुत सारे काले पिक्सेल हैं, तो शायद संभवतः एक रेखा है)। अंत में, आयताकारों के लिए लाइन सेगमेंट लिखें!

+0

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

0

हैरिस कोने डिटेक्टर जैसे कई कोने डिटेक्टरों में से एक आज़माएं। यह भी सामान्य रूप से कई प्रस्तावों पर कोशिश करने का एक अच्छा विचार है: इसलिए अलग-अलग आवर्धन के कुछ पूर्व-प्रोसेसिंग करें। ऐसा प्रतीत होता है कि आप कुछ प्रकार के रंग वर्चस्व वाले वर्ग चाहते हैं, तो आप पहले अन्य रंगों को दबा सकते हैं, पहले cvsplit ..... और फिर रंग को थ्रेसहोल्ड करना ... इसलिए केवल वह क्षेत्र बना रहता है .... उसका पालन करें एक फसल संचालन के साथ ... मुझे लगता है कि जब से आपकी समस्या छोटे आयतों मैं उन्हें हटाने के द्वारा शुरू होता है कि रूप में अच्छी तरह

+0

हैरिस कोने का पता लगाने पूरी तरह से बेकार होगा क्योंकि सभी कोनों को पहले से ही जाना जाता है, गेम एक परिपूर्ण ग्रिड में है। –

2

काम कर सकता था ....। चूंकि आयत की सीमाओं की तुलना में ये रेखाएं बहुत पतली हैं, इसलिए मैं छवि पर morphological operations लागू करके शुरू करूंगा।

एक संरचनात्मक तत्व है कि इस तरह दिखता है का उपयोग करना:

element = [ 1 1 
      1 1 ] 

लाइनों है कि कम से कम दो पिक्सेल चौड़ी निकाल देना चाहिए। छोटी लाइनों को हटा दिए जाने के बाद ओपनसीवी के आयताकार खोज एल्गोरिदम की संभावना आपके लिए बाकी की नौकरी होगी। फंक्शन cvErode

3

ब्लॉक द्वारा ओपनसीवी में क्षरण किया जा सकता है ब्लॉक ब्लैकमैप्स की तरह दिखते हैं - आप प्रत्येक ब्लॉक आकार/रंग/अभिविन्यास के लिए अलग-अलग टेम्पलेट्स के साथ सरल टेम्पलेट मिलान का उपयोग क्यों नहीं करते?

5

मैं समापन सिर्फ अपने मूल पद्धति पर निर्माण और के रूप में रॉबर्ट मेरे सवाल पर अपने टिप्पणी में सुझाव कर। आयत की मेरी सूची प्राप्त करने के बाद, मैं प्रत्येक आयताकार पर औसत रंग से गुजरता हूं और गणना करता हूं।मैं यह देखने के लिए जांच करता हूं कि औसत रंग के लाल, हरे और नीले रंग के घटक ग्रे और नीले रंग के आयतों के 10% के भीतर हैं, और यदि वे आयत को सहेजते हैं, तो अगर वे इसे छोड़ नहीं देते हैं। इस प्रक्रिया को मुझे कुछ इस तरह देता है:

screenshot

इस से, मुझे मिली जानकारी प्राप्त करने के लिए (अभिविन्यास, प्रारंभिक बिंदु है, और लंबाई प्रत्येक आयत का, एक 6x6 ग्रिड के रूप में खेल खिड़की पर विचार) तुच्छ है।