- Paglikha ng Template
- Pagtuklas ng Liham
- Pagtuklas ng Numero ng Plato
- Paggawa ng Sistema ng Detalye ng Numero ng Plate ng Sasakyan gamit ang MATLAB
Naisip mo ba kung paano gumana ang isang ANPR (Awtomatikong Numero ng Plate Recognition)? Hayaan mong sabihin ko sa iyo ang konsepto sa likod nito, nakukuha ng camera ng system ng ANPR ang imahe ng plaka ng lisensya ng sasakyan at pagkatapos ang imahe ay naproseso sa pamamagitan ng maraming bilang ng mga algorithm upang magbigay ng isang alpha numeric na conversion ng imahe sa isang format na teksto. Ang sistemang ANPR ay ginagamit sa maraming lugar tulad ng Petrol Pumps, Shopping Malls, Paliparan, mga haywey, toll booth, Hotel, Ospital, parking lot, Defense & Military check point atbp.
Maraming mga tool sa pagproseso ng imahe na magagamit para sa pagtuklas ng plate ng Numero, ngunit dito sa tutorial na ito gagamitin namin ang Pagproseso ng Larawan ng MATLAB upang makuha ang numero ng plaka ng sasakyan sa format ng teksto. Kung bago ka sa MATLAB o pagproseso ng imahe, suriin ang aming nakaraang mga proyekto sa MATLAB:
- Pagsisimula sa MATLAB: Isang Mabilis na Panimula
- Pagsisimula sa Pagproseso ng Imahe gamit ang MATLAB
Una, hayaan mo akong ibigay sa iyo ang tungkol sa konsepto na ginagamit namin para sa pagtuklas ng mga plate ng numero. Mayroong tatlong mga programa o '.m' na mga file para sa proyektong ito.
- Paglikha ng Template ( template_creation.m ) - Ginagamit ito upang tawagan ang nai-save na mga imahe ng alphanumerics at pagkatapos ay i-save ang mga ito bilang isang bagong template sa memorya ng MATLAB.
- Pagtuklas ng Liham ( Letter_detection.m ) - Binabasa ang mga character mula sa imahe ng pag-input at hanapin ang pinakamataas na naitugmang kaukulang alphanumeric.
- Pagtuklas ng Plate ( Plate_detection.m ) - Iproseso ang imahe at pagkatapos ay tawagan ang nasa itaas na dalawang m-file upang makita ang numero.
Ngayon, matututunan namin ang tungkol sa kung paano i-code ang mga m-file na ito at kung ano ang kailangan mong gawin bago simulang mag-coding. Pagkatapos dumaan sa tutorial na ito, mahahanap mo ang lahat ng mga file ng code at gumagana ang paliwanag na video sa pagtatapos ng proyektong ito.
Paglikha ng Template
Lumikha muna ng isang folder para sa proyekto (ang pangalan ng aking folder ay Deteksyon ng Plato ng Numero ) upang mai-save at maiimbak ang mga file. Naimbak namin ang mga binary na imahe ng lahat ng mga alpabeto at numero sa sub-folder na pinangalanang ' alpha' .
Ngayon, buksan ang window ng Editor sa MATLAB, tulad ng ipinakita sa imaheng nasa ibaba,
Kung hindi ka pamilyar sa pangunahing terminolohiya ng MATLAB iminumungkahi ko sa iyo na suriin ang naka-link na tutorial.
Ngayon, kopyahin at i-paste ang code sa ibaba sa template_creation.m file, at i-save ang file sa folder ng proyekto ( Detalye ng Plato ng Numero ). Ang lahat ng mga file na nauugnay sa proyektong ito kasama ang mga file ng template ng imahe ay maaaring ma-download mula dito. Gayundin tingnan ang video na ibinigay sa dulo ng proyektong ito.
% Alphabets A = imread ('alpha / A.bmp'); B = imread ('alpha / B.bmp'); C = imread ('alpha / C.bmp'); D = imread ('alpha / D.bmp'); E = imread ('alpha / E.bmp'); F = imread ('alpha / F.bmp'); G = imread ('alpha / G.bmp'); H = imread ('alpha / H.bmp'); I = imread ('alpha / I.bmp'); J = imread ('alpha / J.bmp'); K = imread ('alpha / K.bmp'); L = imread ('alpha / L.bmp'); M = imread ('alpha / M.bmp'); N = imread ('alpha / N.bmp'); O = imread ('alpha / O.bmp'); P = imread ('alpha / P.bmp'); Q = imread ('alpha / Q.bmp'); R = imread ('alpha / R.bmp'); S = imread ('alpha / S.bmp'); T = imread ('alpha / T.bmp'); U = imread ('alpha / U.bmp'); V = imread ('alpha / V.bmp'); W = imread ('alpha / W.bmp'); X = imread ('alpha / X.bmp '); Y = imread ('alpha / Y.bmp'); Z = imread ('alpha / Z.bmp'); % Mga natural na Numero isa = imread ('alpha / 1.bmp'); dalawa = imread ('alpha / 2.bmp'); tatlo = imread ('alpha / 3.bmp'); apat = imread ('alpha / 4.bmp'); limang = imread ('alpha / 5.bmp'); anim = imread ('alpha / 6.bmp'); pitong = imread ('alpha / 7.bmp'); walo = imread ('alpha / 8.bmp'); siyam = imread ('alpha / 9.bmp'); zero = imread ('alpha / 0.bmp'); % Lumilikha ng Array para sa mga titik ng Alphabets =; % Lumilikha ng Array para sa bilang ng Mga Numero =; NewTemplates =; i-save ('NewTemplates', 'NewTemplates') i- clear ang lahat
Dito, sa code sa itaas ay nai-save namin ang mga imahe sa isang variable sa pamamagitan ng paggamit ng command na ' imread () '. Ang pagpapaandar na ito ay ginagamit upang tawagan ang mga imahe mula sa folder o mula sa anumang lokasyon ng PC papunta sa MATLAB. Kumuha tayo ng isang halimbawa mula sa code sa itaas:
A = imread ('alpha / A.bmp');
Kung saan ang variable ay, at sa ' alpha / A.bmp' , 'alpha' ang pangalan ng folder at ' A.bmp' ang pangalan ng file.
Pagkatapos ay lumikha ng isang matrix ng ' sulat ' at ' numero ' at i-save ito sa variable na ' NewTemplates ' sa pamamagitan ng paggamit ng command ' save (filename, variable)' .
% Lumilikha ng Array para sa mga titik ng Alphabets =; % Lumilikha ng Array para sa bilang ng Mga Numero =; NewTemplates =; i-save ('NewTemplates', 'NewTemplates') i- clear ang lahat
Simulan ngayon ang pag-coding ng Letter_detection.m , sa isang bagong window ng editor.
Pagtuklas ng Liham
Dito nilikha namin ang pangalawang code file na pinangalanang Letter_detection.m . Ngayon, kopyahin at i-paste ang code sa ibaba sa file na iyon at i-save ang file sa folder ng proyekto na may pangalang Letter_detection. Ang file na ito ay maaaring ma-download mula dito, ang nakalakip na mga zip file na ito ay naglalaman din ng iba pang mga file na nauugnay sa proyekto sa pagtuklas ng plate na Numero.
function letter = readLetter (snap) load NewTemplates snap = imresize (snap,); rec =; para sa n = 1: haba (NewTemplates) cor = corr2 (NewTemplates {1, n}, snap); rec =; end ind = find (rec == max (rec)); ipakita (hanapin (rec == max (rec))); % Mga listahan ng alpabeto. kung ind == 1 - ind == 2 letra = 'A'; kung hindi man == 3 - ind == 4 letra = 'B'; elseif ind == 5 letra = 'C' elseif ind == 6 - ind == 7 letra = 'D'; kung hindi man == == titik = 'E'; kung hindi man == == titik = 'F'; kung hindi man == 10 titik = 'G'; kung hindi man == 11 titik = 'H'; kung hindi man == 12 titik = 'Ako'; kung hindi man == == titik = 'J'; kung hindi man == 14 titik = 'K'; kung hindi man == 15 titik = 'L'; kung hindi man == 16 titik = 'M'; kung hindi man == == titik = 'N'; kung hindi man == == 18 - ind == 19 letra = 'O'; kung hindi man == == 20 - ind == 21 letra = 'P'; kung hindi man == == - ind == 23 letra = 'Q'; kung hindi man == == - ind == 25 letra = 'R'; kung hindi man == == titik = 'S'; kung hindi man == == titik = 'T'; kung hindi man == == titik = 'U'; kung hindi man == == titik = 'V'; kung hindi man == == 30 letra = 'W'; kung hindi man == == titik = 'X'; kung hindi man == == 32 titik = 'Y'; kung hindi man == == titik = 'Z'; % * - * - * - * - * % Numerals listahan. kung hindi man == 34 titik = '1'; kung hindi man == == titik = '2'; kung hindi man == == titik = '3'; kung hindi man == == - ind == 38 letra = '4'; kung hindi man == == titik = '5'; elseif ind == 40 - ind == 41 - ind == 42 letra = '6'; kung hindi man == == titik = '7'; kung hindi man == == - ind == 45 letra = '8'; otherwiseif ind == 46 - ind == 47 - ind == 48 letra = '9'; ibang letra = '0'; pagtatapos ng wakas
Dito, sa code sa itaas lumikha kami ng isang pagpapaandar na pinangalanang sulat na nagbibigay sa amin ng output na alphanumeric ng input na imahe mula sa klase na ' alpha ' sa pamamagitan ng paggamit ng command ' readLetter ()' . At pagkatapos ay i-load ang mga naka-save na template sa pamamagitan ng paggamit ng pag- load ng utos na 'NewTemplates .
Pagkatapos nito, pinalitan namin ng laki ang imahe ng pag-input upang maihambing ito sa mga imahe ng template sa pamamagitan ng paggamit ng utos na 'imresize (filename, size)' . Pagkatapos para sa loop ay ginagamit upang maiugnay ang imahe ng pag-input sa bawat imahe sa template upang makuha ang pinakamahusay na tugma.
Ang isang matrix ' rec ' ay nilikha upang maitala ang halaga ng ugnayan para sa bawat template ng alphanumeric na may mga template ng character mula sa input na imahe, tulad ng ipinakita sa code sa ibaba,
cor = corr2 (NewTemplates {1, n}, snap);
Pagkatapos ang 'hanapin ()' na utos ay ginagamit upang hanapin ang index na tumutugma sa pinakamataas na katugmang character. Pagkatapos ayon sa index na iyon, ang kaukulang karakter ay nakalimbag gamit ang pahayag na 'kung-iba' .
Ngayon, pagkatapos makumpleto sa ito buksan ang isang bagong window ng editor upang simulan ang code para sa pangunahing programa.
Pagtuklas ng Numero ng Plato
Narito ang pangatlo at pangwakas na file ng code na pinangalanang Plate_detection.m kopyahin at i-paste ang ibaba code sa file na ito at i-save sa folder ng proyekto. Para sa mabilis na pagsisimula maaari mong i-download ang lahat ng mga file ng code na may mga template ng imahe mula dito.
isara ang lahat; Alisin lahat; im = imread ('Mga Larawan ng Plate ng Numero / image1.png'); imgray = rgb2gray (im); imbin = imbinarize (imgray); im = edge (imgray, 'prewitt'); % Sa ibaba ang mga hakbang ay upang makahanap ng lokasyon ng plate number Iprops = regionprops (im, 'BoundingBox', 'Area', 'Image'); lugar = Iprops.Area; bilang = numel (Iprops); maxa = lugar; boundingBox = Iprops.BoundingBox; para sa i = 1: bilangin kung maxa
Ang mga pangunahing utos na ginamit sa itaas na code ay nabanggit sa ibaba:
imread () - Ginagamit ang utos na ito upang buksan ang imahe sa MATLAB mula sa target na folder.
rgb2gray () –Gamitin ang utos na ito upang mai-convert ang imahe ng RGB sa grayscale format.
imbinarize () - Ang utos na ito ay ginagamit upang Binarize 2-D grayscale na imahe o maaari lamang nating masabing binago nito ang imahe sa itim at puting format.
edge () - Ginagamit ang utos na ito upang makita ang mga gilid ng imahe, sa pamamagitan ng paggamit ng iba't ibang mga pamamaraan tulad ng Roberts, Sobel, Prewitt at marami pang iba.
regionprops () - Ginagamit ang utos na ito upang masukat ang mga katangian ng rehiyon ng imahe.
numel () - Ginagamit ang utos na ito upang makalkula ang bilang ng mga elemento ng array.
imcrop () - Ginagamit ang utos na ito upang i-crop ang imahe sa ipinasok na laki.
bwareaopen () - Ginagamit ang utos na ito upang alisin ang mga maliliit na bagay mula sa binary na imahe.
Sa pamamagitan ng paggamit ng mga utos sa itaas sa code, tinatawagan namin ang input na imahe at i-convert ito sa grayscale. Pagkatapos ang grayscale ay nai-convert sa binary na imahe, at ang gilid ng mga binary na imahe ay napansin ng pamamaraang Prewitt.
Pagkatapos ang code sa ibaba ay ginagamit upang makita ang lokasyon ng plate ng numero sa buong imahe ng pag-input, Iprops = regionprops (im, 'BoundingBox', 'Area', 'Image'); lugar = Iprops.Area; bilang = numel (Iprops); maxa = lugar; boundingBox = Iprops.BoundingBox; para sa i = 1: bilangin kung maxa
Pagkatapos i- crop ang plate ng numero at alisin ang mga maliliit na bagay mula sa binary na imahe sa pamamagitan ng paggamit ng command 'imcrop ()' at 'bwareaopen ()' ayon sa pagkakabanggit.
Pagkatapos, ginagamit ang code sa ibaba upang maproseso ang na-crop na imahe ng plate ng lisensya at upang ipakita ang napansin na numero sa imahe at format ng teksto (sa window ng utos).
Iprops = regionprops (im, 'BoundingBox', 'Area', 'Image'); bilang = numel (Iprops); noPlate =; para sa i = 1: bilangin ow = haba (Iprops (i). Larawan (1,:)); oh = haba (Iprops (i). Larawan (:, 1)); kung ow <(h / 2) & oh> (h / 3) letra = Letter_detection (Iprops (i). Larawan); noPlate = dulo ng pagtatapos
Paggawa ng Sistema ng Detalye ng Numero ng Plate ng Sasakyan gamit ang MATLAB
Sa template_creation.m file mayroon kaming disenyo ng code upang mai-save ang lahat ng mga binary na imahe ng alphanumerics sa isang direktoryo o file na pinangalanang ' NewTemplates '. Pagkatapos ang direktoryo na iyon ay tinawag sa Letter_detection.m na nakikita mo sa ibaba
Pagkatapos ay sa Plate_detection.m code file ang Letter_detection.m code na file ay tinatawag na kapag pinoproseso namin ang mga imahe tulad ng ipinakita sa imahe sa ibaba,
Ngayon, mag-click sa pindutang 'RUN' upang patakbuhin ang.m file
Ang MATLAB ay maaaring tumagal ng ilang segundo upang tumugon, maghintay hanggang magpakita ito ng abalang mensahe sa ibabang kaliwang sulok tulad ng ipinakita sa ibaba,
Tulad ng pagsisimula ng programa makakakuha ka ng numero ng popup ng plate plate at ang numero sa window ng utos. Ang output para sa aking imahe ay magiging hitsura ng imaheng ibinigay sa ibaba;
Ang kumpletong pagtatrabaho ng Vehicle Lisensya ng Plate Detection System ay ipinakita sa Video sa ibaba, at ang lahat ng mga file ng code na may mga template ng imahe ay maaaring ma-download mula dito.
Gayundin, suriin dito ang lahat ng mga MATLAB na Proyekto.