- Maloppretting
- Brevdeteksjon
- Registrering av nummerplate
- Arbeid av registreringsnummer for kjøretøyets registreringsnummer ved bruk av MATLAB
Har du noen gang lurt på hvordan et ANPR-system (Automatic Number Plate Recognition) fungerer? La meg fortelle deg konseptet bak, kameraet til ANPR-systemet tar et bilde av bilens lisensplate, og deretter blir bildet behandlet gjennom flere antall algoritmer for å gi en alfanumerisk konvertering av bildet til et tekstformat. ANPR-systemet brukes mange steder som bensinpumper, kjøpesentre, flyplasser, motorveier, bomstasjoner, hoteller, sykehus, parkeringsplasser, forsvar og militære kontrollpunkter etc.
Det er mange bildebehandlingsverktøy tilgjengelig for denne registreringsnummerplaten, men her i denne opplæringen vil vi bruke MATLAB bildebehandling for å få kjøretøyets registreringsnummer i tekstformatet. Hvis du er ny med MATLAB eller bildebehandling, så sjekk våre tidligere MATLAB-prosjekter:
- Komme i gang med MATLAB: En rask introduksjon
- Komme i gang med bildebehandling ved hjelp av MATLAB
Først, la meg orientere deg om konseptet vi bruker for å oppdage nummerplater. Det er tre programmer eller '.m' filer for dette prosjektet.
- Maloppretting ( template_creation.m ) - Dette brukes til å kalle lagrede bilder av alfanumerikk og deretter lagre dem som en ny mal i MATLAB-minne.
- Letter Detection ( Letter_detection.m ) - Leser tegnene fra inngangsbildet og finn den tilsvarende samsvarende alfanumeriske.
- Plate Detection ( Plate_detection.m ) - Behandle bildet og ring deretter de ovennevnte to m-filene for å oppdage nummeret.
Nå vil vi lære om hvordan du koder disse m-filene og hva du må gjøre før du begynner å kode. Etter å ha gått gjennom denne veiledningen, kan du finne alle kodefilene og arbeidsforklaringsvideoen på slutten av dette prosjektet.
Maloppretting
Opprett først en mappe for prosjektet (mappenavnet mitt er nummerplatedeteksjon ) for å lagre og lagre filene. Vi har lagret de binære bildene av alle alfabeter og tall i undermappen kalt ' alfa' .
Åpne nå Editor-vinduet i MATLAB, som vist på bildet nedenfor,
Hvis du ikke er kjent med den grunnleggende terminologien til MATLAB, foreslår jeg at du sjekker den tilknyttede opplæringen.
Nå, kopier og lim inn koden nedenfor i template_creation.m- filen, og lagre filen i prosjektmappen ( Nummerplatedeteksjon ). Alle filene relatert til dette prosjektet, inkludert bildemalerfiler, kan lastes ned herfra. Også sjekke videoen gitt på slutten av dette prosjektet.
% 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 tall ett = 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'); åtte = imread ('alpha / 8.bmp'); ni = imread ('alpha / 9.bmp'); null = imread ('alpha / 0.bmp'); % Opprette matrise for alfabetbokstav =; % Opprette Array for Numbers number =; NewTemplates =; lagre ('NewTemplates', 'NewTemplates') tøm alle
Her, i koden ovenfor, lagrer vi bildene i en variabel ved å bruke kommandoen ' imread () '. Denne funksjonen brukes til å kalle bildene fra mappen eller fra hvilken som helst plassering på PCen til MATLAB. La oss ta et eksempel fra koden ovenfor:
A = imread ('alpha / A.bmp');
Der A er variabelen, og i ' alpha / A.bmp' , er 'alpha' mappenavnet og ' A.bmp' er filnavnet.
Lag deretter en matrise med " bokstav " og " nummer " og lagre den i variabelen " NewTemplates " ved å bruke kommandoen " lagre (filnavn, variabler)" .
% Opprette matrise for alfabetbokstav =; % Opprette matrise for tall nummer =; NewTemplates =; lagre ('NewTemplates', 'NewTemplates') tøm alle
Begynn nå å kode Letter_detection.m , i et nytt redigeringsvindu.
Brevdeteksjon
Her lager vi den andre kodefilen kalt Letter_detection.m . Nå, kopier og lim inn koden nedenfor i den filen og lagre filen i prosjektmappen med navnet Letter_detection. Denne filen kan lastes ned herfra, denne vedlagte zip-filene inneholder også andre filer relatert til dette nummerplatedeteksjonsprosjektet.
funksjonsbokstav = readLetter (snap) last NewTemplates snap = imresize (snap,); rec =; for n = 1: lengde (NewTemplates) cor = corr2 (NewTemplates {1, n}, snap); rec =; slutt ind = finn (rec == max (rec)); display (find (rec == max (rec))); % Alfabetiske lister. hvis ind == 1 - ind == 2 bokstaver = 'A'; elseif ind == 3 - ind == 4 letter = 'B'; elseif ind == 5 letter = 'C' elseif ind == 6 - ind == 7 letter = 'D'; elseif ind == 8 bokstav = 'E'; elseif ind == 9 bokstav = 'F'; elseif ind == 10 bokstaver = 'G'; elseif ind == 11 letter = 'H'; elseif ind == 12 letter = 'I'; elseif ind == 13 letter = 'J'; elseif ind == 14 bokstav = 'K'; elseif ind == 15 bokstav = 'L'; elseif ind == 16 letter = 'M'; elseif ind == 17 letter = 'N'; elseif ind == 18 - ind == 19 letter = 'O'; elseif ind == 20 - ind == 21 letter = 'P'; elseif ind == 22 - ind == 23 letter = 'Q'; elseif ind == 24 - ind == 25 letter = 'R'; elseif ind == 26 letter = 'S'; elseif ind == 27 bokstav = 'T'; elseif ind == 28 bokstav = 'U'; elseif ind == 29 bokstav = 'V'; elseif ind == 30 bokstaver = 'W'; elseif ind == 31 bokstav = 'X'; elseif ind == 32 bokstav = 'Y'; elseif ind == 33 bokstav = 'Z'; % * - * - * - * - * % tall oppføringer. elseif ind == 34 letter = '1'; elseif ind == 35 letter = '2'; elseif ind == 36 letter = '3'; elseif ind == 37 - ind == 38 letter = '4'; elseif ind == 39 letter = '5'; elseif ind == 40 - ind == 41 - ind == 42 letter = '6'; elseif ind == 43 letter = '7'; elseif ind == 44 - ind == 45 letter = '8'; elseif ind == 46 - ind == 47 - ind == 48 letter = '9'; annet bokstav = '0'; slutten slutten
Her, i ovennevnte kode, har vi opprettet en funksjon med navnet bokstav som gir oss den alfanumeriske utgangen av inngangsbildet fra klasse ' alfa ' ved å bruke kommandoen ' readLetter ()' . Og last deretter de lagrede malene ved å bruke kommandolast 'NewTemplates .
Etter det har vi endret størrelsen på inngangsbildet slik at det kan sammenlignes med malens bilder ved å bruke kommandoen 'endre størrelse (filnavn, størrelse)' . Deretter brukes for loop til å korrelere inngangsbildet med hvert bilde i malen for å få best samsvar.
En matrise ' rec ' opprettes for å registrere korrelasjonsverdien for hver alfanumerisk mal med tegnmalen fra inngangsbildet, som vist i koden nedenfor,
cor = corr2 (NewTemplates {1, n}, snap);
Deretter brukes 'find ()' - kommandoen til å finne indeksen som tilsvarer tegnet med høyest samsvar. I henhold til denne indeksen skrives tilsvarende tegn ut med 'if-else' -uttrykket.
Nå, etter å ha fullført dette, åpner du et nytt redigeringsvindu for å starte koden for hovedprogrammet.
Registrering av nummerplate
Her er den tredje og siste kodefilen Plate_detection.m, kopier og lim inn koden nedenfor i denne filen og lagre i prosjektmappen. For rask start kan du laste ned alle kodefilene med bildemaler herfra.
Lukk alle; slett alt; im = imread ('Number Plate Images / image1.png'); imgray = rgb2gray (im); imbin = imbinarize (imgray); im = edge (imgray, 'prewitt'); % Nedenfor finner du trinn for å finne plasseringen til nummerplaten Iprops = regionprops (im, 'BoundingBox', 'Area', 'Image'); areal = Iprops.Area; count = numel (Iprops); maxa = areal; boundingBox = Iprops.BoundingBox; for i = 1: tell hvis maxa
Grunnleggende kommandoer som brukes i ovennevnte kode er nevnt nedenfor:
imread () - Denne kommandoen brukes til å åpne bildet i MATLAB fra målmappen.
rgb2gray () –Denne kommandoen brukes til å konvertere RGB-bildet til gråtoneformat.
imbinarize () - Denne kommandoen brukes til å Binarize 2-D gråtonebilde eller ganske enkelt kan vi si at det konverterer bildet til svart-hvitt-format.
edge () - Denne kommandoen brukes til å oppdage kantene i bildet, ved å bruke forskjellige metoder som Roberts, Sobel, Prewitt og mange andre.
regionprops () - Denne kommandoen brukes til å måle egenskapene til bildeområdet.
numel () - Denne kommandoen brukes til å beregne antall matriseelementer.
imcrop () - Denne kommandoen brukes til å beskjære bildet i den angitte størrelsen.
bwareaopen () - Denne kommandoen brukes til å fjerne små objekter fra binært bilde.
Ved å bruke kommandoene ovenfor i koden, kaller vi inngangsbildet og konverterer det til gråtonen. Deretter blir gråtonen konvertert til det binære bildet, og kanten av de binære bildene oppdages ved Prewitt-metoden.
Deretter brukes koden nedenfor for å oppdage plasseringen av nummerplaten i hele inngangsbildet, Iprops = regionprops (im, 'BoundingBox', 'Area', 'Image'); areal = Iprops.Area; count = numel (Iprops); maxa = areal; boundingBox = Iprops.BoundingBox; for i = 1: tell hvis maxa
Etter det beskjærer du nummerplaten og fjerner de små objektene fra det binære bildet ved å bruke henholdsvis kommandoen 'imcrop ()' og 'bwareaopen ()' .
Deretter blir koden nedenfor brukt til å behandle det beskjærte nummerplaten og vise det oppdagede nummeret i bilde- og tekstformatet (i kommandovinduet).
Iprops = regionprops (im, 'BoundingBox', 'Area', 'Image'); count = numel (Iprops); noPlate =; for i = 1: tell ow = lengde (Iprops (i).Bilde (1,:)); oh = lengde (Iprops (i).Bilde (:, 1)); hvis ow <(h / 2) & oh> (h / 3) letter = Letter_detection (Iprops (i).Image); noPlate = end end
Arbeid av registreringsnummer for kjøretøyets registreringsnummer ved bruk av MATLAB
I template_creation.m- filen har vi designet koden for å lagre alle binære bilder av alfanumerikk i en katalog eller fil som heter ' NewTemplates '. Deretter kalles den katalogen i Letter_detection.m som du kan se nedenfor
Deretter i Plate_detection.m kode filen Letter_detection.m kodefilen kalles når vi behandle bildet som vist på bildet nedenfor,
Klikk nå på 'RUN' -knappen for å kjøre.m-filen
MATLAB kan ta noen sekunder å svare, vent til det viser opptatt melding i nederste venstre hjørne som vist nedenfor,
Når programmet starter, får du popup-nummeret til nummerplaten og nummeret i kommandovinduet. Utgangen for bildet mitt vil se ut som bildet gitt nedenfor;
Fullstendig bearbeiding av kjøretøyets registreringsnummer for registreringsnummer er demonstrert i videoen nedenfor, og alle kodefilene med bildemaler kan lastes ned herfra.
Sjekk også alle MATLAB-prosjekter her.