इमेज प्रोसेसिंग: 'कोका-कोला कैन' मान्यता के लिए एल्गोरिथम सुधार


1657

सबसे दिलचस्प परियोजनाओं में से एक मैंने पिछले कुछ वर्षों में काम किया है जो छवि प्रसंस्करण के बारे में एक परियोजना थी । लक्ष्य कोका-कोला 'डिब्बे' को पहचानने में सक्षम होने के लिए एक प्रणाली विकसित करना था (ध्यान दें कि मैं 'डिब्बे' शब्द पर जोर दे रहा हूं, आप देखेंगे कि एक मिनट में क्यों है)। आप स्केल और घुमाव के साथ हरे आयत में पहचाने जा सकने वाले नमूने को नीचे देख सकते हैं ।

टेम्पलेट मिलान

परियोजना पर कुछ अड़चनें:

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

तो आप इस तरह से मुश्किल चीजों के साथ समाप्त हो सकते हैं (जो इस मामले में मेरा एल्गोरिथ्म पूरी तरह से विफल था):

टोटल फेल

मैंने इस परियोजना को कुछ समय पहले किया था, और इसे करने में बहुत मज़ा आया था, और मेरे पास एक अच्छा कार्यान्वयन था। यहाँ मेरे कार्यान्वयन के बारे में कुछ विवरण हैं:

भाषा : OpenCV लाइब्रेरी का उपयोग करके C ++ में किया गया ।

प्री-प्रोसेसिंग : इमेज प्री-प्रोसेसिंग के लिए, यानी एल्गोरिदम को देने के लिए इमेज को और कच्चे रूप में बदलना, मैंने 2 तरीके इस्तेमाल किए:

  1. आरजीबी से एचएसवी में रंग डोमेन को बदलना और "लाल" रंग के आधार पर फ़िल्टरिंग करना, नारंगी जैसे रंगों से बचने के लिए एक निश्चित सीमा से ऊपर संतृप्ति, और अंधेरे टन से बचने के लिए कम मूल्य का फ़िल्टर करना। अंतिम परिणाम एक द्विआधारी काले और सफेद छवि थी, जहां सभी सफेद पिक्सेल इस सीमा से मेल खाने वाले पिक्सल का प्रतिनिधित्व करेंगे। स्पष्ट रूप से छवि में अभी भी बहुत अधिक बकवास है, लेकिन यह उन आयामों की संख्या को कम करता है जिनके साथ आपको काम करना है। बायनेरिज़्ड छवि
  2. शोर को कम करने के लिए माध्य फ़िल्टरिंग (सभी पड़ोसियों के माध्य पिक्सेल मूल्य और पिक्सेल को इस मान से प्रतिस्थापित करें) का उपयोग करके शोर फ़िल्टरिंग।
  3. 2 पूर्ववर्ती चरणों के बाद सभी वस्तुओं के आकृति प्राप्त करने के लिए कैनी एज डिटेक्शन फ़िल्टर का उपयोग करना । कंटूर का पता लगाना

एल्गोरिथम : इस कार्य के लिए जिस एल्गोरिथ्म को मैंने स्वयं चुना था, उसे फीचर निष्कर्षण की इस भयानक पुस्तक से लिया गया था और इसे सामान्यीकृत हूप ट्रांसफ़ॉर्म (नियमित हफ़ ट्रांसफ़ॉर्म से अलग) कहा जाता है। यह मूल रूप से कुछ बातें कहता है:

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

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

GHT

आपके पास एक बार ऐसा करने के लिए, एक साधारण सीमा-आधारित हेयुरिस्टिक आपको केंद्र पिक्सेल का स्थान दे सकता है, जिसमें से आप स्केल और रोटेशन को प्राप्त कर सकते हैं और फिर इसके चारों ओर अपनी छोटी आयत की साजिश कर सकते हैं (अंतिम पैमाने और रोटेशन का कारक स्पष्ट रूप से आपके सापेक्ष होगा) मूल टेम्पलेट)। सिद्धांत में कम से कम ...

परिणाम : अब, जबकि यह दृष्टिकोण बुनियादी मामलों में काम करता था, कुछ क्षेत्रों में इसकी कमी थी:

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

क्या आप चार विशिष्ट मुद्दों को हल करने के लिए, विशेष रूप से OpenCV सुविधाओं का उपयोग करके, मेरे विशिष्ट एल्गोरिथ्म को बेहतर बनाने में मेरी मदद कर सकते हैं ?

मुझे उम्मीद है कि कुछ लोग इससे बाहर भी कुछ सीखेंगे, आखिरकार मुझे लगता है कि सवाल पूछने वाले लोगों को ही नहीं सीखना चाहिए। :)


45
यह कहा जा सकता है कि यह सवाल dsp.stackexchange.com, याysts.stackexchange.com पर अधिक उपयुक्त है, और आपको निश्चित रूप से उन साइटों पर भी फिर से विचार करना चाहिए।
ईली

49
यहां पहली बात यह विश्लेषण करना है कि विभिन्न विफलता के मामले क्यों हो रहे हैं। उदाहरण के लिए, उन स्थानों के उदाहरणों को अलग करें जहां बोतलें जीतती हैं, जहां छवियां फ़र्ज़ी हैं, आदि, और कुछ सांख्यिकीय विश्लेषण करते हैं ताकि उनके हाफ़ अभ्यावेदन और उन लोगों के बीच अंतर जानने के लिए जो आप चाहते हैं कि यह पता चलेगा। वैकल्पिक दृष्टिकोणों के बारे में जानने के लिए कुछ बेहतरीन जगहें यहाँ और यहाँ हैं
ely

7
@ स्टाकर एक अच्छा बिंदु बनाता है। गति के लिए आप सस्ते-से-कंप्यूट सुविधाओं को प्राप्त करना चाहते हैं, जैसे कि उन्मुख ग्रेडिएंट्स के हिस्टोग्राम। वास्तव में भोली पहली दृष्टिकोण कुछ प्रशिक्षण छवियों में आयतों का एक गुच्छा मैन्युअल रूप से लेबल करने के लिए होगा, और इन प्लस यादृच्छिक नकारात्मक उदाहरणों का उपयोग करके एक एसवीएम या निर्णय-ट्री क्लासिफायरियर को प्रशिक्षित कर सकते हैं। प्रशिक्षण में अधिक समय लगेगा, लेकिन उपन्यास चित्रों पर निष्पादन बहुत तेज होगा। मैं इस विधि को लिखने की योजना बना रहा हूं जब मुझे सही संदर्भों को शामिल करने के लिए अधिक खाली समय मिलता है।
एली

9
कैसे reCAPTCHA के समान दृष्टिकोण के बारे में ? ;)
जॉर्ज डकेट

39
इसे dsp.stackexchange.com से क्यों स्थानांतरित किया गया ? ऐसा लगता है कि यह साइट
स्टैकओवरफ्लो

जवाबों:


672

स्केल-इनवेरिएंट फ़ीचर ट्रांसफ़ॉर्म (SIFT) या स्पीड अप रोबस्ट फीचर्स (SURF) का उपयोग कर एक वैकल्पिक दृष्टिकोण (की - पॉइंट्स ) निकालना होगा

इसे OpenCV 2.3.1 में लागू किया गया है ।

आप किसी ज्ञात ऑब्जेक्ट को खोजने के लिए Features2D + Homography में सुविधाओं का उपयोग करके एक अच्छा कोड उदाहरण पा सकते हैं

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

यहां छवि विवरण दर्ज करें

छवि स्रोत: ट्यूटोरियल उदाहरण

SIFT के लिए प्रोसेसिंग में कुछ सौ ms लगते हैं, SURF थोड़ा तेज है, लेकिन यह वास्तविक समय के अनुप्रयोगों के लिए उपयुक्त नहीं है। ORB FAST का उपयोग करता है जो रोटेशन इंवेरियन के संबंध में कमजोर है।

मूल कागजात


