- Creació de plantilles
- Detecció de cartes
- Detecció de plaques numèriques
- Funcionament del sistema de detecció de números de matrícula de vehicles mitjançant MATLAB
Us heu preguntat mai com funciona un sistema ANPR (reconeixement automàtic de matrícules)? Permeteu-me que us expliqui el concepte que hi ha darrere, la càmera del sistema ANPR capta la imatge de la matrícula del vehicle i, a continuació, la imatge es processa mitjançant diversos algorismes per proporcionar una conversió alfanumèrica de la imatge en format de text. El sistema ANPR s’utilitza en molts llocs com bombes de gasolina, centres comercials, aeroports, autopistes, cabines de peatge, hotels, hospitals, aparcaments, punts de control de defensa i militars, etc.
Hi ha moltes eines de processament d’imatges disponibles per a la detecció de la matrícula, però en aquest tutorial utilitzarem MATLAB Image Processing per obtenir el número de la matrícula del vehicle en format de text. Si sou nou amb MATLAB o amb el processament d’imatges, consulteu els nostres projectes anteriors de MATLAB:
- Introducció a MATLAB: una introducció ràpida
- Introducció al processament d’imatges mitjançant MATLAB
En primer lloc, permeteu-me informar-vos sobre el concepte que estem utilitzant per detectar les matrícules. Hi ha tres programes o fitxers ".m" per a aquest projecte.
- Creació de plantilles ( template_creation.m ): s’utilitza per trucar a les imatges alfanumèriques desades i desar-les com a plantilla nova a la memòria MATLAB.
- Detecció de lletres ( Letter_detection.m ): llegeix els caràcters de la imatge d'entrada i troba l'alfanumèric corresponent més adequat.
- Detecció de plaques ( Plate_detection.m ): processeu la imatge i truqueu els dos fitxers m anteriors per detectar el número.
Ara, aprendrem sobre com codificar aquests fitxers m i què heu de fer abans de començar a codificar. Després d’haver passat aquest tutorial, podeu trobar tots els fitxers de codi i el vídeo explicatiu de treball al final d’aquest projecte.
Creació de plantilles
Primer, creeu una carpeta per al projecte (el meu nom de carpeta és Number Plate Detection ) per desar i emmagatzemar els fitxers. Hem emmagatzemat les imatges binàries de tots els alfabets i números a la subcarpeta anomenada " alfa" .
Ara, obriu la finestra de l’Editor al MATLAB, tal com es mostra a la imatge següent,

Si no esteu familiaritzat amb la terminologia bàsica de MATLAB, us suggerim que consulteu el tutorial enllaçat.
Ara, copieu i enganxeu el codi següent al fitxer template_creation.m i deseu-lo a la carpeta del projecte ( Detecció de la placa numèrica ). Tots els fitxers relacionats amb aquest projecte, inclosos els fitxers de plantilles d’imatges, es poden descarregar des d’aquí. Consulteu també el vídeo que es dóna al final d’aquest projecte.
% Alfabets A = imread ('alfa / A.bmp'); B = imread ('alfa / B.bmp'); C = imread ('alfa / C.bmp'); D = imread ('alfa / D.bmp'); E = imread ('alfa / E.bmp'); F = imread ('alfa / F.bmp'); G = imread ('alfa / G.bmp'); H = imread ('alfa / H.bmp'); I = imread ('alfa / I.bmp'); J = imread ('alfa / J.bmp'); K = imread ('alfa / K.bmp'); L = imread ('alfa / L.bmp'); M = imread ('alfa / M.bmp'); N = imread ('alfa / N.bmp'); O = imread ('alfa / O.bmp'); P = imread ('alfa / P.bmp'); Q = imread ('alfa / Q.bmp'); R = imread ('alfa / R.bmp'); S = imread ('alfa / S.bmp'); T = imread ('alfa / T.bmp'); U = imread ('alfa / U.bmp'); V = imread ('alfa / V.bmp'); W = imread ('alfa / W.bmp'); X = imread ('alfa / X.bmp '); Y = imread ('alfa / Y.bmp'); Z = imread ('alfa / Z.bmp'); % De nombres naturals one = imread ('alfa / 1.bmp'); dos = imread ('alfa / 2.bmp'); three = imread ('alfa / 3.bmp'); quatre = imread ('alfa / 4.bmp'); cinc = imread ('alfa / 5.bmp'); sis = imread ('alfa / 6.bmp'); seven = imread ('alpha / 7.bmp'); vuit = imread ('alpha / 8.bmp'); nou = imread ('alfa / 9.bmp'); zero = imread ('alfa / 0.bmp'); % Creació d'una matriu per als alfabets letter =; % Creació d'una matriu per als números number =; Plantilles noves =; save ('NewTemplates', 'NewTemplates') neteja-ho tot

