- Oprettelse af skabeloner
- Brevdetektion
- Registrering af nummerplade
- Brug af køretøjets registreringsnummer til detekteringssystem ved hjælp af MATLAB
Har du nogensinde spekuleret på, hvordan et ANPR-system (Automatic Number Plate Recognition) fungerer? Lad mig fortælle dig konceptet bag det, kameraet i ANPR-systemet fanger billedet af køretøjets nummerplade, og derefter behandles billedet gennem flere antal algoritmer for at give en alfanumerisk konvertering af billedet til et tekstformat. ANPR-systemet bruges mange steder som benzinpumper, indkøbscentre, lufthavne, motorveje, bomstande, hoteller, hospitaler, parkeringspladser, forsvar og militære kontrolpunkter osv.
Der er mange billedbehandlingsværktøjer til rådighed til denne registrering af nummerplader, men her i denne vejledning bruger vi MATLAB billedbehandling til at få køretøjets nummerplade nummer i tekstformatet. Hvis du er ny med MATLAB eller billedbehandling, så tjek vores tidligere MATLAB-projekter:
- Kom godt i gang med MATLAB: En hurtig introduktion
- Kom godt i gang med billedbehandling ved hjælp af MATLAB
Lad mig først orientere dig om det koncept, vi bruger til at detektere nummerplader. Der er tre programmer eller '.m' filer til dette projekt.
- Oprettelse af skabeloner ( template_creation.m ) - Dette bruges til at kalde de gemte billeder af alfanumerik og derefter gemme dem som en ny skabelon i MATLAB-hukommelsen.
- Letter Detection ( Letter_detection.m ) - Læser tegnene fra inputbilledet og finder den tilsvarende alfanumeriske tilsvarende matchende.
- Pladedetektion ( Plate_detection.m ) - Behandl billedet, og ring derefter til de ovennævnte to m-filer for at registrere nummeret.
Nu vil vi lære om, hvordan du koder disse m-filer, og hvad du skal gøre, før du begynder at kode. Efter at have gennemgået denne vejledning kan du finde alle kodefiler og arbejdsforklaringsvideo i slutningen af dette projekt.
Oprettelse af skabeloner
Opret først en mappe til projektet (mit mappenavn er nummerpladedetektion ) for at gemme og gemme filerne. Vi har gemt de binære billeder af alle alfabeter og tal i undermappen kaldet ' alfa' .
Åbn nu Editor-vinduet i MATLAB, som vist i nedenstående billede,
Hvis du ikke er bekendt med MATLAB's grundlæggende terminologi, foreslår jeg dig at tjekke den sammenkædede tutorial.
Nu skal du kopiere og indsætte nedenstående kode i filen template_creation.m , og gemme filen i projektmappen ( Registrering af nummerplade ). Alle filer relateret til dette projekt inklusive billedskabelonfiler kan downloades herfra. Også kontrollere videoen givet i slutningen af dette projekt.
% Alfabet 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'); % Naturlige tal et = imread ('alpha / 1.bmp'); to = imread ('alpha / 2.bmp'); tre = imread ('alpha / 3.bmp'); fire = imread ('alpha / 4.bmp'); fem = imread ('alpha / 5.bmp'); seks = imread ('alpha / 6.bmp'); syv = imread ('alpha / 7.bmp'); otte = imread ('alpha / 8.bmp'); ni = imread ('alpha / 9.bmp'); nul = imread ('alpha / 0.bmp'); % Oprettelse af matrix for alfabetbogstaver =; % Oprettelse af Array for Numbers antal =; NewTemplates =; gem ('NewTemplates', 'NewTemplates') ryd alle
Her gemmer vi i ovenstående kode billederne i en variabel ved hjælp af kommandoen ' imread () '. Denne funktion bruges til at kalde billederne fra mappen eller fra ethvert sted på pc'en til MATLAB. Lad os tage et eksempel fra ovenstående kode:
A = imread ('alpha / A.bmp');
Hvor A er variablen, og i ' alpha / A.bmp' er 'alpha' mappenavnet, og ' A.bmp' er filnavnet.
Opret derefter en matrix med ' bogstav ' og ' nummer ', og gem den i variablen ' NewTemplates ' ved hjælp af kommandoen ' save (filnavn, variabler)' .
% Oprettelse af matrix for alfabetbogstaver =; % Oprettelse af Array for Numbers antal =; NewTemplates =; gem ('NewTemplates', 'NewTemplates') ryd alle
Start nu med at kode Letter_detection.m i et nyt editorvindue.
Brevdetektion
Her opretter vi den anden kodefil med navnet Letter_detection.m . Nu skal du kopiere og indsætte nedenstående kode i den fil og gemme filen i projektmappen med navnet Letter_detection. Denne fil kan downloades herfra, denne vedhæftede zip-fil indeholder også andre filer relateret til dette nummerpladedetekteringsprojekt.
funktionsbogstav = readLetter (snap) load NewTemplates snap = imresize (snap,); rec =; for n = 1: længde (NewTemplates) cor = corr2 (NewTemplates {1, n}, snap); rec =; slut ind = find (rec == max (rec)); display (find (rec == max (rec))); % Alfabetlister. hvis ind == 1 - ind == 2 bogstaver = 'A'; elseif ind == 3 - ind == 4 bogstav = 'B'; elseif ind == 5 bogstav = 'C' elseif ind == 6 - ind == 7 bogstav = 'D'; elseif ind == 8 bogstaver = 'E'; elseif ind == 9 bogstav = 'F'; elseif ind == 10 bogstaver = 'G'; elseif ind == 11 bogstav = 'H'; elseif ind == 12 bogstaver = 'I'; elseif ind == 13 bogstav = 'J'; elseif ind == 14 bogstav = 'K'; elseif ind == 15 bogstaver = 'L'; elseif ind == 16 bogstav = 'M'; elseif ind == 17 bogstav = 'N'; elseif ind == 18 - ind == 19 bogstav = 'O'; elseif ind == 20 - ind == 21 bogstav = 'P'; elseif ind == 22 - ind == 23 bogstav = 'Q'; elseif ind == 24 - ind == 25 bogstav = 'R'; elseif ind == 26 bogstav = 'S'; elseif ind == 27 bogstav = 'T'; elseif ind == 28 bogstav = 'U'; elseif ind == 29 bogstav = 'V'; elseif ind == 30 bogstaver = 'W'; elseif ind == 31 bogstav = 'X'; elseif ind == 32 bogstav = 'Y'; elseif ind == 33 bogstav = 'Z'; % * - * - * - * - * % tal lister. elseif ind == 34 bogstav = '1'; elseif ind == 35 bogstav = '2'; elseif ind == 36 bogstav = '3'; elseif ind == 37 - ind == 38 bogstav = '4'; elseif ind == 39 bogstav = '5'; elseif ind == 40 - ind == 41 - ind == 42 bogstav = '6'; elseif ind == 43 bogstav = '7'; elseif ind == 44 - ind == 45 bogstav = '8'; elseif ind == 46 - ind == 47 - ind == 48 bogstav = '9'; ellers bogstav = '0'; slutningen slutningen
Her i ovenstående kode har vi oprettet en funktion med navnet bogstav, der giver os det alfanumeriske output af inputbilledet fra klasse ' alpha ' ved hjælp af kommandoen ' readLetter ()' . Og indlæs derefter de gemte skabeloner ved hjælp af kommandolast 'NewTemplates .
Derefter har vi ændret størrelsen på inputbilledet, så det kan sammenlignes med skabelonens billeder ved hjælp af kommandoen 'imresize (filnavn, størrelse)' . Derefter bruges for loop til at korrelere inputbilledet med hvert billede i skabelonen for at få det bedste match.
En matrix ' rec ' oprettes for at registrere korrelationsværdien for hver alfanumerisk skabelon med tegnskabelonen fra inputbilledet, som vist i nedenstående kode,
cor = corr2 (NewTemplates {1, n}, snap);
Derefter bruges kommandoen 'find ()' til at finde det indeks, der svarer til det højest matchede tegn. Derefter udskrives det tilsvarende tegn ifølge dette indeks ved hjælp af 'if-else' udsagn.
Efter at have afsluttet dette åbner du et nyt editorvindue for at starte kode til hovedprogrammet.
Registrering af nummerplade
Her er den tredje og sidste kodefil ved navn Plate_detection.m kopier og indsæt nedenstående kode i denne fil og gem den i projektmappen. For hurtig start kan du downloade alle kodefiler med billedskabeloner herfra.
luk alle; Slet alt; im = imread ('Number Plate Images / image1.png'); imgray = rgb2gray (im); imbin = imbinarize (imgray); im = kant (imgray, 'prewitt'); % Nedenfor finder du trin for at finde placeringen af nummerpladen Iprops = regionprops (im, 'BoundingBox', 'Area', 'Image'); areal = Iprops.Area; count = numel (Iprops); maxa = areal; boundingBox = Iprops.BoundingBox; for i = 1: tæl hvis maxa
Grundlæggende kommandoer, der bruges i ovenstående kode, er nævnt nedenfor:
imread () - Denne kommando bruges til at åbne billedet i MATLAB fra målmappen.
rgb2gray () –Denne kommando bruges til at konvertere RGB-billedet til gråtoneformat.
imbinarize () - Denne kommando bruges til at Binarize 2-D gråtonebillede, eller simpelthen kan vi sige, at det konverterer billedet til sort / hvid-format.
edge () - Denne kommando bruges til at registrere kanterne i billedet ved hjælp af forskellige metoder som Roberts, Sobel, Prewitt og mange andre.
regionprops () - Denne kommando bruges til at måle egenskaber for billedregion.
numel () - Denne kommando bruges til at beregne antallet af arrayelementer.
imcrop () - Denne kommando bruges til at beskære billedet i den indtastede størrelse.
bwareaopen () - Denne kommando bruges til at fjerne små objekter fra binært billede.
Ved at bruge ovenstående kommandoer i koden kalder vi inputbilledet og konverterer det til gråtonen. Derefter konverteres gråtonen til det binære billede, og kanten af de binære billeder detekteres ved hjælp af Prewitt-metoden.
Derefter bruges nedenstående kode til at detektere placeringen af nummerpladen i hele inputbilledet, Iprops = regionprops (im, 'BoundingBox', 'Area', 'Image'); areal = Iprops.Area; count = numel (Iprops); maxa = areal; boundingBox = Iprops.BoundingBox; for i = 1: tæl hvis maxa
Derefter beskæres nummerpladen og fjernes de små objekter fra det binære billede ved hjælp af henholdsvis kommandoen 'imcrop ()' og 'bwareaopen ()' .
Derefter bruges nedenstående kode til at behandle det beskårne nummerpladebillede og til at vise det detekterede nummer i billed- og tekstformatet (i kommandovinduet).
Iprops = regionprops (im, 'BoundingBox', 'Area', 'Image'); count = numel (Iprops); noPlate =; for i = 1: tæl ow = længde (Iprops (i).Billede (1,:)); oh = længde (Iprops (i).Billede (:, 1)); hvis ow <(h / 2) & oh> (h / 3) bogstav = Letter_detection (Iprops (i).Billede); noPlate = ende ende
Brug af køretøjets registreringsnummer til detekteringssystem ved hjælp af MATLAB
I filen template_creation.m har vi designet koden til at gemme alle de binære billeder af alfanumerik i en mappe eller fil, der hedder ' NewTemplates '. Derefter kaldes den mappe i Letter_detection.m som du kan se nedenfor
Derefter kaldes kodefilen Letter_detection.m i kodefilen Plate_detection.m , når vi behandler billedet som vist i billedet nedenfor,
Klik nu på knappen 'KØR' for at køre.m-filen
MATLAB kan tage nogle få sekunder at svare, vent indtil det viser optaget besked i nederste venstre hjørne som vist nedenfor,
Når programmet starter, får du pop op til nummerpladebilledet og nummeret i kommandovinduet. Outputtet til mit billede vil se ud som billedet nedenfor;
Komplet bearbejdning af køretøjsregistreringsnummerregistreringssystem demonstreres i videoen nedenfor, og alle kodefiler med billedskabeloner kan downloades herfra.
Tjek også alle MATLAB-projekter her.