6
मैं @stacker से सहमत हूं - SIFT एक उत्कृष्ट पसंद है। यह पैमाने और रोटेशन संचालन के खिलाफ बहुत मजबूत है। यह परिप्रेक्ष्य विकृति के खिलाफ कुछ हद तक मजबूत है (इसे स्टैकर द्वारा सुझाए गए अनुसार बेहतर बनाया जा सकता है: एक टेम्प्लेट डेटाबेस जो वांछित ऑब्जेक्ट के विभिन्न परिप्रेक्ष्य विचारों के साथ है)। मेरे अनुभव में इसकी एच्लीस की एड़ी मजबूत प्रकाश विविधता और बहुत महंगी गणना होगी। मैं किसी भी जावा कार्यान्वयन के बारे में नहीं जानता। मैं एक OpenCV कार्यान्वयन से अवगत हूं और एक GPU c ++ / Windows ( SiftGPU ) कार्यान्वयन का उपयोग किया है, जो रियलटाइम प्रदर्शन के लिए उपयुक्त है।

31
चेतावनी का एक नोट: जितना मुझे SIFT / SURF से प्यार है और उन्होंने मेरे साथ क्या किया है, वे पेटेंट से प्रेरित हैं। भौगोलिक स्थिति AFAIK सहित कई स्थितियों के आधार पर यह एक समस्या हो सकती है।
Agos

12
तो OpenCV के ORB या FREAK को आज़माएं जिसमें कोई पेटेंट समस्या नहीं है। ORB SIFT की तुलना में बहुत तेज है। ORB यह मेरे अनुभव में बड़े पैमाने पर और हल्के बदलावों के साथ थोड़ा खराब है, लेकिन इसे स्वयं परखें।
रुई मार्केस

66
आप इसे उत्तर के रूप में कैसे स्वीकार कर सकते हैं ... फीचर डिस्क्रिप्टर में से कोई भी एक डिब्बे से बोतलों को अलग नहीं कर सकता है .. वे सभी केवल स्थानीय पैटर्न डिस्क्रिप्टर को देखते हैं। मैं मानता हूँ कि SIFT, SURF, ORB, FREAK आदि आपको फ़ीचर मिलान में मदद कर सकते हैं लेकिन .. प्रश्न के अन्य भागों के बारे में क्या है जैसे कि पश्चात, बोतल बनाम कैन आदि। मुझे आशा है कि यह वास्तव में पूर्ण समाधान नहीं है यदि आप करेंगे आपकी समस्या का GOOGLED कर दिया है शायद पहला परिणाम यह उत्तर होगा।
1845 पर G453

11
@ G453 आप बिल्कुल सही हैं! संभवतः वह SHIFT के प्रदर्शन से मोहित हो गया था और यह भूल गया था कि सुविधा निष्कर्षण और मिलान
PROBLEM

383

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

हस्ताक्षर स्कैन लाइन

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

मुझे आश्चर्य होगा अगर यह एक रैखिक-कुशल एल्गोरिथ्म नहीं थे, या लगभग ऐसा ही था। यह स्पष्ट रूप से आपके कैन-बॉटल भेदभाव को संबोधित नहीं करता है, लेकिन कम से कम आपके पास अपने लोगो होंगे।

(अपडेट: बोतल की पहचान के लिए मैं लोगो से सटे कोक (ब्राउन लिक्विड) की तलाश करूंगा - जो कि बोतल के अंदर है। या, खाली बोतल के मामले में, मैं एक ऐसी टोपी की तलाश करूंगा, जिसमें हमेशा एक टोपी होगी। एक ही मूल आकार, आकार, और लोगो से दूरी और आम तौर पर सभी सफेद या लाल रंग के होंगे। ठोस रंग के अण्डाकार आकार की खोज करें जहाँ एक टोपी होनी चाहिए, जो लोगो के सापेक्ष हो। मूर्खतापूर्ण नहीं है, लेकिन यहाँ आपका लक्ष्य होना चाहिए। खोजने के लिए आसान लोगों को तेजी से ।)

(मेरी छवि प्रसंस्करण के दिनों में कुछ साल हो गए हैं, इसलिए मैंने इस सुझाव को उच्च-स्तरीय और अवधारणात्मक रखा। मुझे लगता है कि यह थोड़ा अनुमानित हो सकता है कि एक मानव आंख कैसे संचालित हो सकती है - या कम से कम मेरा मस्तिष्क कैसे काम करता है!)


24
यह एक बहुत अच्छा सुझाव है, मुझे विशेष रूप से यह तथ्य पसंद है कि यह एल्गोरिथ्म बहुत तेज़ होना चाहिए, भले ही यह कई झूठे नकारात्मक हो। मेरा एक छिपा लक्ष्य रोबोटिक्स के लिए वास्तविक समय में इस खोज का उपयोग करना है, ताकि एक अच्छा समझौता हो सके!
चार्ल्स मेंग्यूई

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

29
मुझे कोका-कोला लोगो के बहुत तेजी से पता लगाने के लिए बारकोड स्कैनर के लिए क्या मात्रा का उपयोग करने का विचार पसंद है । +1!
Li-aung Yip

8
इस मामले में हस्ताक्षरों की तलाश की समस्या यह है कि अगर हम कैन को दूसरी तरफ मोड़ते हैं, यानी हस्ताक्षर को छिपाते हैं, तो एल्गोरिथ्म कैन का पता लगाने में विफल हो जाएगा।
कर्लफिलिप

34
@karlphillip: अगर आप सिग्नेचर यानी लोगो को छुपाते हैं, तो लोगो की तलाश पर आधारित कोई भी तरीका फेल होने वाला है।
ली-आंग येप

162

मजेदार समस्या: जब मैंने आपकी बोतल की छवि को देखा तो मुझे लगा कि यह भी कर सकता है। लेकिन, एक इंसान के रूप में, जो मैंने अंतर बताने के लिए किया, वह यह है कि मैंने देखा कि यह एक बोतल भी थी ...

तो, डिब्बे और बोतलों को अलग-अलग बताने के लिए, पहले बोतलों के लिए स्कैन करने के बारे में कैसे? यदि आप एक पाते हैं, तो डिब्बे की तलाश करने से पहले लेबल को बाहर निकाल दें।

लागू करने के लिए बहुत मुश्किल नहीं है अगर आप पहले से ही डिब्बे कर रहे हैं। वास्तविक नकारात्मक पक्ष यह है कि यह आपके प्रसंस्करण समय को दोगुना करता है। (लेकिन वास्तविक दुनिया अनुप्रयोगों के लिए आगे सोच, आप वैसे भी बोतलें खत्म करना चाहते हैं ;-)


5
हां, मैंने इसके बारे में भी सोचा है, लेकिन इसे करने के लिए ज्यादा समय नहीं था। आप एक बोतल को कैसे पहचानेंगे, क्योंकि यह मुख्य भाग एक स्केल्ड कैन जैसा दिखेगा? मैं सोच रहा था कि लाल प्लग को भी देखूं और देखूं कि क्या यह बोतलबंद केंद्र के साथ संरेखित है, लेकिन यह बहुत मजबूत नहीं लगता है।
चार्ल्स मेंग्यु

42
यदि "कोका कोला" के समानांतर एक लाल टोपी (या अंगूठी) है, तो यह एक बोतल है।
लुकाज़ मैडन

@linker आपने डिब्बे के लिए अपने एल्गोरिदम को कैसे प्रशिक्षित किया? क्या आपके पास डिब्बे के उदाहरण हैं? बोतलों के उदाहरण के साथ प्रशिक्षण के बारे में कैसे?
स्यामई

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

7
अनिवार्य रूप से यह एक उचित दिशा है। मैं इसे थोड़ा अलग बताता हूं: पहले सभी उम्मीदवारों को ढूंढें, और फिर प्रत्येक उम्मीदवार यह निर्धारित करें कि क्या यह एक बोतल, एक कैन, या कुछ और है।
MSalters

131

क्या दूसरी छवि में बोतल और कैन के बीच अंतर करना मनुष्यों के लिए भी मुश्किल नहीं है (बशर्ते बोतल का पारदर्शी क्षेत्र छिपा हो)?

वे बहुत छोटे क्षेत्र को छोड़कर लगभग समान हैं (अर्थात, कैन के शीर्ष पर चौड़ाई थोड़ी छोटी है जबकि बोतल का आवरण पूरे चौड़ाई में समान है, लेकिन एक छोटा परिवर्तन सही है?)

मेरे दिमाग में सबसे पहली बात आई कि बोतल के लाल टॉप के लिए जांच करना। लेकिन यह अभी भी एक समस्या है, अगर बोतल के लिए कोई शीर्ष नहीं है, या यदि यह आंशिक रूप से छिपा हुआ है (जैसा कि ऊपर उल्लेख किया गया है)।

