- Šablonų kūrimas
- Laiško aptikimas
- Numerio ženklo aptikimas
- Transporto priemonės valstybinio numerio aptikimo sistemos naudojimas naudojant MATLAB
Ar kada susimąstėte, kaip veikia ANPR (automatinis numerio ženklo atpažinimas) sistema? Leiskite man pasakyti, kokia yra jo koncepcija: ANPR sistemos kamera užfiksuoja transporto priemonės valstybinio numerio vaizdą, o tada vaizdas apdorojamas naudojant kelis algoritmus, kad vaizdas būtų raidinis ir skaitinis konvertuojamas į teksto formatą. ANPR sistema naudojama daugelyje vietų, pavyzdžiui, benzino siurbliuose, prekybos centruose, oro uostuose, greitkeliuose, rinkliavų kabinose, viešbučiuose, ligoninėse, automobilių stovėjimo aikštelėse, gynybos ir karinėse kontrolės vietose ir kt.
Šiam numerio ženklų aptikimui yra daugybė vaizdo apdorojimo įrankių, tačiau čia, šioje pamokoje, naudosime MATLAB vaizdų apdorojimą, kad transporto priemonės valstybinio numerio numerį gautume į teksto formatą. Jei esate naujokas su MATLAB ar vaizdo apdorojimu, patikrinkite mūsų ankstesnius MATLAB projektus:
- Darbo su MATLAB pradžia: greita įžanga
- Darbo su vaizdų apdorojimu naudojant MATLAB pradžia
Pirmiausia leiskite trumpai papasakoti apie koncepciją, kurią naudojame numerių lentelėms aptikti. Šiam projektui yra trys programos arba „.m“ failai.
- Šablono kūrimas ( template_creation.m ) - jis naudojamas iškviesti išsaugotus raidinių ir skaitmeninių vaizdų vaizdus ir tada išsaugoti juos kaip naują šabloną MATLAB atmintyje.
- Laiško aptikimas ( Letter_detection.m ) - nuskaitomi simboliai iš įvesties vaizdo ir surandama labiausiai atitinkanti raidinė ir skaitinė raidė.
- Plokščių aptikimas ( Plate_detection.m ) - apdorokite vaizdą ir paskambinkite aukščiau nurodytiems dviem m failams, kad aptiktumėte numerį.
Dabar mes sužinosime, kaip koduoti šiuos m failus ir ką turite padaryti prieš pradėdami koduoti. Peržiūrėję šią pamoką, šio projekto pabaigoje galite rasti visus kodų failus ir darbinį paaiškinimo vaizdo įrašą.
Šablonų kūrimas
Pirmiausia sukurkite aplanką projektui (mano aplanko pavadinimas yra numerio ženklo aptikimas ), kad išsaugotumėte ir išsaugotumėte failus. Visų abėcėlių ir skaičių dvejetainius vaizdus išsaugojome antriniame aplanke, pavadintame „ alfa“ .
Dabar atidarykite redaktoriaus langą MATLAB, kaip parodyta žemiau esančiame paveikslėlyje,
Jei nesate susipažinę su pagrindine MATLAB terminologija, siūlau patikrinti susietą mokymo programą.
Dabar nukopijuokite ir įklijuokite žemiau esantį kodą į template_creation.m failą ir išsaugokite failą projekto aplanke ( numerio ženklo aptikimas ). Visus su šiuo projektu susijusius failus, įskaitant paveikslėlių šablonų failus, galite atsisiųsti iš čia. Taip pat patikrinkite vaizdo įrašą, pateiktą šio projekto pabaigoje.
% Abėcėlių A = perskaityta („alfa / A.bmp“); B = perskaityta („alfa / B.bmp“); C = perskaityta („alfa / C.bmp“); D = perskaitytas ('alfa / D.bmp'); E = perskaitytas ('alfa / E.bmp'); F = perskaitytas ('alfa / F.bmp'); G = perskaitytas ('alfa / G.bmp'); H = perskaitytas ('alfa / H.bmp'); I = perskaitytas ('alfa / I.bmp'); J = imread ('alfa / J.bmp'); K = imread ('alfa / K.bmp'); L = imread ('alfa / L.bmp'); M = perskaitytas ('alfa / M.bmp'); N = perskaitytas ('alfa / N.bmp'); O = perskaitytas ('alfa / O.bmp'); P = perskaityti ('alfa / P.bmp'); Q = perskaityti ('alfa / Q.bmp'); R = perskaityti ('alfa / R.bmp'); S = perskaitytas ('alfa / S.bmp'); T = perskaitytas ('alfa / T.bmp'); U = perskaitytas ('alfa / U.bmp'); V = perskaitytas ('alfa / V.bmp'); W = perskaitytas ('alfa / W.bmp'); X = perskaitytas ('alfa / X.bmp '); Y = neskaitytas ('alfa / Y.bmp'); Z = neskaitytas ('alfa / Z.bmp'); % Natūralių skaičių vienas = perskaitytas ('alfa / 1.bmp'); du = perskaitytas ('alfa / 2.bmp'); trys = perskaityti ('alfa / 3.bmp'); keturi = perskaityti ('alfa / 4.bmp'); penki = perskaityti ('alfa / 5.bmp'); šeši = perskaityti ('alfa / 6.bmp'); septyni = perskaityti ('alfa / 7.bmp'); aštuoni = perskaityti ('alfa / 8.bmp'); devyni = perskaityti ('alfa / 9.bmp'); nulis = perskaitytas ('alfa / 0.bmp'); % Masyvo kūrimas abėcėlėms raidė =; % Masyvo kūrimas skaičiams =; NewTemplates =; išsaugoti ('NewTemplates', 'NewTemplates') išvalyti visus
Čia, aukščiau pateiktame kode, vaizdus įrašome į kintamąjį naudodami komandą „ imread () “. Ši funkcija naudojama vaizdams iš aplanko arba iš bet kurios kompiuterio vietos iškviesti į MATLAB. Paimkime pavyzdį iš pirmiau nurodyto kodo:
A = perskaitytas ('alfa / A.bmp');
Kur A yra kintamasis, o „ alfa / A.bmp“ - „alfa“ yra aplanko pavadinimas, o „ A.bmp“ - failo pavadinimas.
Tada sukurkite „ raidės “ ir „ skaičiaus “ matricą ir išsaugokite ją kintamajame „ NewTemplates “ naudodami komandą „ save (failo pavadinimas, kintamieji)“ .
% Masyvo kūrimas abėcėlėms raidė =; % Masyvo kūrimas skaičiams =; NewTemplates =; išsaugoti ('NewTemplates', 'NewTemplates') išvalyti visus
Dabar pradėkite koduoti „ Letter_detection.m “ naujame redaktoriaus lange.
Laiško aptikimas
Čia mes kuriame antrą kodo failą pavadinimu Letter_detection.m . Dabar nukopijuokite ir įklijuokite žemiau esantį kodą į tą failą ir išsaugokite failą projekto aplanke pavadinimu Letter_detection. Šį failą galima atsisiųsti iš čia, šiame pridedamame ZIP faile yra ir kitų failų, susijusių su šiuo numerio ženklo aptikimo projektu.
funkcijos raidė = readLetter (snap) apkrova NewTemplates snap = imresize (snap,); rec =; n = 1: ilgis (NewTemplates) cor = corr2 (NewTemplates {1, n}, snap); rec =; pabaigos ind = rasti (rec == max (rec)); rodyti (rasti (rec == max (rec))); % Abėcėlės sąrašų. jei ind == 1 - ind == 2 raidė = 'A'; elseif ind == 3 - ind == 4 raidė = 'B'; elseif ind == 5 raidė = 'C' elseif ind == 6 - ind == 7 raidė = 'D'; elseif ind == 8 raidė = 'E'; elseif ind == 9 raidė = 'F'; elseif ind == 10 raidžių = 'G'; elseif ind == 11 raidė = 'H'; elseif ind == 12 raidžių = 'Aš'; elseif ind == 13 raidė = 'J'; elseif ind == 14 raidė = 'K'; elseif ind == 15 raidė = 'L'; elseif ind == 16 raidžių = 'M'; elseif ind == 17 raidžių = 'N'; elseif ind == 18 - ind == 19 raidė = 'O'; elseif ind == 20 - ind == 21 raidė = 'P'; elseif ind == 22 - ind == 23 raidė = 'Q'; elseif ind == 24 - ind == 25 raidė = 'R'; elseif ind == 26 raidė = 'S'; elseif ind == 27 raidė = 'T'; elseif ind == 28 raidė = 'U'; elseif ind == 29 raidė = 'V'; elseif ind == 30 raidžių = 'W'; elseif ind == 31 raidė = 'X'; elseif ind == 32 raidė = 'Y'; elseif ind == 33 raidė = 'Z'; % * - * - * - * - * % skaitmenimis sąrašus. elseif ind == 34 raidė = '1'; elseif ind == 35 raidė = '2'; elseif ind == 36 raidė = '3'; elseif ind == 37 - ind == 38 raidė = '4'; elseif ind == 39 raidė = '5'; elseif ind == 40 - ind == 41 - ind == 42 raidė = '6'; elseif ind == 43 raidė = '7'; elseif ind == 44 - ind == 45 raidė = '8'; elseif ind == 46 - ind == 47 - ind == 48 raidė = '9'; kita raidė = '0'; pabaigos pabaiga
Čia, aukščiau pateiktame kode, sukūrėme funkciją, pavadintą raidė, kuri suteikia komandai „ readLetter ()“ raidinį ir skaitinį įvesties atvaizdo išvestį iš „ alpha “ klasės. Tada įkelkite išsaugotus šablonus naudodami komandą „NewTemplates“ .
Po to mes pakeitėme įvesties vaizdo dydį, kad jį būtų galima palyginti su šablono vaizdais, naudojant komandą „imresize (failo pavadinimas, dydis)“ . Tada „ loop“ naudojama norint koreguoti įvesties vaizdą su kiekvienu šablone esančiu vaizdu, kad gautumėte geriausią atitikimą.
Sukurta matrica „ rec “, skirta įrašyti kiekvieno raidinio ir skaitmeninio šablono koreliacijos vertę su simbolių šablonu iš įvesties atvaizdo, kaip parodyta žemiau esančiame kode,
cor = corr2 („NewTemplates“ {1, n}, spragtelėjimas);
Tada „find ()“ komanda naudojama norint rasti indeksą, kuris atitinka geriausiai suderintą simbolį. Tada pagal tą rodyklę atitinkamas simbolis atspausdinamas naudojant „if-else“ sakinį.
Dabar, atlikę tai, atidarykite naują redaktoriaus langą, kad paleistumėte pagrindinės programos kodą.
Numerio ženklo aptikimas
Čia yra trečiasis ir paskutinis kodo failas pavadinimu Plate_detection.m nukopijuokite ir įklijuokite žemiau esantį kodą į šį failą ir išsaugokite projekto aplanke. Norėdami greitai pradėti, galite atsisiųsti visus kodo failus su vaizdų šablonais iš čia.
uždaryti visus; Išvalyti viską; im = imread ('Numerio ženklo vaizdai / image1.png'); imgray = rgb2gray (im); imbin = imbinarizuoti (imgray); im = kraštas (imgray, 'prewitt'); % Žemiau nurodyti žingsniai yra rasti numerio ženklo vietą Iprops = regionprops (im, 'BoundingBox', 'Area', 'Image'); plotas = Iprops.Area; skaičius = numel (Iprops); maxa = plotas; boundingBox = Iprops.BoundingBox; i = 1: skaičiuokite, jei maks
Pagrindinės komandos, naudojamos aukščiau esančiame kode, yra paminėtos toliau:
imread () - ši komanda naudojama norint atidaryti vaizdą į MATLAB iš tikslinio aplanko.
rgb2gray () - ši komanda naudojama konvertuoti RGB vaizdą į pilkos skalės formatą.
imbinarize () - Ši komanda naudojama 2-D pilkos spalvos atvaizdui sudaryti arba paprasčiausiai galime pasakyti, kad vaizdas konvertuojamas į juodai baltą formatą.
edge () - ši komanda naudojama atpažinti vaizdo kraštus naudojant įvairius metodus, tokius kaip Roberts, Sobel, Prewitt ir daugelis kitų.
regionprops () - ši komanda naudojama vaizdo regiono savybėms matuoti.
numel () - Ši komanda naudojama masyvo elementų skaičiui apskaičiuoti.
imcrop () - ši komanda naudojama norint apkarpyti vaizdą įvesto dydžio.
bwareaopen () - ši komanda naudojama norint pašalinti mažus objektus iš dvejetainio atvaizdo.
Naudodami pirmiau nurodytas komandas kode, mes vadiname įvesties vaizdą ir konvertuojame jį į pilkąją skalę. Tada pilkoji skalė paverčiama dvejetainiu vaizdu, o dvejetainių vaizdų kraštas nustatomas Prewitt metodu.
Tada žemiau pateiktas kodas naudojamas aptikti numerio lentelės vietą visame įvesties vaizde, Iprops = regionprops (im, 'BoundingBox', 'Area', 'Image'); plotas = Iprops.Area; skaičius = numel (Iprops); maxa = plotas; boundingBox = Iprops.BoundingBox; i = 1: skaičiuokite, jei maks
Po to apkarpykite numerio lentelę ir pašalinkite mažus objektus iš dvejetainio atvaizdo naudodami komandas „imcrop ()“ ir „bwareaopen ()“ .
Tada žemiau pateiktas kodas naudojamas apdoroti tą apkarpytą valstybinio numerio ženklo vaizdą ir aptiktą skaičių rodyti vaizdo ir teksto formatu (komandos lange).
Iprops = regionprops (im, 'BoundingBox', 'Area', 'Image'); skaičius = numel (Iprops); noPlate =; i = 1: skaičiuokite ow = ilgis (Iprops (i). Vaizdas (1,:)); oh = ilgis (Iprops (i). Vaizdas (:, 1)); if ow <(h / 2) & oh> (h / 3) raidė = Laiško nustatymas („Iprops“ (i). Vaizdas); noPlate = pabaigos pabaiga
Transporto priemonės valstybinio numerio aptikimo sistemos naudojimas naudojant MATLAB
Faile „ template_creation.m“ turime suprojektuoti kodą, kad visi dvejetainiai raidiniai ir skaitiniai vaizdai būtų išsaugoti kataloge ar faile, pavadintame „ NewTemplates “. Tada tas katalogas vadinamas „ Letter_detection.m“, kaip matote toliau
Tada „ Plate_detection.m“ kodo faile Letter_detection.m kodo failas iškviečiamas, kai apdorojame vaizdą, kaip parodyta paveikslėlyje žemiau,
Dabar, norėdami paleisti.m failą, spustelėkite mygtuką „Vykdyti“
Gali praeiti kelios sekundės, kol MATLAB atsakys, palaukite, kol apatiniame kairiajame kampe rodomas užimtas pranešimas, kaip parodyta žemiau,
Paleidus programą, gausite numerio ženklo atvaizdo iššokantį langą ir numerį komandos lange. Mano atvaizdas bus panašus į žemiau pateiktą vaizdą;
Visiškas automobilio licencijos numerio atpažinimo sistemos veikimas parodytas toliau pateiktame vaizdo įraše, o visus kodo failus su atvaizdų šablonais galite atsisiųsti iš čia.
Taip pat čia patikrinkite visus MATLAB projektus.