- खाका निर्माण
- पत्र का पता लगाना
- नंबर प्लेट का पता लगाना
- MATLAB का उपयोग करके वाहन लाइसेंस प्लेट नंबर जांच प्रणाली का कार्य
क्या आपने कभी सोचा है कि एक ANPR (स्वचालित नंबर प्लेट मान्यता) प्रणाली कैसे काम करती है? आपको बता दें कि इसके पीछे की अवधारणा, ANPR प्रणाली का कैमरा वाहन लाइसेंस प्लेट की छवि को कैप्चर करता है और फिर छवि को एक पाठ प्रारूप में छवि के अल्फा संख्यात्मक रूपांतरण प्रदान करने के लिए कई संख्या में एल्गोरिदम के माध्यम से संसाधित किया जाता है। ANPR प्रणाली का उपयोग कई स्थानों पर किया जाता है जैसे कि पेट्रोल पंप, शॉपिंग मॉल, एयरपोर्ट, राजमार्ग, टोल बूथ, होटल, अस्पताल, पार्किंग स्थल, रक्षा और सैन्य चेक पॉइंट आदि।
इस नंबर प्लेट डिटेक्शन के लिए कई इमेज प्रोसेसिंग टूल उपलब्ध हैं, लेकिन इस ट्यूटोरियल में हम वाहन लाइसेंस प्लेट नंबर को टेक्स्ट फॉर्मेट में प्राप्त करने के लिए MATLAB इमेज प्रोसेसिंग का उपयोग करेंगे । यदि आप MATLAB या छवि प्रसंस्करण के साथ नए हैं, तो हमारी पिछली MATLAB परियोजनाओं की जाँच करें:
- MATLAB के साथ शुरुआत करना: एक त्वरित परिचय
- MATLAB का उपयोग करके इमेज प्रोसेसिंग के साथ शुरुआत करना
सबसे पहले, मैं आपको उस अवधारणा के बारे में संक्षिप्त जानकारी दूं जिसका उपयोग हम नंबर प्लेटों का पता लगाने के लिए कर रहे हैं। इस परियोजना के लिए तीन कार्यक्रम या '.m' फाइलें हैं।
- खाका निर्माण ( template_creation.m ) - यह और अक्षर या अंक के सहेजे गए चित्रों कॉल करने के लिए प्रयोग किया जाता है तो उन्हें बचाने MATLAB स्मृति में एक नया टेम्पलेट के रूप में।
- लेटर डिटेक्शन ( Letter_detection.m ) - इनपुट इमेज से कैरेक्टर्स को पढ़ता है और अल्फान्यूनिक से संबंधित सबसे ज्यादा मिलान करता है।
- प्लेट डिटेक्शन ( प्लेट_डिटेनमेंट दोपहर ) - छवि को संसाधित करें और फिर संख्या का पता लगाने के लिए उपरोक्त दो एम-फाइलें कॉल करें।
अब, हम इन m-files को कोड करने के तरीके के बारे में जानेंगे और कोडिंग शुरू करने से पहले आपको क्या करना है। इस ट्यूटोरियल से गुजरने के बाद, आप इस प्रोजेक्ट के अंत में सभी कोड फाइल्स और वर्किंग स्पष्टीकरण वीडियो पा सकते हैं ।
खाका निर्माण
फ़ाइलों को सहेजने और संग्रहीत करने के लिए पहले प्रोजेक्ट के लिए एक फ़ोल्डर बनाएँ (मेरा फ़ोल्डर नाम नंबर प्लेट डिटेक्शन है )। हमने उप-फ़ोल्डर में सभी अल्फाबेट्स और संख्याओं की द्विआधारी छवियों को ' अल्फा' नाम से संग्रहीत किया है ।
अब, MATLAB में संपादक विंडो खोलें, जैसा कि नीचे की छवि में दिखाया गया है,
यदि आप MATLAB की मूल शब्दावली से परिचित नहीं हैं, तो मैं आपको लिंक किए गए ट्यूटोरियल की जांच करने का सुझाव देता हूं।
अब, template_creation.m फ़ाइल में नीचे दिए गए कोड को कॉपी और पेस्ट करें, और प्रोजेक्ट फ़ोल्डर ( नंबर प्लेट डिटेक्शन ) में फ़ाइल को सहेजें । इस प्रोजेक्ट से संबंधित सभी फाइलें जिनमें इमेज टेम्प्लेट फाइलें शामिल हैं, को यहां से डाउनलोड किया जा सकता है। इस प्रोजेक्ट के अंत में दिए गए वीडियो को भी देखें ।
% अक्षर ए = इम्रेड ('अल्फा / एबम्प'); बी = इम्रेड ('अल्फा / बी। बीएमपी'); सी = इम्रेड ('अल्फा / सीबीएमपी'); D = imread ('अल्फ़ा / D.bmp'); E = imread ('अल्फ़ा / E.bmp'); F = imread ('अल्फ़ा / F.bmp'); G = imread ('अल्फ़ा / G.bmp'); H = imread ('अल्फ़ा / H.bmp'); I = imread ('अल्फ़ा / I.bmp'); जे = इम्रेड ('अल्फा / जेबीएमपी'); के = इम्रेड ('अल्फा / केबीएमपी'); एल = इम्रेड ('अल्फा / एलबीएमपी'); M = imread ('अल्फा / एमबम्प'); N = imread ('अल्फा / N.bmp'); O = imread ('अल्फा / O.bmp'); P = imread ('अल्फा / P.bmp'); Q = imread ('अल्फा / Q.bmp'); R = imread ('अल्फा / R.bmp'); S = imread ('अल्फा / एसबम्प'); T = imread ('अल्फा / T.bmp'); U = imread ('अल्फा / U.bmp'); V = imread ('अल्फा / V.bmp'); W = imread ('अल्फा / W.bmp'); X = imread (')अल्फ़ा / X.bmp '); Y = imread ('अल्फा / Y.bmp'); Z = imread ('अल्फा / Z.bmp'); % प्राकृतिक संख्या एक = इम्रेड ('अल्फा / 1.bmp'); दो = इम्रेड ('अल्फा / 2.bmp'); तीन = imread ('अल्फा / 3.bmp'); चार = imread ('अल्फा / 4.bmp'); पाँच = इम्रेड ('अल्फा / 5. बीएमपी'); छह = इम्रेड ('अल्फा / 6. बीएमपी'); सात = imread ('अल्फा / 7.bmp'); आठ = imread ('अल्फा / 8.bmp'); नौ = इम्रेड ('अल्फा / 9. बीएमपी'); zero = imread ('अल्फा / 0.bmp'); अक्षर अक्षर के लिए% बनाना =; % संख्या संख्या के लिए सरणी बनाना =; NewTemplates =; सहेजें ('NewTemplates', 'NewTemplates') सभी स्पष्ट
यहां, उपरोक्त कोड में हम कमांड ' इम्रेड () ' का उपयोग करके छवियों को एक चर में सहेज रहे हैं । इस फ़ंक्शन का उपयोग फ़ोल्डर से चित्र या पीसी के किसी भी स्थान से MATLAB में कॉल करने के लिए किया जाता है। उपरोक्त कोड से एक उदाहरण लेते हैं:
ए = इम्रेड ('अल्फा / एबम्प');
जहाँ A चर है, और ' Alpha / A.bmp' में , ' Alpha' फ़ोल्डर नाम है और ' A.bmp' फ़ाइल नाम है।
फिर ' अक्षर ' और ' संख्या ' का एक मैट्रिक्स बनाएं और इसे ' save (फ़ाइलनाम, चर)' कमांड का उपयोग करके चर ' NewTemplates ' में सहेजें ।
अक्षर अक्षर के लिए% बनाना =; % संख्या संख्या के लिए सरणी बनाना =; NewTemplates =; सहेजें ('NewTemplates', 'NewTemplates') सभी स्पष्ट
अब एक नए संपादक विंडो में, Letter_detection.m को कोड करना शुरू करें ।
पत्र का पता लगाना
यहां हम Letter_detection.m नाम की दूसरी कोड फ़ाइल बना रहे हैं । अब, उस फ़ाइल में नीचे दिए गए कोड को कॉपी और पेस्ट करें और फ़ाइल को Letter_detection नाम के प्रोजेक्ट फ़ोल्डर में सहेजें। इस फाइल को यहाँ से डाउनलोड किया जा सकता है, इस संलग्न ज़िप फाइलों में इस नंबर प्लेट डिटेक्शन प्रोजेक्ट से संबंधित अन्य फाइलें भी हैं।
समारोह पत्र = readLetter (स्नैप) लोड NewTemplates स्नैप = imresize (स्नैप,); rec =; n = 1 के लिए: लंबाई (NewTemplates) cor = corr2 (NewTemplates {1, n}, स्नैप); rec =; अंत इंडस्ट्रीज़ = खोजें (आरई == अधिकतम (आरईसी)); प्रदर्शन (ढूँढें (आरई == अधिकतम (आरईसी))); % अक्षर लिस्टिंग अगर ind == 1 - ind == 2 अक्षर = 'A'; फारस इंडस्ट्रीज़ == 3 - इंड == 4 पत्र = 'बी'; पर्सिफ़ड इंडस्ट्रीज़ == ५ लेटर = 'सी' औरइसेफ़ इंड == ६ - इंड == = लेटर = 'डी'; फारस इंडस्ट्रीज़ == 8 पत्र = 'ई'; फारस इंडस्ट्रीज़ == 9 पत्र = 'एफ'; फारस इंडस्ट्रीज़ == 10 पत्र = 'जी'; फारस इंडस्ट्रीज़ == 11 पत्र = 'एच'; फारस इंडस्ट्रीज़ == 12 पत्र = 'आई'; फारस इंडस्ट्रीज़ == 13 पत्र = 'जे'; इत्यादि इंड == 14 पत्र = 'के'; फारस इंडस्ट्रीज़ == 15 पत्र = 'एल'; फारस इंडस्ट्रीज़ == 16 पत्र = 'एम'; फारस इंडस्ट्रीज़ == 17 पत्र = 'एन'; अन्योक्ति इंडस्ट्रीज़ == 18 - इंड == 19 पत्र = 'ओ'; पर्सिफ़ इंडस्ट्रीज़ == २० - इंड == २१ अक्षर = 'पी'; औरइफ इंड == 22 - इंड == 23 अक्षर = 'क्यू'; फारस इंडस्ट्रीज़ == 24 - इंड == 25 पत्र = 'आर'; फारस इंडस्ट्रीज़ == 26 पत्र = 'एस'; फारस इंडस्ट्रीज़ == 27 पत्र = 'टी'; फारस इंडस्ट्रीज़ == 28 पत्र = 'यू'; फारस इंडस्ट्रीज़ == 29 पत्र = 'वी'; फारस इंडस्ट्रीज़ == 30 पत्र = 'डब्ल्यू'; फारस इंडस्ट्रीज़ == 31 पत्र = 'एक्स'; फारस इंडस्ट्रीज़ == 32 अक्षर = 'य'; फारस इंडस्ट्रीज़ == 33 पत्र = 'जेड'; % * - * - * - * - * % अंकों लिस्टिंग। फारस इंडस्ट्रीज़ == 34 पत्र = '1'; फारस इंडस्ट्रीज़ == 35 पत्र = '2'; फारस इंडस्ट्रीज़ == 36 पत्र = '3'; फारस इंडस्ट्रीज़ == 37 - इंड == 38 पत्र = '4'; फारस इंडस्ट्रीज़ == 39 पत्र = '5'; इस्तिफ ind == 40 - ind == 41 - ind == 42 अक्षर = '6'; फारस इंडस्ट्रीज़ == 43 पत्र = '7'; इस्तिफ ind == 44 - ind == 45 अक्षर = '8'; इस्तिफ ind == 46 - ind == 47 - ind == 48 अक्षर = '9'; और अक्षर = '0'; अंतिम छोर
यहां, उपरोक्त कोड में हमने एक फ़ंक्शन नाम पत्र बनाया है जो हमें कमांड ' readLetter ()' का उपयोग करके कक्षा ' अल्फा ' से इनपुट छवि का अल्फ़ान्यूमेरिक आउटपुट देता है । और फिर कमांड लोड 'NewTemplates का उपयोग करके सहेजे गए टेम्प्लेट लोड करें ।
उसके बाद, हमने इनपुट छवि का आकार बदल दिया है, इसलिए इसे टेम्पलेट की छवियों के साथ कमांड 'इमर्साइज़ (फ़ाइलनाम, आकार)' का उपयोग करके तुलना की जा सकती है । तब के लिए पाश टेम्पलेट में हर छवि के साथ इनपुट छवि संबद्ध करने के लिए प्रयोग किया जाता है सबसे अच्छा मैच पाने के लिए।
एक मैट्रिक्स ' rec ' इनपुट छवि से वर्ण टेम्पलेट के साथ प्रत्येक अल्फ़ान्यूमेरिक टेम्पलेट के लिए सहसंबंध के मूल्य को रिकॉर्ड करने के लिए बनाया गया है, जैसा कि नीचे दिए गए कोड में दिखाया गया है:
cor = corr2 (NewTemplates {1, n}, स्नैप);
फिर 'find ()' कमांड का उपयोग इंडेक्स को खोजने के लिए किया जाता है जो उच्चतम मिलान वाले वर्ण से मेल खाता है। फिर उस इंडेक्स के अनुसार, 'इफ-और' स्टेटमेंट का उपयोग करके संबंधित कैरेक्टर को प्रिंट किया जाता है ।
अब, इसे पूरा करने के बाद मुख्य कार्यक्रम के लिए कोड शुरू करने के लिए एक नई संपादक विंडो खोलें।
नंबर प्लेट का पता लगाना
यहाँ तीसरे और अंतिम कोड की फाइल है जिसका नाम प्लेट_डेटेनेमेंट है। इस फाइल में नीचे दिए गए कोड को कॉपी करें और प्रोजेक्ट फोल्डर में सेव करें। त्वरित शुरुआत के लिए आप यहां से छवि टेम्पलेट्स के साथ सभी कोड फाइलें डाउनलोड कर सकते हैं।
सब बंद करें; सभी साफ करें; im = imread ('नंबर प्लेट छवियाँ / image1.png'); imgray = rgb2gray (im); imbin = imbinarize (imgray); im = edge (इमग्रै, 'प्रीविट'); % नीचे नंबर प्लेट के स्थान का पता लगाने के लिए कर रहे हैं Iprops = रीजनप्रॉप्स (im, 'बाउंडिंगबॉक्स', 'एरिया', 'इमेज'); क्षेत्र = इप्रोपेसएरिया; count = numel (इप्रोप्स); अधिकतम = क्षेत्र; बाउंडिंगबॉक्स = इप्रोपेस। बाउंडिंगबॉक्स; के लिए मैं = 1: गिनती अगर मैक्स
उपरोक्त कोड में उपयोग की जाने वाली मूल आज्ञाएँ नीचे उल्लिखित हैं:
imread () - इस कमांड का उपयोग इमेज को टार्गेट फोल्डर से MATLAB में खोलने के लिए किया जाता है।
rgb2gray () –इस कमांड का उपयोग RGB इमेज को ग्रेस्केल फॉर्मेट में बदलने के लिए किया जाता है।
imbinarize () - इस कमांड का उपयोग Binarize 2-D ग्रेस्केल इमेज के लिए किया जाता है या बस हम यह कह सकते हैं कि यह इमेज को ब्लैक एंड व्हाइट फॉर्मेट में बदल देता है।
एज () - इस कमांड का उपयोग छवि में किनारों का पता लगाने के लिए किया जाता है, रॉबर्ट्स, सोबेल, प्रीविट और कई अन्य जैसे विभिन्न तरीकों का उपयोग करके।
रीजनप्रॉप्स () - इस कमांड का उपयोग इमेज क्षेत्र के गुणों को मापने के लिए किया जाता है।
numel () - यह कमांड एरे तत्वों की संख्या की गणना करने के लिए उपयोग किया जाता है।
imcrop () - इस कमांड का उपयोग इमेज को एंटर साइज में क्रॉप करने के लिए किया जाता है।
bwareaopen () - इस कमांड का उपयोग बाइनरी इमेज से छोटी वस्तुओं को हटाने के लिए किया जाता है।
कोड में उपरोक्त कमांड का उपयोग करके, हम इनपुट छवि को कॉल कर रहे हैं और इसे ग्रेस्केल में परिवर्तित कर रहे हैं। फिर ग्रेस्केल को द्विआधारी छवि में परिवर्तित किया जाता है, और बाइनरी छवियों के किनारे को प्रीविट विधि द्वारा पता लगाया जाता है ।
तब पूरी इनपुट छवि में नंबर प्लेट के स्थान का पता लगाने के लिए नीचे दिए गए कोड का उपयोग किया जाता है, इप्रोप्स = रीजनप्रॉप्स (आईएम, 'बाउंडिंगबॉक्स', 'एरिया', 'इमेज'); क्षेत्र = इप्रोपेसएरिया; count = numel (इप्रोप्स); अधिकतम = क्षेत्र; बाउंडिंगबॉक्स = इप्रोपेस। बाउंडिंगबॉक्स; के लिए मैं = 1: गिनती अगर मैक्स
इसके बाद नंबर प्लेट को क्रॉप करें और बाइनरी इमेज से छोटी वस्तुओं को क्रमशः 'imcrop ()' और 'bwareaopen ()' का उपयोग करके हटा दें ।
फिर, नीचे दिए गए कोड का उपयोग उस क्रॉप्ड लाइसेंस प्लेट छवि को संसाधित करने और छवि और पाठ प्रारूप (कमांड विंडो में) में पता संख्या को प्रदर्शित करने के लिए किया जाता है ।
इप्रोप्स = रीजनप्रॉप्स (आईएम, 'बाउंडिंगबॉक्स', 'एरिया', 'इमेज'); count = numel (इप्रोप्स); noPlate =; i = 1 के लिए: ow = लंबाई (Iprops (i).Image (1,:)) गिनें; ओह = लंबाई (इप्रोप्स (आई)। आईमैज (:, 1)); अगर उल्लू <(h / 2) & oh> (h / 3) अक्षर = Letter_detection (Iprop (i).Image); noPlate = अंतिम छोर
MATLAB का उपयोग करके वाहन लाइसेंस प्लेट नंबर जांच प्रणाली का कार्य
में template_creation.m फ़ाइल हम एक निर्देशिका या फ़ाइल 'के रूप में नामित में अक्षर या अंक के सभी द्विआधारी छवियों को बचाने के लिए कोड डिजाइन है NewTemplates '। फिर उस निर्देशिका को Letter_detection.m में कहा जाता है जैसा कि आप नीचे देख सकते हैं
इसके बाद प्लेट_डिटें.म. कोड फ़ाइल में लेटर_डाइट । एमटी कोड फाइल कहा जाता है जब हम इमेज को प्रोसेस करते हैं जैसा कि नीचे इमेज में दिखाया गया है,
अब,.m फ़ाइल को चलाने के लिए 'RUN' बटन पर क्लिक करें
MATLAB को प्रतिक्रिया देने में कुछ सेकंड लग सकते हैं, तब तक प्रतीक्षा करें जब तक कि यह निचले बाएँ कोने में व्यस्त संदेश न दिखाए, जैसा कि नीचे दिखाया गया है,
जैसे ही प्रोग्राम शुरू होगा आपको नंबर प्लेट इमेज पॉपअप और कमांड विंडो में नंबर मिल जाएगा। मेरी छवि के लिए आउटपुट नीचे दी गई छवि की तरह दिखेगा;
व्हीकल लाइसेंस नंबर प्लेट डिटेक्शन सिस्टम का पूरा काम नीचे दिए गए वीडियो में दिखाया गया है, और इमेज टेम्प्लेट वाली सभी कोड फाइलें यहां से डाउनलोड की जा सकती हैं।
इसके अलावा, यहां सभी MATLAB प्रोजेक्ट्स देखें।