दूसरी बात जो मुझे लगी वह थी बोतल की पारदर्शिता के बारे में। OpenCV में एक छवि में पारदर्शी वस्तुओं को खोजने पर कुछ काम हैं। नीचे दिए गए लिंक की जाँच करें।

यह देखने के लिए विशेष रूप से देखें कि वे ग्लास का कितना सही पता लगा रहे हैं:

उनका कार्यान्वयन परिणाम देखें:

यहां छवि विवरण दर्ज करें

वे कहते हैं कि यह के । मैकहेनरी और जे। पोन्स, सीवीपीआर 2006 द्वारा पेपर "ए जियोडेसिक एक्टिव कंटूर फ्रेमवर्क फ़ॉर फाइंडिंग ग्लास" का कार्यान्वयन है

हो सकता है कि यह आपके मामले में थोड़ा मददगार हो, लेकिन बोतल भर जाने पर फिर से समस्या उत्पन्न हो सकती है।

इसलिए मुझे लगता है कि, आप पहले बोतलों के पारदर्शी शरीर की खोज कर सकते हैं या बाद में दो पारदर्शी वस्तुओं से जुड़े एक लाल क्षेत्र के लिए, जो स्पष्ट रूप से बोतल है। (आदर्श रूप से काम करते समय, एक छवि निम्नानुसार है।)

यहां छवि विवरण दर्ज करें

अब आप पीले क्षेत्र, बोतल के लेबल को हटा सकते हैं और कैन को खोजने के लिए अपना एल्गोरिथ्म चला सकते हैं।

वैसे भी, इस समाधान में अन्य समाधानों की तरह अलग-अलग समस्याएं भी हैं।

  1. यह केवल तभी काम करता है जब आपकी बोतल खाली हो। उस स्थिति में, आपको दो काले रंगों (यदि कोका कोला तरल काला है) के बीच लाल क्षेत्र की खोज करनी होगी।
  2. एक और समस्या अगर पारदर्शी भाग को कवर किया गया है।

लेकिन वैसे भी, अगर तस्वीरों में उपरोक्त समस्याओं में से कोई भी नहीं है, तो यह एक बेहतर तरीका है।


+1 मैंने इस बारे में सोचा और इस दृष्टिकोण को लागू करने के लिए मेरे रास्ते में था। हालाँकि, @linker को अपनी छवियों का सेट साझा करना चाहिए ताकि हम अधिक शिक्षित अनुमान लगाने की कोशिश कर सकें।
कर्लफिलिप

हाँ .. मैं भी सोच रहा हूँ कि अगर और चित्र होते तो अच्छा था।
आबिद रहमान के

यह देखते हुए कि हमारे पास केवल बोतलें / डिब्बे के लिए लेबल हैं और बोतल कैप या पारदर्शिता के अन्य विशिष्ट कारकों में से कोई भी या ऊपर / नीचे नहीं हो सकता है - बोतल की चौड़ाई कैन की चौड़ाई से अलग है।
केन

क्या होगा अगर बोतल के लिए लोगो के सामने एक कैन रखा जाए?
एल्गो रीथ्म

51

मैं वास्तव में डैरेन कुक और इस समस्या के लिए स्टेकर के जवाब पसंद करता हूं । मैं उन पर एक टिप्पणी में अपने विचारों को फेंकने के बीच में था, लेकिन मेरा मानना ​​है कि मेरा दृष्टिकोण यहां छोड़ने के लिए बहुत उत्तर-आकार का है।

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

यहां रहस्य यह निर्धारित कर रहा है कि नकारात्मक स्थान के माध्यम से क्या दृश्य विशेषताएं शामिल हो सकती हैं या, अन्य कोक उत्पादों के लिए क्या विशेषताएं मौजूद हैं जो डिब्बे के लिए मौजूद नहीं हैं। उस अंत तक, वर्तमान शीर्ष उत्तर स्केच का चयन करने के लिए एक बुनियादी दृष्टिकोण "अगर" कर सकता है और केवल अगर "बोतल" की पहचान नहीं की जाती है, या तो बोतल कैप, तरल, या अन्य समान दृश्य हेयुरिस्टिक्स की उपस्थिति से।

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

इस अंत तक, कैन के लिए सबसे सही चयन मानदंड निम्नलिखित प्रतीत होते हैं:

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

आपका वर्गीकरण तब निम्न की तरह लग सकता है:

  • प्रत्येक उम्मीदवार मैच के लिए, यदि कोका कोला लोगो की उपस्थिति का पता चला था, तो एक ग्रे बॉर्डर ड्रा करें।
  • +2 से अधिक के प्रत्येक मैच के लिए, एक लाल बॉर्डर ड्रा करें।

यह उस उपयोगकर्ता के लिए नेत्रहीन रूप से हाइलाइट किया गया था, जो कमजोर सकारात्मकता पर जोर देता है, जो सही ढंग से, मैंगल्ड डिब्बे के रूप में पाया जा सकता है।

प्रत्येक संपत्ति का पता लगाना बहुत अलग समय और स्थान की जटिलता को वहन करता है, और प्रत्येक दृष्टिकोण के लिए, http://dsp.stackexchange.com के माध्यम से एक त्वरित पास आपके उद्देश्यों के लिए सबसे सही और सबसे कुशल एल्गोरिदम का निर्धारण करने के लिए उचित से अधिक है। मेरा इरादा यहाँ है, विशुद्ध रूप से और बस, इस बात पर जोर देने के लिए कि यदि कोई ऐसा है जो उम्मीदवार का पता लगाने के स्थान के एक छोटे से हिस्से को अमान्य कर सकता है , तो इस समस्या का सबसे मजबूत या प्रभावी समाधान नहीं है, और आदर्श रूप से, आपको उचित कार्यवाही करनी चाहिए तदनुसार।

और हे, हैकर न्यूज़ पोस्टिंग पर बधाई ! कुल मिलाकर, यह एक बहुत ही शानदार सवाल है जो इसे प्राप्त प्रचार के योग्य है। :)


2
यह एक दिलचस्प दृष्टिकोण है जो कम से कम एक कोशिश के लायक है, मैं वास्तव में समस्या पर आपके तर्क को पसंद करता हूं
चार्ल्स मेंग्यू

यह मैं क्या सोच रहा था की तरह है: झूठी सकारात्मक के विशेष प्रकार से इंकार नहीं करते। एक कोक क्या कर सकता है की अधिक विशेषताओं में नियम। लेकिन मैं सोच रहा हूँ: तुम क्या कर सकते हो के बारे में एक स्क्वीड? मेरा मतलब है, यदि आप एक कोक पर कदम रखते हैं तो यह अभी भी एक कोक हो सकता है। लेकिन इसका आकार अब नहीं होगा। या वह समस्या AI- कम्पलीट है?
इयान

41

आकार को देखते हुए

कैन / बोतल के लाल भाग के आकार में एक गैंडर लें। ध्यान दें कि बोतल के लेबल के सीधे होने पर कैन थोड़ा ऊपर से कैसे टैप कर सकता है। आप इसकी लंबाई के बीच लाल हिस्से की चौड़ाई की तुलना करके इन दोनों में अंतर कर सकते हैं।

हाइलाइटिंग को देखते हुए

बोतल और डिब्बे के बीच अंतर करने का एक तरीका सामग्री है। एक बोतल प्लास्टिक से बनी होती है जबकि एक एल्यूमीनियम धातु से बनी होती है। पर्याप्त रूप से अच्छी तरह से प्रकाशित स्थितियों में, स्पेक्युलैरिटी को देखते हुए कैन लेबल से बोतल लेबल को बताने का एक तरीका होगा।

जहाँ तक मैं बता सकता हूँ, कि एक मानव दो प्रकार के लेबलों के बीच के अंतर को कैसे बताएगा। यदि प्रकाश की स्थिति खराब है, तो दो रास्ते को अलग करने में कुछ अनिश्चितता है। उस मामले में, आपको स्वयं पारदर्शी / पारभासी बोतल की उपस्थिति का पता लगाने में सक्षम होना चाहिए।


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

अपने उदाहरण में, ध्यान दें कि प्लास्टिक लेबल के लिए स्पेक्युलैरिटी कैन पर बहुत चमकीले धब्बों की तुलना में बहुत अधिक फैलता है? ऐसा आप बता सकते हैं।
tskuzzy

