कोका-कोला कैन पहचान कैसे सुधारें: C++ एल्गोरिदम

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

परिचय: कोका-कोला कैन को पहचानना जितना लगता है उससे कहीं अधिक कठिन क्यों है

\n

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

\n

Stack Overflow पर प्रश्न "Image Processing: Algorithm Improvement for 'Coca-Cola Can' Recognition" ने हजारों व्यूज और दर्जनों उत्तर एकत्र किए हैं। प्रोग्रामर इस समस्या से जूझ रहे थे: विभिन्न प्रकाश स्थितियों में कैन को अन्य लाल वस्तुओं (अग्निशामक यंत्र, लाल मग, प्लास्टिक का टुकड़ा) से मज़बूती से कैसे अलग किया जाए?

\n

इस लेख में, हम केवल OpenCV का उपयोग करके C++ में तैयार कोड नहीं देंगे। हम चरण दर चरण छवि प्रसंस्करण एल्गोरिदम का विश्लेषण करेंगे, जो कच्चे वीडियो स्ट्रीम को आत्मविश्वासपूर्ण पहचान में बदल देते हैं। आप सीखेंगे कि डिटेक्शन सटीकता कैसे सुधारें, गलत सकारात्मक परिणामों से कैसे बचें, और ऐसा कोड लिखें जो रीयल-टाइम में काम करे।

\n\n

समस्या: सरल विधियाँ काम क्यों नहीं करतीं

\n

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

\n
    \n
  • प्रकाश बदलता है — दिन के उजाले के लैंप के नीचे और सूरज के नीचे लाल रंग अलग दिखता है।
  • \n
  • धातु पर चमक — कैन प्रकाश को परावर्तित करता है, और इसका रंग सफेद या नारंगी दिखाई दे सकता है।
  • \n
  • पृष्ठभूमि में शोर — लाल टी-शर्ट, कुर्सियाँ, विज्ञापन बोर्ड डिटेक्टर को भ्रमित करते हैं।
  • \n
  • आकार विकृत होता है — कैन घुमाया जा सकता है, आंशिक रूप से ढका हुआ या विकृत हो सकता है।
  • \n
\n

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

\n\n

समाधान की वास्तुकला: पिक्सेल से निर्णय तक

\n

हम तीन चरणों वाला एक पाइपलाइन बनाएंगे:

\n
    \n
  1. पूर्व-प्रसंस्करण — धुंधलापन, HSV में रूपांतरण, आकृति विज्ञान।
  2. \n
  3. विभाजन — रंग और कंटूर के आधार पर उम्मीदवारों को अलग करना।
  4. \n
  5. सत्यापन — पहलू अनुपात, क्षेत्रफल, बनावट विशेषताओं के आधार पर फ़िल्टरिंग।
  6. \n
\n

इस दृष्टिकोण का उपयोग C++ कंप्यूटर विज़न में औद्योगिक कार्यों के लिए किया जाता है — भागों की छंटाई से लेकर गुणवत्ता नियंत्रण तक।

\n\n

चरण 1: HSV में रंग फ़िल्टरिंग

\n

पहला और सबसे महत्वपूर्ण कदम छवि को RGB से HSV (Hue, Saturation, Value) में बदलना है। क्यों? क्योंकि HSV रंग (ह्यू) को चमक से अलग करता है। यह लाल रंग के लिए एक सीमा निर्धारित करने की अनुमति देता है जो विभिन्न प्रकाश स्थितियों में काम करेगी।

\n
#include <opencv2/opencv.hpp>\nusing namespace cv;\n\nMat hsv, mask;\ncvtColor(src, hsv, COLOR_BGR2HSV);\n\n// लाल रंग के लिए सीमा (HSV की चक्रीयता के कारण दो अंतराल)\nScalar lower_red1 = Scalar(0, 70, 50);\nScalar upper_red1 = Scalar(10, 255, 255);\nScalar lower_red2 = Scalar(170, 70, 50);\nScalar upper_red2 = Scalar(180, 255, 255);\n\nMat mask1, mask2;\ninRange(hsv, lower_red1, upper_red1, mask1);\ninRange(hsv, lower_red2, upper_red2, mask2);\nmask = mask1 | mask2;\n
\n

ध्यान दें: लाल रंग HSV की सीमा (0 और 180 डिग्री) पर है, इसलिए हमें दो सीमाओं की आवश्यकता है। Saturation (70) और Value (50) पैरामीटर बहुत हल्के या बहुत गहरे पिक्सेल को हटा देते हैं।

\n\n

चरण 2: आकृति विज्ञान और कंटूर खोज

\n

मास्क के बाद हमें एक बाइनरी इमेज मिलती है, लेकिन इसमें शोर होता है। हम कैन के अंदर छेद भरने के लिए मॉर्फोलॉजिकल क्लोज़िंग (closing) और छोटे बिंदुओं को हटाने के लिए ओपनिंग (opening) लागू करते हैं।

\n
Mat kernel = getStructuringElement(MORPH_ELLIPSE, Size(5, 5));\nmorphologyEx(mask, mask, MORPH_CLOSE, kernel);\nmorphologyEx(mask, mask, MORPH_OPEN, kernel);\n                

ब्लॉग

पुस्तक अनुशंसाएँ