- Mallskapande
- Brevavkänning
- Nummerplåtsdetektering
- Arbetning av registreringsnummer för registreringsnummer för fordon med hjälp av MATLAB
Har du någonsin undrat hur ett ANPR-system (Automatic Number Plate Recognition) fungerar? Låt mig berätta konceptet bakom det, kameran i ANPR-systemet fångar bilden av bilens registreringsskylt och sedan bearbetas bilden genom flera antal algoritmer för att ge en alfanumerisk omvandling av bilden till ett textformat. ANPR-systemet används på många ställen som bensinpumpar, köpcentra, flygplatser, motorvägar, vägtullar, hotell, sjukhus, parkeringsplatser, försvar och militära kontrollpunkter etc.
Det finns många bildbehandlingsverktyg tillgängliga för den här registreringsplåten, men här i denna handledning använder vi MATLAB Image Processing för att få fordonets registreringsnummer i textformatet. Om du är ny med MATLAB eller bildbehandling, kolla in våra tidigare MATLAB-projekt:
- Komma igång med MATLAB: En snabb introduktion
- Komma igång med bildbehandling med MATLAB
Låt mig först informera dig om konceptet vi använder för att upptäcka nummerskyltar. Det finns tre program eller '.m'-filer för detta projekt.
- Template Creation ( template_creation.m ) - Detta används för att anropa de sparade bilderna i alfanumerik och sedan spara dem som en ny mall i MATLAB-minnet.
- Letter Detection ( Letter_detection.m ) - Läser tecknen från inmatningsbilden och hittar motsvarande alfanumeriska motsvarande.
- Plate Detection ( Plate_detection.m ) - Bearbeta bilden och ring sedan ovanstående två m-filer för att upptäcka numret.
Nu lär vi oss hur man kodar dessa m-filer och vad du måste göra innan du börjar koda. Efter att ha gått igenom denna handledning kan du hitta alla kodfiler och arbetsförklaringsvideo i slutet av detta projekt.
Mallskapande
Skapa först en mapp för projektet (mitt mappnamn är detektering av nummerskylt ) för att spara och lagra filerna. Vi har lagrat de binära bilderna av alla alfabet och siffror i undermappen som heter ' alfa' .
Öppna nu Editor-fönstret i MATLAB, som visas i bilden nedan,
Om du inte känner till MATLAB: s grundläggande terminologi föreslår jag att du kontrollerar den länkade handledningen.
Nu, kopiera och klistra in koden nedan i template_creation.m- filen och spara filen i projektmappen ( Nummerplåtsdetektering ). Alla filer relaterade till detta projekt inklusive bildmallfiler kan laddas ner härifrån. Också kontrollera videon ges i slutet av detta 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'); % Naturliga nummer ett = imread ('alpha / 1.bmp'); två = imread ('alpha / 2.bmp'); tre = imread ('alpha / 3.bmp'); four = imread ('alpha / 4.bmp'); fem = imread ('alpha / 5.bmp'); sex = imread ('alpha / 6.bmp'); sju = imread ('alpha / 7.bmp'); åtta = imread ('alpha / 8.bmp'); nio = imread ('alpha / 9.bmp'); zero = imread ('alpha / 0.bmp'); % Skapa matris för bokstäver i bokstäver =; % Skapa matris för nummer nummer =; NewTemplates =; spara ('NewTemplates', 'NewTemplates') rensa alla
Här i ovanstående kod sparar vi bilderna i en variabel med kommandot ' imread () '. Denna funktion används för att anropa bilderna från mappen eller från vilken plats som helst på datorn till MATLAB. Låt oss ta ett exempel från ovanstående kod:
A = imread ('alfa / A.bmp');
Där A är variabeln och i ' alpha / A.bmp' är 'alpha' mappnamnet och ' A.bmp' är filnamnet.
Skapa sedan en matris med " bokstav " och " nummer " och spara den i variabeln " NewTemplates " med kommandot " save (filnamn, variabler)" .
% Skapa matris för alfabetbokstav =; % Skapa matris för nummer nummer =; NewTemplates =; spara ('NewTemplates', 'NewTemplates') rensa alla
Börja nu koda Letter_detection.m , i ett nytt redigeringsfönster.
Brevavkänning
Här skapar vi den andra kodfilen som heter Letter_detection.m . Nu, kopiera och klistra in koden nedan i den filen och spara filen i projektmappen med namnet Letter_detection. Den här filen kan hämtas härifrån, de bifogade zip-filerna innehåller även andra filer relaterade till detekteringsprojektet för nummerplattan.
funktionsbokstav = readLetter (snap) belastning NewTemplates snap = imresize (snap,); rec =; för n = 1: längd (NewTemplates) cor = corr2 (NewTemplates {1, n}, snap); rec =; slut ind = hitta (rec == max (rec)); display (hitta (rec == max (rec))); % Alfabetlistor. om ind == 1 - ind == 2 bokstäver = 'A'; elseif ind == 3 - ind == 4 letter = 'B'; elseif ind == 5 bokstäver = 'C' elseif ind == 6 - ind == 7 bokstäver = 'D'; elseif ind == 8 bokstäver = 'E'; elseif ind == 9 bokstäver = 'F'; elseif ind == 10 bokstäver = 'G'; elseif ind == 11 letter = 'H'; elseif ind == 12 bokstäver = 'I'; elseif ind == 13 letter = 'J'; elseif ind == 14 bokstäver = 'K'; elseif ind == 15 bokstäver = 'L'; elseif ind == 16 bokstäver = 'M'; elseif ind == 17 bokstäver = '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 bokstäver = 'S'; elseif ind == 27 bokstäver = 'T'; elseif ind == 28 bokstäver = 'U'; elseif ind == 29 bokstäver = 'V'; elseif ind == 30 bokstäver = 'W'; elseif ind == 31 bokstav = 'X'; elseif ind == 32 bokstav = 'Y'; elseif ind == 33 bokstäver = 'Z'; % * - * - * - * - * % Siffror listor. elseif ind == 34 letter = '1'; elseif ind == 35 bokstäver = '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'; annars bokstav = '0'; end end
Här har vi i ovanstående kod skapat en funktion med namnet bokstav som ger oss den alfanumeriska utgången för ingångsbilden från klass ' alfa ' med kommandot ' readLetter ()' . Och ladda sedan de sparade mallarna med hjälp av kommandolast 'NewTemplates .
Efter det har vi ändrat storleken på den inmatade bilden så att den kan jämföras med mallens bilder med kommandot 'imresize (filnamn, storlek)' . Sedan används för loop för att korrelera den inmatade bilden med varje bild i mallen för att få bästa matchning.
En matris ' rec ' skapas för att registrera korrelationsvärdet för varje alfanumerisk mall med teckenmallen från den inmatade bilden, som visas i nedanstående kod,
cor = corr2 (NewTemplates {1, n}, snap);
Sedan används 'find ()' - kommandot för att hitta det index som motsvarar det högst matchade tecknet. Enligt detta index skrivs motsvarande tecken ut med 'if-else' -uttrycket.
Efter att ha avslutat detta öppnar du ett nytt redigeringsfönster för att starta koden för huvudprogrammet.
Nummerplåtsdetektering
Här är den tredje och sista kodfilen med namnet Plate_detection.m kopiera och klistra in koden nedan i den här filen och spara i projektmappen. För snabbstart kan du hämta alla kodfiler med bildmallar härifrån.
Stäng alla; Rensa alla; im = imread ('Number Plate Images / image1.png'); imgray = rgb2gray (im); imbin = imbinarize (imgray); im = edge (imgray, 'prewitt'); % Nedanstående steg är att hitta plats för nummerplåten Iprops = regionprops (im, 'BoundingBox', 'Area', 'Image'); area = Iprops.Area; antal = numel (Iprops); maxa = area; boundingBox = Iprops.BoundingBox; för i = 1: räkna om maxa
Grundkommandon som används i ovanstående kod nämns nedan:
imread () - Det här kommandot används för att öppna bilden i MATLAB från målmappen.
rgb2gray () –Detta kommando används för att konvertera RGB-bilden till gråskalaformat.
imbinarize () - Detta kommando används för att Binarize 2-D gråskalebild eller helt enkelt kan vi säga att det konverterar bilden till svartvitt format.
edge () - Detta kommando används för att upptäcka kanterna i bilden med olika metoder som Roberts, Sobel, Prewitt och många andra.
regionprops () - Detta kommando används för att mäta egenskaper för bildregion.
numel () - Detta kommando används för att beräkna antalet arrayelement.
imcrop () - Detta kommando används för att beskära bilden i den angivna storleken.
bwareaopen () - Detta kommando används för att ta bort små objekt från binär bild.
Genom att använda kommandona ovan i koden ringer vi inmatningsbilden och konverterar den till gråskala. Därefter omvandlas gråskalan till den binära bilden och kanten på de binära bilderna detekteras med Prewitt-metoden.
Därefter används koden nedan för att detektera nummerplåten i hela inmatningsbilden, Iprops = regionprops (im, 'BoundingBox', 'Area', 'Image'); area = Iprops.Area; antal = numel (Iprops); maxa = area; boundingBox = Iprops.BoundingBox; för i = 1: räkna om maxa
Efter det beskär nummerskylten och ta bort de små objekten från den binära bilden med kommandot 'imcrop ()' respektive 'bwareaopen ()' .
Därefter används nedanstående kod för att bearbeta den beskurna registreringsskyltbilden och för att visa det detekterade numret i bild- och textformatet (i kommandofönstret).
Iprops = regionprops (im, 'BoundingBox', 'Area', 'Image'); antal = numel (Iprops); noPlate =; för i = 1: räkna ow = längd (Iprops (i).Bild (1,:)); oh = längd (Iprops (i).Bild (:, 1)); if ow <(h / 2) & oh> (h / 3) letter = Letter_detection (Iprops (i).Image); noPlate = änden änden
Arbetning av registreringsnummer för registreringsnummer för fordon med hjälp av MATLAB
I filen template_creation.m har vi utformat koden för att spara alla binära bilder av alfanumerik i en katalog eller fil som heter ' NewTemplates '. Då kallas den katalogen i Letter_detection.m som du kan se nedan
Sedan i Plate_detection.m kod filen Letter_detection.m kodfil anropas när vi behandlar bilden som visas i bilden nedan,
Klicka nu på "KÖR" -knappen för att köra.m-filen
MATLAB kan ta några sekunder att svara, vänta tills det visar upptaget meddelande i det nedre vänstra hörnet som visas nedan,
När programmet startar får du popup-skivan med nummerplattan och numret i kommandofönstret. Utdata för min bild kommer att se ut som bilden nedan;
Fullständig bearbetning av registreringsnummer för registreringsnummer för fordon visas i videon nedan, och alla kodfiler med bildmallar kan laddas ner härifrån.
Kontrollera också alla MATLAB-projekt här.