मैं देखता हूं, इस मामले में आप अपने एल्गोरिथ्म में स्पेकुलैरिटी को पकड़ने के लिए किस तरह के रंग अंतरिक्ष प्रतिनिधित्व का उपयोग करेंगे? यह आरजीबी या एचएसवी
चार्ल्स मेंग्यु

2
यदि प्रकाश स्रोत कैन के पीछे हो तो क्या होगा? मुझे लगता है कि आप हाइलाइट नहीं देखेंगे।
रुई मार्केज

37

कृपया Zdenek Kalal के प्रीडेटर ट्रैकर पर एक नज़र डालें । इसके लिए कुछ प्रशिक्षण की आवश्यकता होती है, लेकिन यह सक्रिय रूप से सीख सकता है कि कैसे ट्रैक की गई वस्तु अलग-अलग झुकावों और पैमानों को देखती है और इसे वास्तविक समय में करती है!

स्रोत कोड उसकी साइट पर उपलब्ध है। यह MATLAB में है , लेकिन शायद एक जावा कार्यान्वयन पहले से ही समुदाय के सदस्य द्वारा किया गया है। मैंने सी # में TLD के ट्रैकर भाग को सफलतापूर्वक लागू किया है। अगर मुझे सही तरीके से याद है, तो TLD फर्न्स का इस्तेमाल कर रहे हैं। यदि ट्रैकर द्वारा खोई गई वस्तु को दोबारा प्राप्त करने के लिए मैं (या पहले ही @stacker द्वारा सुझाए गए) SURF या SIFT का उपयोग करता हूं। ट्रैकर की प्रतिक्रिया समय के साथ निर्माण करने के लिए आसान बनाती है sift / सर्फ टेम्पलेट्स की एक गतिशील सूची जो समय के साथ ऑब्जेक्ट को बहुत उच्च परिशुद्धता के साथ पुनः प्राप्त करने में सक्षम करती है।

यदि आप ट्रैकर के मेरे C # कार्यान्वयन में रुचि रखते हैं, तो बेझिझक पूछें।


दिलचस्प दिखने वाले लिंक के लिए धन्यवाद। प्रशिक्षण के संबंध में, प्रशिक्षण सेट का आकार क्या है जो उचित परिणाम प्राप्त करने के लिए उचित होगा? यदि आपके पास c # में भी कार्यान्वयन है तो यह बहुत उपयोगी होगा!
चार्ल्स मेंगयू

TLD पर शोध करते समय, मैंने एक अन्य उपयोगकर्ता को C # कार्यान्वयन की तलाश में पाया --- क्या कोई कारण नहीं है कि आप अपना काम गिथब पर रखें? stackoverflow.com/questions/29436719/…
स्पिलनर

2
एनबी इयर्स, बाद में, लिंक अब मर चुका है
जे इवांस

33

यदि आप केवल एक कैमरे तक सीमित नहीं हैं, जो आपके किसी अवरोध में नहीं था, तो शायद आप Xbox Kinect जैसे रेंज सेंसर का उपयोग करने के लिए आगे बढ़ सकते हैं । इससे आप छवि का गहराई और रंग आधारित मिलान विभाजन कर सकते हैं। यह छवि में वस्तुओं को तेजी से अलग करने की अनुमति देता है। फिर आप आईसीपी मिलान या इसी तरह की तकनीकों का उपयोग कर सकते हैं, यहां तक ​​कि कैन के आकार से मेल खाने के लिए, बल्कि इसकी रूपरेखा या रंग और यह देखते हुए कि यह किसी भी अभिविन्यास के लिए एक वैध विकल्प हो सकता है यदि आपके पास लक्ष्य का पिछला 3 डी स्कैन है। ये तकनीकें अक्सर बहुत जल्दी होती हैं, खासकर जब ऐसे विशिष्ट उद्देश्य के लिए उपयोग की जाती हैं जो आपकी गति की समस्या को हल करना चाहिए।

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


3
वास्तव में मैंने यह नहीं बताया कि पोस्ट में है, लेकिन इस असाइनमेंट के लिए मुझे लगभग 30 छवियों का एक सेट दिया गया था, और एक एल्गोरिथ्म करना था जो वर्णित के रूप में विभिन्न स्थितियों में उन सभी से मेल खाएगा। बेशक अंत में एल्गोरिथ्म का परीक्षण करने के लिए कुछ छवियां आयोजित की गईं। लेकिन मैं Kinect सेंसर के विचार को पसंद करता हूं, और मैं इस विषय पर अधिक पढ़ना पसंद करूंगा!
चार्ल्स मेन्गुय

लगभग एक तंत्रिका नेटवर्क के साथ प्रशिक्षण के आकार का क्या संतोषजनक परिणाम होगा? इस विधि के साथ यह भी अच्छा है कि मुझे लगभग सभी चीज़ों के मिलान के लिए केवल एक टेम्पलेट की आवश्यकता है।
चार्ल्स मेंग्यु

2
यदि आपके चित्रों का सेट पूर्वनिर्धारित और सीमित है, तो आपके प्रोग में केवल कट्टर सही परिणाम?)
sne11ius

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

प्रशिक्षण सेटों की संख्या अलग-अलग होती है, आपको कुछ चीजों से सावधान रहना होगा: हालांकि, ट्रेन के ऊपर नहीं, आप शायद यह निर्धारित करने के लिए एक परीक्षण सेट चाहते हैं कि आपकी सटीकता कैसी है। इसके अलावा प्रशिक्षण सेटों की संख्या आपके द्वारा उपयोग की जाने वाली परतों की संख्या पर निर्भर करेगी।
शानदार श्री लोमड़ी

24

मैं लाल आयतों का पता लगाता हूँ: RGB -> HSV, फ़िल्टर लाल -> बाइनरी इमेज, क्लोज (फिर डिलेट, इरोड, जिसे मैटलैब के रूप imcloseमें जाना जाता है)

फिर सबसे बड़े से सबसे छोटे तक आयतों के माध्यम से देखें। एक ज्ञात स्थिति / स्केल में छोटे आयत वाले आयत दोनों को हटाया जा सकता है (यह मानकर कि बोतल अनुपात स्थिर है, छोटी आयत एक बोतल कैप होगी)।

यह आपको लाल आयतों के साथ छोड़ देगा, फिर आपको किसी तरह लोगो को यह बताने की आवश्यकता होगी कि क्या वे एक लाल आयत या कोक कर सकते हैं। OCR की तरह, लेकिन एक ज्ञात लोगो के साथ?


2
जैसे कि यह डीएसपी पर थोड़े समय में चर्चा की जा रही थी जब इसे स्थानांतरित किया गया था, कुछ बोतलों में प्लग नहीं हो सकता है;) या प्लग आंशिक रूप से छिपा हो सकता है।
चार्ल्स मेंग्यूई

22

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


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

मैंने यह भी जाँच की है कि ऊँचाई के अनुपात की चौड़ाई बोतल और कैन के समान है, इसलिए यह वास्तव में एक विकल्प भी नहीं है।
चार्ल्स मेन्गुय

लेबल अनुपात (यह ट्रेडमार्क है) समान है। इसलिए यदि (बड़ी) बोतल चित्र पर थोड़ी दूर है, तो इसका आकार बिल्कुल कैन जैसा ही होगा।
littleadv

3
थोड़ा और समझाने के लिए। मान लीजिए कि z = 0 पर है और z = -100 पर बोतल है। चूंकि बोतल बहुत पीछे है, यह छोटा दिखेगा। लेकिन अगर मुझे पता है कि बोतल z = -100 पर है और z = 0 पर है, तो मैं कैन / बोतल के अपेक्षित आकार की गणना कर सकता हूं यदि दोनों का z = 0 पर अनुवाद किया जाए। इसलिए अब वे एक ही गहराई पर हैं और इसलिए मैं आकार के आधार पर निर्णय ले सकता हूं।
शरद

2
यह केवल एक टिप्पणी है, एक उत्तर नहीं है, लेकिन यह 120 वोटों के साथ टिप्पणी-के-ए-उत्तर की तुलना में एक उत्तर होने के बहुत करीब है।
फटी

22

हम्म, मुझे वास्तव में लगता है कि मैं किसी चीज़ पर हूं (यह अब तक का सबसे दिलचस्प सवाल है - इसलिए यह "सही" उत्तर खोजने की कोशिश जारी नहीं रखने के लिए शर्म की बात होगी, हालांकि एक स्वीकार्य एक मिल गया है) ।। ।

