2010-03-31 18 views
8

कार्य: मेरे पास हमारे असेंबली लाइन के अंत में एक कैमरा है, जो उत्पादित वस्तुओं की छवियों को कैप्चर करता है। उदाहरण के लिए, मान लें कि हम टिकट तैयार करते हैं (उन पर कुछ पाठ और चित्रों के साथ)। इसलिए प्रत्येक उत्पादित टिकट को चित्रित किया गया है और छवि के रूप में डिस्क में सहेजा गया है। अब मैं इन सहेजी गई छवियों को विसंगतियों के लिए जांचना चाहता हूं (यानी उन्हें एक छवि (एक टेम्पलेट) की तुलना करें, जो ठीक है)। तो यदि हमारी असेंबली लाइन (लापता चित्र, दाग, ...) पर टिकट के साथ कोई समस्या है, तो मेरा एप्लिकेशन इसे ढूंढना चाहिए (क्योंकि इसकी छवि मेरे टेम्पलेट से बहुत अधिक है)।अंतर खोजने के लिए छवियों की तुलना करें

प्रश्न: चित्रों की तुलना करने और उनके बीच अंतर खोजने का सबसे आसान तरीका क्या है? क्या मुझे अपनी विधियों को लिखने की ज़रूरत है, या क्या मैं मौजूदा लोगों का उपयोग कर सकता हूं? यह बहुत अच्छा होगा अगर मैं सिर्फ एक सहिष्णुता मूल्य (यानी छवियों 1% के लिए अलग हो सकता है) निर्धारित करते हैं, एक समारोह में दोनों छवियों डाल दिया और सही या गलत :)

उपकरण की वापसी मूल्य मिलती है: C# या VB। नेट, Emgu.CV (ओपनसीवी के लिए .NET wrapper) या कुछ समान

उत्तर

2

मैं टेम्पलेट के लिए समर्थन हासिल है डी AForge Imaging library को देखने की अनुशंसा करते हैं क्योंकि इस प्रकार के काम के लिए इसमें बहुत सारे उपयोगी कार्य हैं।

ऐसे कई तरीके आप इस्तेमाल कर सकते हैं कर रहे हैं:

  1. सरल घटाव (टेम्पलेट छवि - वर्तमान) और देखते हैं कि अधिक से अधिक पिक्सेल अलग हैं। आप शायद परिणामों को थ्रेसहोल्ड करना चाहते हैं, यानी केवल पिक्सल शामिल करें जो 10 या अधिक (उदाहरण के लिए) से अलग हैं।
  2. यदि टिकट फ़ील्ड-ऑफ-व्यू में स्थानांतरित हो सकते हैं तो आइटम 1) तब तक काम नहीं करेगा जब तक आप पहले टिकट का पता नहीं लगा सकते। उदाहरण के लिए यदि टिकट काले रंग की पृष्ठभूमि पर सफेद है तो आप छवि पर एक सीमा तय कर सकते हैं और इससे आपको टिकट का पता लगाने का अच्छा विचार मिलेगा।
  3. एक और तकनीक जिसका मैंने पहले उपयोग किया है वह "मॉडल ढूँढना" या "पैटर्न मिलान" है, लेकिन मुझे केवल एक वाणिज्यिक पुस्तकालय Matrox Imaging Library (या एमआईएल) पता है जिसमें ये कार्य शामिल हैं क्योंकि वे छोटे नहीं हैं।

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

1

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

3

मुझे ओपनसीवी के बारे में बहुत कुछ पता नहीं है, लेकिन छवि प्रसंस्करण पर थोड़ा सा है।

जाने का तरीका उस नई तस्वीरों में आवृत्ति पर निर्भर करता है। आपके 'अच्छे' टेम्पलेट और आपके वास्तविक उत्पाद की छवि की एक अंतर तस्वीर की गणना करना एक सरल दृष्टिकोण होगा।

यदि छवियां 100% समान हैं, तो आपकी परिणामी छवि खाली होनी चाहिए। यदि अवशिष्ट पिक्सल हैं, तो आप इन्हें गिन सकते हैं और उन्हें मानक से विचलन के उपाय के रूप में ले सकते हैं।