Aquí, al codi anterior, estem desant les imatges en una variable mitjançant l'ordre ' imread () '. Aquesta funció s'utilitza per cridar les imatges de la carpeta o des de qualsevol ubicació del PC al MATLAB. Prenem un exemple del codi anterior:
A = imread ('alfa / A.bmp');
On A és la variable i a " alpha / A.bmp" , "alpha" és el nom de la carpeta i " A.bmp" és el nom del fitxer.
A continuació, creeu una matriu de " lletra " i " número " i deseu-la a la variable " NewTemplates " mitjançant l'ordre " save (nom de fitxer, variables)" .
% Creació de matriu per als alfabets letter =; % Creació d'una matriu per als números number =; Plantilles noves =; save ('NewTemplates', 'NewTemplates') neteja-ho tot
Ara comenceu a codificar Letter_detection.m , en una nova finestra d’editor.
Detecció de cartes
Aquí estem creant el segon fitxer de codi anomenat Letter_detection.m . Ara, copieu i enganxeu el codi següent en aquest fitxer i deseu-lo a la carpeta del projecte amb el nom Letter_detection. Aquest fitxer es pot descarregar des d’aquí, els fitxers zip adjunts també contenen altres fitxers relacionats amb aquest projecte de detecció de matrícules.
function letter = readLetter (snap) load NewTemplates snap = imresize (snap,); rec =; per a n = 1: length (NewTemplates) cor = corr2 (NewTemplates {1, n}, snap); rec =; end ind = find (rec == max (rec)); display (find (rec == max (rec))); % Llistats d'alfabets. si ind == 1 - ind == 2 lletra = 'A'; elseif ind == 3 - ind == 4 lletra = 'B'; elseif ind == 5 lletra = 'C' elseif ind == 6 - ind == 7 lletra = 'D'; elseif ind == 8 lletra = 'E'; elseif ind == 9 lletra = 'F'; elseif ind == 10 lletra = 'G'; elseif ind == 11 lletra = 'H'; elseif ind == 12 lletres = 'Jo'; elseif ind == 13 lletra = 'J'; elseif ind == 14 lletra = 'K'; elseif ind == 15 lletra = 'L'; elseif ind == 16 lletra = 'M'; elseif ind == 17 lletra = 'N'; elseif ind == 18 - ind == 19 lletra = 'O'; elseif ind == 20 - ind == 21 letter = 'P'; elseif ind == 22 - ind == 23 letter = 'Q'; elseif ind == 24 - ind == 25 lletra = 'R'; elseif ind == 26 lletra = 'S'; elseif ind == 27 lletra = 'T'; elseif ind == 28 lletra = 'U'; elseif ind == 29 letter = 'V'; elseif ind == 30 lletra = 'W'; elseif ind == 31 lletra = 'X'; elseif ind == 32 lletra = 'Y'; elseif ind == 33 letter = 'Z'; % * - * - * - * - * % Números llistats. elseif ind == 34 lletra = '1'; elseif ind == 35 lletra = '2'; elseif ind == 36 lletra = '3'; elseif ind == 37 - ind == 38 letter = '4'; elseif ind == 39 lletra = '5'; elseif ind == 40 - ind == 41 - ind == 42 lletra = '6'; elseif ind == 43 lletra = '7'; elseif ind == 44 - ind == 45 lletra = '8'; elseif ind == 46 - ind == 47 - ind == 48 letter = '9'; else letter = '0'; fi final