एक बार जब आप लोगो को ढूंढ लेते हैं, तो आपकी परेशानी आधी हो जाती है। तो फिर तुम केवल बाहर क्या हो रहा है के बीच मतभेद आंकड़ा करने के लिए है चारों ओर लोगो। इसके अतिरिक्त, हम जितना संभव हो उतना कम अतिरिक्त करना चाहते हैं। मुझे लगता है कि यह वास्तव में यह आसान हिस्सा है ...

लोगो के आसपास क्या है ? कैन के लिए, हम धातु को देख सकते हैं, जो प्रकाश के प्रभाव के बावजूद, अपने मूल रंग में जो भी परिवर्तित नहीं होता है। जब तक हम लेबल के कोण को जानते हैं, हम बता सकते हैं कि इसके ऊपर क्या है, इसलिए हम इनमें अंतर देख रहे हैं:

यहाँ, लोगो के ऊपर और नीचे पूरी तरह से अंधेरा है, रंग में सुसंगत है। उस संबंध में अपेक्षाकृत आसान है।

यहां, ऊपर और नीचे क्या हल्का है, लेकिन अभी भी रंग में सुसंगत है। यह ऑल-सिल्वर है, और ऑल-सिल्वर मेटल वास्तव में बहुत दुर्लभ है, साथ ही सामान्य रूप से सिल्वर रंग भी। इसके अतिरिक्त, यह एक पतले स्लेरो में है और लाल रंग के काफी करीब है जिसे पहले से ही पहचाना जा चुका है ताकि आप अपनी पूरी लंबाई के लिए इसकी आकृति का पता लगा सकें कि कैन की धातु की अंगूठी को क्या माना जा सकता है। वास्तव में, आपको इसे बताने के लिए कैन के साथ कहीं भी एक छोटे से हिस्से की आवश्यकता होती है, लेकिन आपको अभी भी एक संतुलन खोजने की आवश्यकता है जो यह सुनिश्चित करता है कि यह सिर्फ एक खाली बोतल नहीं है जिसके पीछे कुछ धातु है।

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

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

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

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

  • मुख्य आकर्षण का पता लगाएं (लाल लोगो पृष्ठभूमि, और संभवतः अभिविन्यास के लिए खुद लोगो, हालांकि मामले को दूर कर दिया जा सकता है, तो आपको अकेले लाल पर ध्यान केंद्रित करने की आवश्यकता है)
  • आकार और अभिविन्यास की पुष्टि करें, फिर भी बहुत विशिष्ट लालिमा के माध्यम से
  • आकार के चारों ओर रंगों की जाँच करें (क्योंकि यह जल्दी और दर्द रहित है)
  • अंत में, यदि आवश्यक हो, तो सही गोलाई के लिए मुख्य आकर्षण के चारों ओर उन रंगों के आकार को सत्यापित करें।

यदि आप ऐसा नहीं कर सकते हैं, तो इसका मतलब यह है कि कैन के ऊपर और नीचे कवर किया गया है, और केवल संभव चीजें जो मानव एक मज़बूती से कैन और बोतल के बीच अंतर करने के लिए इस्तेमाल कर सकता है, वह है रोड़ा और प्रतिबिंब कैन की, जो प्रक्रिया के लिए एक बहुत कठिन लड़ाई होगी। हालाँकि, आगे भी जाने के लिए, आप अन्य उत्तर में वर्णित अर्ध-पारदर्शी स्कैनिंग तकनीकों का उपयोग करके, अधिक बोतल जैसे लक्षणों की जांच करने के लिए कैन / बोतल के कोण का अनुसरण कर सकते हैं।

दिलचस्प अतिरिक्त बुरे सपने में बोतल के पीछे इतनी आसानी से बैठना शामिल हो सकता है कि इसका धातु सिर्फ लेबल के ऊपर और नीचे दिखाने के लिए होता है, जो तब भी विफल रहेगा जब तक आप लाल रंग की पूरी लंबाई के साथ स्कैन कर रहे हैं। लेबल - जो वास्तव में एक समस्या है, क्योंकि आप एक कैन का पता नहीं लगा सकते हैं जहां आप हो सकते हैं, जैसा कि यह विचार करने के विपरीत है कि आप वास्तव में एक बोतल का पता लगा रहे हैं, जिसमें दुर्घटना भी शामिल है। गिलास आधा खाली है, उस स्थिति में!


डिस्क्लेमर के रूप में, मेरे पास न तो कोई अनुभव है और न ही मैंने कभी इस सवाल के बाहर इमेज प्रोसेसिंग के बारे में सोचा है, लेकिन यह इतना दिलचस्प है कि इससे मुझे इसके बारे में बहुत गहराई से सोचने को मिला, और अन्य सभी उत्तरों को पढ़ने के बाद, मैं संभवतः इस पर विचार करता हूं सबसे आसान और सबसे कुशल तरीका है इसे पूरा करने का। व्यक्तिगत रूप से, मुझे खुशी है कि मुझे वास्तव में इस बारे में सोचने की ज़रूरत नहीं है !

संपादित करें

एमएस पेंट में कैन की खराब ड्राइंग इसके अतिरिक्त, इस चित्र को मैंने MS Paint में किया है ... यह बिल्कुल भयानक और काफी अधूरा है, लेकिन अकेले आकार और रंगों के आधार पर, आप अनुमान लगा सकते हैं कि यह संभवतः क्या होने जा रहा है। संक्षेप में, ये एकमात्र ऐसी चीजें हैं जिनके लिए स्कैनिंग को परेशान करने की आवश्यकता है। जब आप रंगों के बहुत विशिष्ट आकार और संयोजन को देखते हैं, तो यह संभवतः और क्या हो सकता है? बिट मैंने पेंट नहीं किया, सफेद पृष्ठभूमि, "कुछ भी असंगत" माना जाना चाहिए। यदि इसकी पारदर्शी पृष्ठभूमि होती, तो यह लगभग किसी भी अन्य छवि पर जा सकता था और आप इसे देख सकते थे।


10
लाल रंग की विशेष छाया ज्यादातर व्यक्तिपरक है और प्रकाश विचारों और सफेद संतुलन से बहुत प्रभावित होती है। आप आश्चर्यचकित हो सकते हैं कि वे कितना बदल सकते हैं। उदाहरण के लिए, इस चेकबोर्ड भ्रम पर विचार करें ।
ऑक्टोपस

1
@Octopus द्वारा पोस्ट किए गए लिंक का अपडेट: persci.mit.edu/gallery/checkershadow
Hat

एक धारणा भ्रम प्रभावित नहीं करता है कि आपका वेब कैमरा क्या देखता है - यानी आपका कोड क्या है - केवल एक मानव आंख कैसे मदद करती है (?) मस्तिष्क को मूर्ख बनाती है।
बरनी

17

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

लेकिन जाहिर है कि यह एल्गोरिथ्म उन मामलों में विफल हो जाएगा जहां शीर्ष को छिपाया जाता है, लेकिन ऐसे मामले में भी मानव दोनों के बीच अंतर करने में सक्षम नहीं होगा (यदि बोतल का कोका कोला भाग केवल दिखाई दे सकता है)


1
मेरा भी यही विचार था, लेकिन मुझे लगता है कि कैन के ऊपर की सिल्वर लाइनिंग चित्र पर कैन के कोण के आधार पर नाटकीय रूप से बदल सकती है। यह एक सीधी रेखा या एक वृत्त हो सकता है। शायद वह संदर्भ के रूप में दोनों का उपयोग कर सकता है?
एलेक्सिस डफ्रेनॉय

15

मुझे चुनौती पसंद है और मैं एक जवाब देना चाहता हूं, जो इस मुद्दे को हल करता है, मुझे लगता है।

  1. लोगो के फीचर्स (की-पॉइंट, डिस्क्रिप्टर जैसे SIFT, SURF)
  2. लोगो की एक मॉडल छवि के साथ बिंदुओं का मिलान करें (Brute Force जैसे Matcher का उपयोग करके)
  3. कठोर शरीर के समन्वय का अनुमान लगाएं (PnP समस्या - SolvePnP)
  4. कठोर शरीर के अनुसार टोपी की स्थिति का अनुमान लगाएं
  5. बोतल की टोपी की छवि पिक्सेल स्थिति (आरओआई) का बैक-प्रोजेक्शन और गणना करें (मुझे लगता है कि आपके पास कैमरे के आंतरिक पैरामीटर हैं)
  6. एक विधि से जांचें कि टोपी वहां है या नहीं। अगर वहाँ है, तो यह बोतल है