हालांकि, आपको सीमाओं को संरेखित करने के लिए छवियों में से किसी एक के अभिविन्यास (और शायद पैमाने) से मेल खाना पड़ेगा, अन्यथा यह दृष्टिकोण काम नहीं करेगा।

यदि आपके पास समयबद्ध बाधाएं हैं, तो आप उन्हें प्रसंस्करण से पहले अपनी छवियों में जानकारी को कम करना चाहते हैं (उदाहरण के लिए किनारे का पता लगाना और/या ग्रेस्केल या यहां तक ​​कि मोनोक्रोमैटिक बिटमैप में परिवर्तित करना यदि आपके उत्पाद की विशेषताएं पर्याप्त महत्वपूर्ण हैं)

1

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

यह मानते हुए कि आप चित्रों के ऑब्जेक्ट के लिए नियंत्रित किया था हूबहू उन्मुख किया जा रहा है और हूबहू तैनात, एक बात आप सकता है इसलिए की तरह प्रत्येक छवि का पिक्सेल से मार्च है, और प्राप्त प्रत्येक के एचएसवी मूल्यों है:

Color color1 = Image1.GetPixel(i,j); 
Color color2 = Image2.GetPIxel(i,j); 
float hue1 = color1.GetHue(); 
float sat1 = color1.GetSaturation(); 
float bright1 = color1.GetBrightness(); 
float hue2 = color2.GetHue(); 
float sat2 = color2.GetSaturation(); 
float bright2 = color2.GetBrightness(); 

और उन मानों के साथ कुछ तुलना करें। इससे आपको लगता है कि, आरजीबी मूल्यों का उपयोग करने की तुलना में अधिक विश्वसनीयता के साथ, विशेष रूप से आप अपनी तुलना में कुछ सहनशीलता शामिल करना चाहते हैं।


संपादित करें:

बस मस्ती के लिए, मुझे लगता है कि इसके बाद के संस्करण मेरा विचार इस्तेमाल किया एक छोटे नमूना एप्लिकेशन लिखा था। अनिवार्य रूप से यह पिक्सल की संख्या को बढ़ाता है जिनके एच, एस और वी मान कुछ राशि से भिन्न होते हैं (मैंने 0.1 को अपना मान के रूप में चुना) और फिर एच, एस, या वी काउंटर 38400 या 2% से अधिक होने पर तुलनात्मक लूप से बाहर निकल गए पिक्सेल (0.02 * 1600 * 1200)। सबसे बुरे मामले में, दो समान छवियों की तुलना करने में लगभग 2 सेकंड लग गए। जब मैंने छवियों की तुलना की जहां एक को 2% मान से अधिक करने के लिए पर्याप्त रूप से बदला गया था, तो यह आम तौर पर एक सेकंड का अंश लेता था।

जाहिर है, अगर प्रति सेकंड कई छवियां उत्पन्न की जा रही हैं तो यह बहुत धीमी होगी, लेकिन मैंने सोचा कि यह वैसे भी दिलचस्प था।

+0

हैशिंग एक अच्छा विचार है, लेकिन पूर्ण छवि पर पिक्सेल-बाय-पिक्सेल-विश्लेषण प्रति छवि पिक्सेल की भारी मात्रा के कारण इष्टतम प्रदर्शन नहीं करेगा (1600 * 1200 बाइट्स या ग्रेस्केल में 1.875 एमबी के बारे में सोचें) – sum1stolemyname

+0

लगता है जैसे कि यह इस्तेमाल किए गए एल्गोरिदम की गति पर निर्भर करता है, क्योंकि किसी भी एल्गोरिदम को 1-2% से अधिक मतभेदों को पहचानने की अपेक्षा की जाती है, फिर भी पूरी फ़ाइल पर फिर से चलना होगा। शायद छवियों का त्वरित घटाव करें, फिर रहने वाले को समेटें। यह पूरी छवि की जांच करते समय जितना तेज़ हो सके उतना तेज़ होगा। – tloflin

1

This guy here एक ही समस्या के लिए एक सरल जावा कोड लिखा था। मुझे लगता है कि इसे सी # में परिवर्तित करना मुश्किल नहीं होगा। यह ठीक काम कर रहा है, इसमें एक नया और मजबूत संस्करण भी पाया जा सकता है।

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