Aquí, al codi anterior, hem creat una funció anomenada lletra que ens proporciona la sortida alfanumèrica de la imatge d'entrada de la classe ' alpha ' mitjançant l'ordre ' readLetter ()' . I, a continuació, carregueu les plantilles desades mitjançant l'ordre load 'NewTemplates .
Després d'això, hem canviat la mida de la imatge d'entrada perquè es pugui comparar amb les imatges de la plantilla mitjançant l'ordre 'imresize (nom del fitxer, mida)' . A continuació, s'utilitza for loop per correlacionar la imatge d'entrada amb totes les imatges de la plantilla per obtenir la millor coincidència.
Es crea una matriu " rec " per registrar el valor de correlació de cada plantilla alfanumèrica amb la plantilla de caràcters de la imatge d'entrada, tal com es mostra al codi següent,
cor = corr2 (NewTemplates {1, n}, snap);
A continuació, s'utilitza l'ordre 'find ()' per trobar l'índex que correspon al caràcter més alt. Després, segons aquest índex, el caràcter corresponent s'imprimeix mitjançant la sentència "if-else" .
Ara, després de completar amb això, obriu una nova finestra d’editor per iniciar el codi del programa principal.
Detecció de plaques numèriques
Aquí teniu el tercer i últim fitxer de codi anomenat Plate_detection.m. Copieu i enganxeu el codi següent en aquest fitxer i deseu-lo a la carpeta del projecte. Per començar ràpidament, podeu descarregar tots els fitxers de codi amb plantilles d’imatges des d’aquí.
tancar-ho tot; netejar-ho tot; im = imread ('Imatges de la placa numèrica / image1.png'); imgray = rgb2gray (im); imbin = imbinarize (imgray); im = edge (imgray, 'prewitt'); % A continuació es detallen els passos per trobar la ubicació de la placa de matrícula Iprops = regionprops (im, 'BoundingBox', 'Area', 'Image'); area = Iprops.Area; count = numel (Iprops); maxa = àrea; boundingBox = Iprops.BoundingBox; per a i = 1: compta si maxa

A continuació s’esmenten les ordres bàsiques utilitzades al codi anterior:
imread (): aquesta ordre s'utilitza per obrir la imatge al MATLAB des de la carpeta de destinació.
rgb2gray (): aquesta ordre s'utilitza per convertir la imatge RGB en format d'escala de grisos.
imbinarize (): aquesta ordre s'utilitza per binaritzar la imatge en escala de grisos 2-D o simplement podem dir que converteix la imatge en format blanc i negre.
edge (): aquesta ordre s'utilitza per detectar les vores de la imatge mitjançant diversos mètodes com Roberts, Sobel, Prewitt i molts altres.
regionprops (): aquesta ordre s'utilitza per mesurar les propietats de la regió de la imatge.
numel (): aquesta ordre s'utilitza per calcular el nombre d'elements de matriu.
imcrop (): aquesta ordre s'utilitza per retallar la imatge en la mida introduïda.
bwareaopen (): aquesta ordre s'utilitza per eliminar objectes petits de la imatge binària.
En utilitzar les ordres anteriors al codi, trucarem a la imatge d’entrada i la convertirem a escala de grisos. A continuació, l’escala de grisos es converteix en una imatge binària i la vora de les imatges binàries es detecta mitjançant el mètode Prewitt.
A continuació, s’utilitza el codi següent per detectar la ubicació de la matrícula a tota la imatge d’entrada, Iprops = regionprops (im, 'BoundingBox', 'Area', 'Image'); area = Iprops.Area; count = numel (Iprops); maxa = àrea; boundingBox = Iprops.BoundingBox; per a i = 1: compta si maxa
Després d'això, retalleu la matrícula i traieu els petits objectes de la imatge binària mitjançant l'ordre 'imcrop ()' i 'bwareaopen ()' respectivament.
A continuació, s’utilitza el codi següent per processar la imatge retallada de la matrícula i per mostrar el número detectat en format imatge i text (a la finestra d’ordres).
Iprops = regionprops (im, 'BoundingBox', 'Area', 'Image'); count = numel (Iprops); noPlate =; per a i = 1: compta ow = length (Iprops (i). Imatge (1,:)); oh = longitud (Iprops (i). Imatge (:, 1)); if ow <(h / 2) & oh> (h / 3) letter = Letter_detection (Iprops (i). Image); noPlate = extrem final
Funcionament del sistema de detecció de números de matrícula de vehicles mitjançant MATLAB
Al fitxer template_creation.m hem dissenyat el codi per desar totes les imatges binàries d'alfanumèrics en un directori o fitxer anomenat " NewTemplates ". A continuació, es diu aquest directori a Letter_detection.m com podeu veure a continuació

Després, en el Plate_detection.m arxiu de codi de l' Letter_detection.m arxiu de codi es diu quan es processa la imatge com es mostra a la imatge de sota,

Ara, feu clic al botó "RUN" per executar el fitxer.m

MATLAB pot trigar uns quants segons a respondre, espereu fins que aparegui el missatge ocupat a l'extrem inferior esquerre, tal com es mostra a continuació.

Quan s'iniciï el programa, obtindreu la finestra emergent de la imatge i el número a la finestra d'ordres. La sortida de la meva imatge serà semblant a la que es mostra a continuació;

El vídeo següent mostra el funcionament complet del sistema de detecció de matrícules de matrícula del vehicle i es poden descarregar tots els fitxers de codi amb plantilles d’imatges.
A més, consulteu aquí tots els projectes de MATLAB.