टोपी का पता लगाना एक और मुद्दा है। यह या तो जटिल या सरल हो सकता है। अगर मैं तुम होते, तो मैं साधारण निर्णय के लिए ROI में रंग हिस्टोग्राम की जांच करता।

कृपया, प्रतिक्रिया दें यदि मैं गलत हूं। धन्यवाद।


13

इस सवाल का जवाब देने में कुछ साल देर हो गई। पिछले 5 वर्षों में सीएनएन द्वारा कला की अपनी सीमा को धक्का देने की स्थिति के साथ मैं इस कार्य को करने के लिए OpenCV का उपयोग नहीं करूंगा! ( मुझे पता है कि आप विशेष रूप से सवाल में OpenCv विशेषताएं चाहते थे ) मुझे लगता है कि ऑब्जेक्ट डिटेक्शन एल्गोरिदम जैसे कि तेज़-RCNN, YOLO, SSD आदि OpenCV सुविधाओं की तुलना में एक महत्वपूर्ण मार्जिन के साथ इस समस्या को स्वीकार करेंगे। अगर मैं इस समस्या से निपटने के लिए (6 साल के बाद !!) मैं निश्चित रूप से Faster-RCNN का उपयोग करता


5
ओपी ने कहा कि 30 उच्च-रिज़ॉल्यूशन वाली छवियां थीं, जो संभवतः कन्वीनिएंट के प्रशिक्षण के लिए सबसे अच्छा परिदृश्य नहीं है। न केवल वे बहुत कम (यहां तक ​​कि संवर्धित) हैं, उच्च-रेस वाला हिस्सा कन्वनेट्स को नष्ट कर देगा।
कोस्टा मुराटिडिस

11

मुझे आपका प्रश्न पसंद है, चाहे वह विषय से दूर हो या न हो: पी

एक दिलचस्प बात; मैंने अपनी डिग्री में एक विषय पूरा किया है जहाँ हमने रोबोटिक्स और कंप्यूटर विज़न को कवर किया है। सेमेस्टर के लिए हमारी परियोजना आपके द्वारा वर्णित एक के समान अविश्वसनीय थी।

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

आप इस विषय पर मेरे ब्लॉग पोस्ट पर हमारे दृष्टिकोण के बारे में पढ़ सकते हैं :)


2
दिलचस्प परियोजना लेकिन यह केवल आपके बहुत विशिष्ट सेटअप पर लागू होता है।
रुई मार्क्स

10

वस्तुओं को पहचानने के लिए उपयोग किए जाने वाले रंग विवरणकों का एक समूह है, नीचे दिए गए पेपर उनमें से बहुत से तुलना करते हैं। SIFT या SURF के साथ संयुक्त होने पर वे विशेष रूप से शक्तिशाली हैं। एक कोका कोला की छवि में SURF या SIFT अकेले बहुत उपयोगी नहीं हैं क्योंकि वे बहुत सारे ब्याज बिंदुओं को नहीं पहचानते हैं, आपको मदद करने के लिए रंग जानकारी की आवश्यकता है। मैं एक प्रोजेक्ट में SURF के साथ BIC (बॉर्डर / इंटीरियर पिक्सेल क्लासी with कटेशन) का उपयोग करता हूं और वस्तुओं को पहचानने के लिए बहुत अच्छा काम किया है।

वेब छवि पुनर्प्राप्ति के लिए रंग विवरणक: एक तुलनात्मक अध्ययन


10

ध्यान लगा के पढ़ना या सीखना

कोला के डिब्बे वाली कम से कम कुछ छवियों को इकट्ठा करें, उनके चारों ओर के बाउंडिंग बॉक्स को सकारात्मक कक्षाओं के रूप में एनोटेट करें, कोला की बोतलें और अन्य कोला उत्पादों में नकारात्मक कक्षाओं के साथ-साथ यादृच्छिक वस्तुओं को भी शामिल करें।

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

एक बार जब आप वर्गीकरण करने के लिए तंत्रिका नेटवर्क के निर्णय (अंतिम) परत का उपयोग करने के बजाय पहले से प्रशिक्षित गहन शिक्षण मॉडल (जैसे GoogleNet) को छवियों को खिलाते हैं, तो अपने वर्गीकरण को प्रशिक्षित करने के लिए पिछली परत के डेटा का उपयोग करें।

OpenCV और Google नेट: http://docs.opencv.org/trunk/d5/de7/tutorial_dnn_googlenet.html

OpenCV और SVM: http://docs.opencv.org/2.4/doc/tutorials/ml/introduction_to_svm/introduction_to_svm.html


9

आपको एक ऐसे कार्यक्रम की आवश्यकता है जो अनुभव से व्यवस्थित रूप से वर्गीकरण सटीकता सीखता है और सुधारता है।

मैं गहन शिक्षा का सुझाव दूंगा, गहन शिक्षा के साथ यह एक तुच्छ समस्या बन जाती है।

आप इंस्टेंस v3 मॉडल को Tensorflow पर पुनः प्राप्त कर सकते हैं:

नई श्रेणियों के लिए इंसेप्शन की अंतिम परत को कैसे पुनः धारण करें

इस मामले में, आप एक ऑब्जेक्ट को वर्गीकृत करने के लिए एक दोषपूर्ण तंत्रिका नेटवर्क का प्रशिक्षण लेंगे क्योंकि कोका-कोला या तो कर सकते हैं या नहीं।


2
हॉट डॉग या हॉट डॉग नहीं?
पीलापिलो

6

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

यह केवल डिब्बे निकालने के लिए उपयोगी हो सकता है और पारदर्शी वस्तुओं का पता लगाने के साथ जोड़ा जा सकता है।


3

MVTec से HALCON नामक एक कंप्यूटर विज़न पैकेज है जिसके डेमो आपको अच्छे एल्गोरिथम विचार दे सकते हैं। आपकी समस्या के समान बहुत सारे उदाहरण हैं जिन्हें आप डेमो मोड में चला सकते हैं और फिर कोड में ऑपरेटरों को देख सकते हैं और उन्हें मौजूदा OpenCV ऑपरेटरों से कैसे लागू कर सकते हैं।

मैंने इस पैकेज का उपयोग इस तरह की समस्याओं के लिए जटिल एल्गोरिदम को जल्दी से प्रोटोटाइप करने के लिए किया है और फिर मौजूदा ओपनसीवी सुविधाओं का उपयोग करके उन्हें कैसे लागू किया जाए, यह पता लगाया। विशेष रूप से आपके मामले के लिए आप OpenCV को लागू करने का प्रयास कर सकते हैं जो कि ऑपरेटर find_scaled_shape_model में एम्बेडेड है । कुछ ऑपरेटर एल्गोरिदम कार्यान्वयन के बारे में वैज्ञानिक पेपर की ओर इशारा करते हैं जो यह पता लगाने में मदद कर सकता है कि ओपनसीवी में कुछ ऐसा ही कैसे किया जाए। उम्मीद है की यह मदद करेगा...


0

यदि आप इसमें वास्तविक समय के लिए रुचि रखते हैं, तो आपको यह निर्धारित करने के लिए कि प्री-प्रोसेसिंग फिल्टर में क्या जोड़ना है, यह निर्धारित करने के लिए कि हेवी-ड्यूटी सामान के साथ स्कैन किया जाता है। एक अच्छा तेज़, बहुत वास्तविक समय, पूर्व-प्रसंस्करण फ़िल्टर जो आपको उन चीज़ों को स्कैन करने की अनुमति देगा जो एक कोका-कोला होने की संभावना रखते हैं, इससे पहले नहीं हो सकता इससे अधिक iffy चीजें कुछ इस तरह से चलती हैं: सबसे बड़ी पैच के लिए छवि खोजें रंग जो sqrt(pow(red,2) + pow(blue,2) + pow(green,2))आपके कोका-कोला कैन से दूर एक निश्चित सहिष्णुता है । बहुत सख्त रंग सहिष्णुता के साथ शुरू करें, और अधिक उदार रंग सहिष्णुता के लिए अपने तरीके से काम करें। फिर, जब आपका रोबोट वर्तमान फ़्रेम को संसाधित करने के लिए आवंटित समय से बाहर निकलता है, तो यह आपके उद्देश्यों के लिए वर्तमान में पाई गई बोतलों का उपयोग करता है। कृपया ध्यान दें कि आपको sqrt(pow(red,2) + pow(blue,2) + pow(green,2))सही तरीके से प्राप्त करने के लिए RGB रंगों को बदलना होगा।

