- Sjabloon maken
- Letter detectie
- Kentekenplaat detectie
- Werking van kentekenplaatnummerdetectiesysteem met behulp van MATLAB
Heeft u zich ooit afgevraagd hoe een ANPR-systeem (Automatic Number Plate Recognition) werkt? Laat me je het concept erachter vertellen, de camera van het ANPR-systeem legt een beeld van de kentekenplaat van het voertuig vast en vervolgens wordt het beeld verwerkt door middel van meerdere algoritmen om een alfanumerieke conversie van het beeld naar een tekstformaat te bieden. ANPR-systeem wordt op veel plaatsen gebruikt, zoals benzinepompen, winkelcentra, luchthavens, snelwegen, tolhuisjes, hotels, ziekenhuizen, parkeerterreinen, defensie- en militaire controlepunten enz.
Er zijn veel beeldverwerkingstools beschikbaar voor deze kentekenplaatdetectie, maar hier in deze tutorial zullen we MATLAB-beeldverwerking gebruiken om het kenteken van het voertuig in tekstformaat te krijgen. Als je nieuw bent met MATLAB of beeldverwerking, bekijk dan onze eerdere MATLAB-projecten:
- Aan de slag met MATLAB: een korte introductie
- Aan de slag met beeldverwerking met MATLAB
Laat me u eerst kort informeren over het concept dat we gebruiken voor het detecteren van kentekenplaten. Er zijn drie programma's of '.m'-bestanden voor dit project.
- Template Creation ( template_creation.m ) - Dit wordt gebruikt om de opgeslagen afbeeldingen van alfanumerieke tekens op te roepen en ze vervolgens op te slaan als een nieuwe sjabloon in het MATLAB-geheugen.
- Letter Detection ( Letter_detection.m ) - Leest de tekens uit de invoerafbeelding en vindt de hoogst overeenkomende corresponderende alfanumeriek.
- Plate Detection ( Plate_detection.m ) - Verwerk de afbeelding en roep vervolgens de bovenstaande twee m-bestanden op om het nummer te detecteren.
Nu zullen we leren hoe u deze m-bestanden codeert en wat u moet doen voordat u begint met coderen. Nadat je deze tutorial hebt doorlopen, kun je aan het einde van dit project alle codebestanden en uitlegvideo vinden.
Sjabloon maken
Maak eerst een map voor het project (mijn mapnaam is Nummerplaatdetectie ) om de bestanden op te slaan en op te slaan. We hebben de binaire afbeeldingen van alle alfabetten en cijfers opgeslagen in de submap met de naam ' alpha' .
Open nu het Editor-venster in de MATLAB, zoals weergegeven in de onderstaande afbeelding,
Als u niet bekend bent met de basisterminologie van MATLAB, raad ik u aan de gekoppelde tutorial te raadplegen.
Kopieer en plak nu de onderstaande code in het template_creation.m- bestand en sla het bestand op in de projectmap ( Number Plate Detection ). Alle bestanden met betrekking tot dit project, inclusief afbeeldingssjablonen, kunnen vanaf hier worden gedownload. Bekijk ook de video die aan het einde van dit project wordt gegeven.
% Alfabetten 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'); % Natuurlijke nummers één = imread ('alpha / 1.bmp'); twee = imread ('alpha / 2.bmp'); drie = imread ('alpha / 3.bmp'); vier = imread ('alpha / 4.bmp'); five = imread ('alpha / 5.bmp'); six = imread ('alpha / 6.bmp'); zeven = imread ('alpha / 7.bmp'); acht = imread ('alpha / 8.bmp'); negen = imread ('alpha / 9.bmp'); zero = imread ('alpha / 0.bmp'); % Creëren van een array voor alfabetten letter =; % Maken van een matrix voor getallen number =; NewTemplates =; save ('NewTemplates', 'NewTemplates') alles wissen
Hier slaan we in de bovenstaande code de afbeeldingen op in een variabele met behulp van het commando ' imread () '. Deze functie wordt gebruikt om de afbeeldingen uit de map of vanaf een willekeurige locatie op de pc in de MATLAB op te roepen. Laten we een voorbeeld nemen uit de bovenstaande code:
A = imread ('alpha / A.bmp');
Waar A de variabele is, en in ' alpha / A.bmp' , 'alpha' de mapnaam en ' A.bmp' de bestandsnaam.
Maak vervolgens een matrix van ' letter ' en ' nummer ' en sla deze op in variabele ' NewTemplates ' met de opdracht ' save (bestandsnaam, variabelen)' .
% Creëren van een array voor alfabetten letter =; % Maken van een matrix voor getallen number =; NewTemplates =; save ('NewTemplates', 'NewTemplates') alles wissen
Begin nu met het coderen van Letter_detection.m , in een nieuw editorvenster.
Letter detectie
Hier maken we het tweede codebestand met de naam Letter_detection.m . Kopieer en plak nu de onderstaande code in dat bestand en sla het bestand op in de projectmap met de naam Letter_detection. Dit bestand kan vanaf hier worden gedownload, deze bijgevoegde zip-bestanden bevatten ook andere bestanden die verband houden met dit project voor kentekenplaatdetectie.
functie letter = readLetter (snap) laad NewTemplates snap = imresize (snap,); rec =; voor n = 1: lengte (NewTemplates) cor = corr2 (NewTemplates {1, n}, snap); rec =; end ind = find (rec == max (rec)); display (find (rec == max (rec))); % Alfabetten vermeldingen. if ind == 1 - ind == 2 letter = 'A'; elseif ind == 3 - ind == 4 letter = 'B'; elseif ind == 5 letter = 'C' elseif ind == 6 - ind == 7 letter = 'D'; elseif ind == 8 letter = 'E'; elseif ind == 9 letter = 'F'; elseif ind == 10 letter = 'G'; elseif ind == 11 letter = 'H'; elseif ind == 12 letter = 'I'; elseif ind == 13 letter = 'J'; elseif ind == 14 letter = 'K'; elseif ind == 15 letter = '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 letter = 'T'; elseif ind == 28 letter = 'U'; elseif ind == 29 letter = 'V'; elseif ind == 30 letter = 'W'; elseif ind == 31 letter = 'X'; elseif ind == 32 letter = 'Y'; elseif ind == 33 letter = 'Z'; % * - * - * - * - * % cijfers aanbiedingen. 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'; anders letter = '0'; einde einde
Hier hebben we in de bovenstaande code een functie gemaakt met de naam letter die ons de alfanumerieke uitvoer geeft van de invoerafbeelding van klasse ' alpha ' door het commando ' readLetter ()' te gebruiken . En laad vervolgens de opgeslagen sjablonen met behulp van de opdracht 'NewTemplates .
Daarna hebben we het formaat van de invoerafbeelding aangepast zodat deze kan worden vergeleken met de afbeeldingen van de sjabloon door het commando 'imresize (bestandsnaam, grootte)' te gebruiken . Vervolgens wordt de for- lus gebruikt om de invoerafbeelding te correleren met elke afbeelding in de sjabloon om de beste overeenkomst te krijgen.
Er wordt een matrix ' rec ' gemaakt om de correlatiewaarde voor elke alfanumerieke sjabloon vast te leggen met de tekensjabloon uit de invoerafbeelding, zoals weergegeven in de onderstaande code,
cor = corr2 (NewTemplates {1, n}, snap);
Vervolgens wordt het 'find ()' commando gebruikt om de index te vinden die overeenkomt met het hoogst overeenkomende karakter. Vervolgens wordt volgens die index het corresponderende teken afgedrukt met de 'if-else'- instructie.
Nu, na het voltooien hiervan, opent u een nieuw editorvenster om de code voor het hoofdprogramma te starten.
Kentekenplaat detectie
Hier is het derde en laatste codebestand met de naam Plate_detection.m, kopieer en plak de onderstaande code in dit bestand en sla het op in de projectmap. Voor een snelle start kunt u hier alle codebestanden met afbeeldingsjablonen downloaden.
sluit alles; wis alles; im = imread ('Number Plate Images / image1.png'); imgray = rgb2gray (im); imbin = imbinariseren (onfris); im = edge (imgray, 'prewitt'); % Onderstaande stappen zijn om de locatie van de nummerplaat Iprops = regionprops (im, 'BoundingBox', 'Area', 'Image') te vinden; gebied = Iprops.Area; count = numel (Iprops); maxa = gebied; boundingBox = Iprops.BoundingBox; voor i = 1: tel als maxa
Basisopdrachten die in bovenstaande code worden gebruikt, worden hieronder vermeld:
imread () - Deze opdracht wordt gebruikt om de afbeelding in de MATLAB te openen vanuit de doelmap.
rgb2gray () - Deze opdracht wordt gebruikt om de RGB-afbeelding om te zetten in grijstinten.
imbinarize () - Deze opdracht wordt gebruikt om 2D-grijstintenbeelden te binariseren of we kunnen eenvoudig zeggen dat het de afbeelding omzet in zwart-witformaat.
edge () - Deze opdracht wordt gebruikt om de randen in de afbeelding te detecteren door verschillende methoden te gebruiken, zoals Roberts, Sobel, Prewitt en vele anderen.
regionprops () - Deze opdracht wordt gebruikt om de eigenschappen van het afbeeldingsgebied te meten.
numel () - Deze opdracht wordt gebruikt om het aantal array-elementen te berekenen.
imcrop () - Deze opdracht wordt gebruikt om de afbeelding bij te snijden tot de opgegeven grootte.
bwareaopen () - Deze opdracht wordt gebruikt om kleine objecten uit een binaire afbeelding te verwijderen.
Door de bovenstaande opdrachten in de code te gebruiken, roepen we de invoerafbeelding op en zetten deze om in grijswaarden. Vervolgens wordt de grijswaarden omgezet in de binaire afbeelding en wordt de rand van de binaire afbeeldingen gedetecteerd door de Prewitt-methode.
Vervolgens wordt de onderstaande code gebruikt om de locatie van de nummerplaat in het volledige invoerbeeld te detecteren, Iprops = regionprops (im, 'BoundingBox', 'Area', 'Image'); gebied = Iprops.Area; count = numel (Iprops); maxa = gebied; boundingBox = Iprops.BoundingBox; voor i = 1: tel als maxa
Daarna gewas de kentekenplaat en de binaire afbeelding te verwijderen kleine objecten met de opdracht 'imcrop ()' en "bwareaopen () resp.
Vervolgens wordt de onderstaande code gebruikt om die bijgesneden nummerplaatafbeelding te verwerken en om het gedetecteerde nummer weer te geven in de afbeelding en tekstindeling (in het opdrachtvenster).
Iprops = regionprops (im, 'BoundingBox', 'Area', 'Image'); count = numel (Iprops); noPlate =; voor i = 1: count ow = length (Iprops (i).Image (1,:)); oh = lengte (Iprops (i).Image (:, 1)); if ow <(h / 2) & oh> (h / 3) letter = Letter_detection (Iprops (i).Image); noPlate = einde einde
Werking van kentekenplaatnummerdetectiesysteem met behulp van MATLAB
In het template_creation.m- bestand hebben we de code ontworpen om alle binaire afbeeldingen van alfanumerieke tekens op te slaan in een map of bestand met de naam ' NewTemplates '. Vervolgens wordt die directory genoemd in de Letter_detection.m, zoals je hieronder kunt zien
Vervolgens wordt in het Plate_detection.m-codebestand het Letter_detection.m-codebestand aangeroepen wanneer we de afbeelding verwerken zoals weergegeven in de onderstaande afbeelding,
Klik nu op de knop 'RUN' om het.m-bestand uit te voeren
Het kan enkele seconden duren voordat MATLAB reageert, wacht tot het een bezet bericht in de linker benedenhoek toont, zoals hieronder getoond,
Bij het starten van het programma krijgt u de afbeelding van de kentekenplaat en het nummer in het opdrachtvenster. De uitvoer voor mijn afbeelding ziet eruit als de onderstaande afbeelding;
De volledige werking van het kentekenplaatdetectiesysteem voor voertuigen wordt gedemonstreerd in de onderstaande video, en alle codebestanden met afbeeldingssjablonen kunnen vanaf hier worden gedownload.
Bekijk hier ook alle MATLAB-projecten.