इसके अलावा, यह वास्तव में गूंगा लगता है, लेकिन क्या आपने -oFastअपने सी कोड को संकलित करते समय संकलक अनुकूलन को चालू करना सुनिश्चित किया है?


0

शायद बहुत साल देर हो गई, लेकिन फिर भी कोशिश करने के लिए एक सिद्धांत।

बोतल / कैन के समग्र आयाम में लाल लोगो क्षेत्र की आयत को बांधने का अनुपात अलग है। कैन के मामले में, 1: 1 होना चाहिए, जबकि बोतल के साथ (टोपी के साथ या बिना) अलग होगा। इससे दोनों के बीच अंतर करना आसान हो जाता है।

अपडेट: लोगो क्षेत्र की क्षैतिज वक्रता उनके संबंधित आकार के अंतर के कारण कैन और बोतल के बीच भिन्न होगी। यह विशेष रूप से उपयोगी हो सकता है यदि आपके रोबोट को कैन / बोतल को लेने की आवश्यकता है, और आप तदनुसार पकड़ का फैसला करते हैं।


-1

पहली चीजें जो मैं देखूंगा, वे हैं रंग - जैसे RED, जब एक छवि में रेड आई डिटेक्टिंग करते हैं - पता लगाने के लिए एक निश्चित रंग रेंज होती है, तो इसके बारे में कुछ विशेषताएं आसपास के क्षेत्र पर विचार करती हैं और जैसे कि दूसरी आंख से अलग दूरी अगर यह वास्तव में छवि में दिखाई दे रहा है।

1: पहली विशेषता रंग है और लाल बहुत प्रमुख है। कोका कोला रेड का पता लगाने के बाद ब्याज 1 ए के कई आइटम हैं: यह लाल क्षेत्र कितना बड़ा है (क्या यह एक सच्चे कैन का निर्धारण करने के लिए पर्याप्त मात्रा में है या नहीं - 10 पिक्सल शायद पर्याप्त नहीं है), 1 बी: क्या यह शामिल है लेबल का रंग - "कोका-कोला" या लहर। 1 बी 1: क्या एक उच्च संभावना पर विचार करने के लिए पर्याप्त है कि यह एक लेबल है।

आइटम 1 शॉर्ट कट की तरह है - प्री-प्रोसेस अगर उस इमेज में डू सॉट मौजूद नहीं है - आगे बढ़ें।

तो अगर ऐसा है तो मैं अपनी छवि के उस सेगमेंट का उपयोग कर सकता हूं और सवाल के क्षेत्र में थोड़ा और बाहर ज़ूम करना शुरू कर सकता हूं - मूल रूप से आसपास के क्षेत्र / किनारों को देखें ...

2: उपरोक्त छवि क्षेत्र को 1 में देखते हुए - प्रश्न में आइटम के आसपास के बिंदुओं [किनारों] को सत्यापित करें। एक: वहाँ क्या एक ऊपर या नीचे - चांदी हो सकता है प्रतीत होता है? बी: एक बोतल पारदर्शी दिखाई दे सकती है, लेकिन इसलिए एक ग्लास टेबल हो सकती है - इसलिए एक ग्लास टेबल / शेल्फ या एक पारदर्शी क्षेत्र है - यदि ऐसा है तो कई संभावित बाहर आता है। बॉटल माईट में लाल रंग की टोपी होती है, यह नहीं हो सकता है, लेकिन इसमें या तो बॉटल टॉप / थ्रेड स्क्रू का आकार होना चाहिए, या कैप होना चाहिए। C: यदि यह A और B विफल रहता है, तब भी यह कैन - आंशिक हो सकता है .. यह अधिक जटिल है जब यह आंशिक होता है क्योंकि एक आंशिक बोतल / आंशिक समान दिखाई दे सकता है, इसलिए लाल क्षेत्र के किनारे के माप के कुछ और प्रसंस्करण करने के लिए .. छोटी बोतल आकार में समान हो सकती है ..

3: उपरोक्त विश्लेषण के बाद जब मैं लेटरिंग और वेव लोगो को देखूंगा - क्योंकि मैं अपनी खोज को कुछ अक्षरों में शब्दों में उन्मुख कर सकता हूं जैसा कि आप सभी के नहीं होने के कारण पाठ के सभी नहीं हो सकते हैं। कर सकते हैं, तरंग कुछ बिंदुओं पर पाठ (दूरी के अनुसार) में संरेखित हो जाएगी ताकि मैं उस संभावना को खोज सकूं और जान सकूं कि कौन-कौन से अक्षर दूरी x पर तरंग के उस बिंदु पर मौजूद हैं।


-9

यह एक पुरानी परियोजना है जिस पर मैंने काम किया है। जावास्क्रिप्ट के साथ उपयोग करने के लिए एमएपी छवियां बहुत आसान हैं। मैं आपको वस्तु प्रदान करता हूं, आप इसे पढ़ते हैं और इसका उपयोग करना जानते हैं। हमें MAP छवियों का उपयोग करने के लिए JQuery और अन्य प्रणालियों की आवश्यकता नहीं है।

    //Copyright Cherif yahiaoui, by ELEBAN.FR

//variables de flottement.
var myInstOne = null;
var globalize = null;

var eleban_preload_images = function (name, imgs, url){
try{
    var oThis = this;
    this.images = new Array();
    this.imageshover = new Array();
    this.imagesNames = new Array(imgs.split(";"));


        for(var i=0; i < this.imagesNames[0].length; i++){
            this.images[i] = new Image();
            this.imageshover[i] = new Image();
        }

    this.url = url;

    this.GetAbsoluteurl = function () {

    var img = new Image(); img.src = url;
    url = img.src; img = null; 
        this.url = url; 

    };

    this.Preload = function () {

        for(var i=0; i < this.imagesNames[0].length; i++){
            this.images[i].src = this.url+("btn-"+this.imagesNames[0][i]+".png");
            this.imageshover[i].src = this.url+("btn-"+this.imagesNames[0][i]+"-hover.png");
        }

    };
    this.GetAbsoluteurl();
    this.Preload();
}
finally {return;}
}

var g_preloaderhover = new eleban_preload_images("loaderhover","menu;malette;reservation;cabine;facebook;map;amis","./images/");


//variable arret flottement
var g_stopflo = false;

var myObjfloater = function(name, idname, itop, differ ) {
var oThis = this; // création d'une référence vers l'objet courant
this.name = name;
this.id =idname;
this.xstep= 0.3;
this.itime = 30;
this.obj = null;
this.y = itop;
this.yadd = 0;
this.up = true;
this.pause = false;
this.differ = differ;
this.coordsimage = null;
this.objimg = null;
this.initimages = false;
this.compteur = 0;
this.over = false;
this.timeoutstop = null;
try{
this.initimage = function(){
var img = this.obj.getElementsByTagName('img')[0];
this.coordsimage = new Array(img.width, img.height);
this.objimg = img;
this.initimages = true;
};


this.myMethod = function() {
if(!g_stopflo){
    if(this.differ != 0){ 
this.differ=this.differ-0.1; 
}else{

if(this.obj){
if(this.over == false){
    this.yadd=this.yadd+0.1; this.itime = this.itime + 10;
this.obj.style.visibility = "hidden";
this.y = ((this.up)? this.y - this.yadd : this.y + this.yadd);
this.obj.style.marginTop = this.y +"%" ;
this.obj.style.visibility = "visible";

if (this.yadd > this.xstep){ 
    this.up = (this.up)? false : true;
    this.yadd = -0.1; this.itime=180;
}
}
}else{
    if (document){
        if(document.getElementById) {
         this.obj = document.getElementById(this.id); 
        //this.y = this.obj.offsetTop;
        }else{
        if(document.getElementByTagName) { this.obj = document.getElementByTagName(this.id); this.y = this.obj.offsetTop;}
        }

    }
}
}
this.timeoutstop=setTimeout(function() { oThis.myMethod(); }, this.itime);
}    
};

this.callDelayed = function() {
    // utilisation de la référence vers l'objet
if(!g_stopflo){
    this.timeoutstop=setTimeout(function() { oThis.myMethod(); }, this.itime);
}
};
}
finally {return;}
};

// special creation des zones AREA
function eleban_createallarea(){
try{
var measur = new Array("w", "h");
measur["w"] = new Array(330,570,185,300,115,390,225);
measur["h"] = new Array(460,570,295,450,100,190,115);
var ititle = new Array("Voir les menus  et nos suggestions","Repas &agrave; emporter","R&eacute;servation d&rsquo;une table","Nous contacter","Nous rejoindre sur FaceBook","Calculer votre trajet","liste des amis");
var ihref = new Array("menus.html","emporter.html","reservation.html","contact.html","likebox.html","google.html","amis.html");
var b_map = new Array(0,1,2,3,4,5,6);
b_map[0] = "71,32,240,32,249,43,289,352,280,366,102,385,90,371,51,38";
b_map[1] = "66,52,95,14,129,56,115,91,100,93,112,273,128,284,122,366,176,343,193,296,191,194,147,189,145,166,201,111,199,84,545,105,532,354,509,388,412,478,32,401,77,383,87,375,82,286,95,269,94,221,24,195,11,165,9,120,89,123,89,94,78,92,77,92,77,93,75,93,77,93,76,93,79,92";
b_map[2] = "19,25,169,38,173,112,161,113,105,103,90,125,91,262,121,269,124,281,96,293,62,289,49,281,56,268,83,264,84,121,71,98,16,90";
b_map[3] = "60,0,216,1,226,20,225,403,168,421,42,410,45,10";
b_map[4] = "31,7,72,10,82,18,88,45,88,71,76,81,29,80,17,68,16,18";
b_map[5] = "91,40,141,38,178,27,184,4,211,5,223,24,240,23,386,135,229,121,103,180,6,156,49,94";
b_map[6] = "6,32,69,18,79,6,118,7,141,2,149,10,211,17,202,28,209,30,189,62,195,70,178,74,180,90,164,90,154,107,68,101,34,104,34,98,18,97,28,84,15,84,30,65";

if (document.getElementById){
for (var i=0; i<b_map.length;i++){
var obj = document.getElementById("pc_menu"+i);
    if(obj){
    var ct = '<img class=\"pc_menu\" src=\"'+g_preloaderhover.images[i].src+'\" alt=\"\" width=\"'+measur["w"][i]+'\" height=\"'+measur["h"][i]+'\" usemap=\"#MAP_INDEX'+i+'\" \/>';
    ct+='<map name=\"MAP_INDEX'+i+'\">';
    ct+='<area shape=\"poly\" coords=\"'+b_map[i]+'\" title=\"'+ititle[i]+'\" href=\"'+ihref[i]+'\" \/>';
    ct+='<\/map>';
    obj.innerHTML = ct;
    }
}
}
}
finally {return;}
}

//preload, creation et gestion de tous les evenements


var image_resizer = function(g_layer){


    b_org_elm = new Array("w",  "h");
    b_org_elm["w"] = new Array(330,570,185,300,115,390,225);
    b_org_elm["h"] = new Array(460,570,295,450,100,190,115);

    b_map = new Array(0,1,2,3,4,5,6);
    b_map[0] = new Array(71,32,240,32,249,43,289,352,280,366,102,385,90,371,51,38);
    b_map[1] = new Array(66,52,95,14,129,56,115,91,100,93,112,273,128,284,122,366,176,343,193,296,191,194,147,189,145,166,201,111,199,84,545,105,532,354,509,388,412,478,32,401,77,383,87,375,82,286,95,269,94,221,24,195,11,165,9,120,89,123,89,94,78,92,77,92,77,93,75,93,77,93,76,93,79,92);
    b_map[2] = new Array(19,25,169,38,173,112,161,113,105,103,90,125,91,262,121,269,124,281,96,293,62,289,49,281,56,268,83,264,84,121,71,98,16,90);
    b_map[3] = new Array(60,0,216,1,226,20,225,403,168,421,42,410,45,10);
    b_map[4] = new Array(31,6,70,10,78,18,84,23,88,44,88,70,78,80,75,81,33,82,23,76,18,69,16,22,21,13);
    b_map[5] = new Array(91,40,141,38,178,27,184,4,211,5,223,24,240,23,386,135,229,121,103,180,6,156,49,94);
    b_map[6] = new Array(6,32,69,18,79,6,118,7,141,2,149,10,211,17,202,28,209,30,189,62,195,70,178,74,180,90,164,90,154,107,68,101,34,104,34,98,18,97,28,84,15,84,30,65);


    b_layer = g_layer;

//gere mouseover
    this.mouseover = function(e){
        if (!e) var e = window.event;
        var tg = (window.event) ? e.srcElement : e.target
            if (tg.nodeName){
                if(tg.nodeName == "AREA"){
                var divpar = (tg.parentNode)? tg.parentNode.parentNode : tg.parentElement.parentElement;
                    if (divpar){
                        if(divpar.nodeName == "DIV"){
                            var iiobjimg = divpar.getElementsByTagName('img');
                                if (iiobjimg){
                                    ii = parseInt(divpar.id.substring(divpar.id.length-1,divpar.id.length));
                                    iiobjimg[0].src = g_preloaderhover.imageshover[ii].src;
                                }
                        }
                    }
                }
            }
    };

//gere mouseout
    this.mouseout = function(e){
        if (!e) var e = window.event;
        tg = (window.event) ? e.srcElement : e.target
            if (tg.nodeName){
                if(tg.nodeName == "AREA"){
                divpar = (tg.parentNode)? tg.parentNode.parentNode : tg.parentElement.parentElement;
                    if (divpar){
                        if(divpar.nodeName == "DIV"){
                            var iiobjimg = divpar.getElementsByTagName('img');
                                if (iiobjimg){
                                    ii = parseInt(divpar.id.substring(divpar.id.length-1,divpar.id.length));
                                    iiobjimg[0].src = g_preloaderhover.images[ii].src;
                                }
                        }
                    }
                }
            }
    };

//ajout evenements entree sortie à la page web lors du chargement de la page
    this.init = function () {

        for(var i=0; i<b_org_elm["w"].length;i++){
            w = document.getElementById("pc_menu"+i).offsetWidth;
            h = document.getElementById("pc_menu"+i).offsetHeight;

            xa = w/parseFloat(b_org_elm["w"][i]);
            ya = h/parseFloat(b_org_elm["h"][i]);

            area = document.getElementById("pc_menu"+i).getElementsByTagName('area')[0];

            b_map2 = area.coords.split(",");
            yswitch = true;
                for(m=0; m<b_map2.length;m++){
                b_map2[m] = Math.round(parseFloat(b_map[i][m]) * ((yswitch)? xa: ya));
                yswitch = (yswitch)? false :  true;
                }
            area.coords = b_map2.join(',');
        }
    }; 


    this.resize = function () {
    clearTimeout(myInstOne.timeoutstop);
    g_stopflo=true;

    globalize.init();
    g_stopflo=false;
    myInstOne.obj = null;
    myInstOne.callDelayed();
    };


    nar = document.getElementsByTagName('area').length;

        for(var i=0; i<nar;i++){
            var elem = document.getElementsByTagName('area')[i];
            if (elem.addEventListener){
                    elem.addEventListener("onmouseover",this.mouseover,true);
                elem.addEventListener("onmouseout",this.mouseout,true);
            }else if (elem.attachEvent) {
                    elem.attachEvent("onmouseover", this.mouseover);
                    elem.attachEvent("onmouseout", this.mouseout);
            }else{
                    elem["onmouseover"] = this.mouseover;
                    elem["onmouseout"] = this.mouseout;
            }
        }

            window.onresize = this.resize;
        window.onmouseover = this.mouseover;
        window.onmouseout = this.mouseout;
}


//permet de temporiser et éviter les erreurs de chargement des objets
function temporise_Init(Lastdiv){
if(document.getElementById){
    if(document.getElementById(Lastdiv)){

    eleban_createallarea();

    myInstOne = new myObjfloater('b_menumap11', 'pc_menu1', 1, 0);

    globalize = new image_resizer(document.getElementById('pc_redim'));
    globalize.init();
        globalize.resize();



    }else{
    setTimeout(temporise_Init(Lastdiv), 30);
    }
}
}


window.onload = function () {
temporise_Init("pc_bandeau");
}

2
यह क्या करता है?
user8408080
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.