- Crearea șablonului
- Detectarea scrisorilor
- Detectarea plăcilor numerice
- Funcționarea sistemului de detectare a numărului de înmatriculare a vehiculului utilizând MATLAB
V-ați întrebat vreodată cum funcționează un sistem ANPR (Automatic Number Plate Recognition)? Permiteți-mi să vă spun conceptul din spatele acestuia, camera sistemului ANPR captează imaginea plăcuței de înmatriculare a vehiculului și apoi imaginea este procesată prin mai mulți algoritmi pentru a furniza o conversie alfanumerică a imaginii într-un format text. Sistemul ANPR este utilizat în multe locuri, cum ar fi pompe de benzină, centre comerciale, aeroporturi, autostrăzi, cabine de taxare, hoteluri, spitale, parcări, puncte de verificare pentru apărare și militare etc.
Există multe instrumente de procesare a imaginilor disponibile pentru această detectare a plăcuței de înmatriculare, dar aici, în acest tutorial, vom folosi MATLAB Image Processing pentru a obține numărul plăcuței de înmatriculare a vehiculului în format text. Dacă sunteți nou cu MATLAB sau cu procesarea imaginilor, verificați proiectele noastre anterioare MATLAB:
- Noțiuni introductive despre MATLAB: o introducere rapidă
- Noțiuni introductive despre procesarea imaginilor folosind MATLAB
Mai întâi, permiteți-mi să vă informez despre conceptul pe care îl folosim pentru detectarea plăcuțelor de înmatriculare. Există trei programe sau fișiere „.m” pentru acest proiect.
- Creare șablon ( template_creation.m ) - Aceasta este utilizată pentru a apela imaginile alfanumerice salvate și apoi pentru a le salva ca un șablon nou în memoria MATLAB.
- Detectarea literelor ( Letter_detection.m ) - Citește caracterele din imaginea de intrare și găsește alfanumeric corespunzător cel mai potrivit.
- Plate Detection ( Plate_detection.m ) - Procesați imaginea și apoi apelați cele două fișiere m de mai sus pentru a detecta numărul.
Acum, vom afla despre cum să codați aceste fișiere m și ce trebuie să faceți înainte de a începe codarea. După parcurgerea acestui tutorial, puteți găsi toate fișierele de coduri și explicațiile video de lucru la sfârșitul acestui proiect.
Crearea șablonului
Mai întâi creați un folder pentru proiect (numele folderului meu este Number Plate Detection ) pentru a salva și stoca fișierele. Am stocat imaginile binare ale tuturor alfabetelor și numerelor în sub-folderul denumit „ alfa” .
Acum, deschideți fereastra Editor în MATLAB, așa cum se arată în imaginea de mai jos,
Dacă nu sunteți familiarizați cu terminologia de bază a MATLAB vă sugerez să verificați tutorialul legat.
Acum, copiați și lipiți codul de mai jos în fișierul template_creation.m și salvați fișierul în folderul proiectului ( Detectarea plăcilor de număr ). Toate fișierele legate de acest proiect, inclusiv fișierele cu șabloane de imagine, pot fi descărcate de aici. De asemenea, verificați videoclipul oferit la sfârșitul acestui proiect.
% Alfabete A = imread ('alfa / A.bmp'); B = imread ('alfa / B.bmp'); C = imread ('alfa / C.bmp'); D = imead ('alfa / D.bmp'); E = imread ('alfa / E.bmp'); F = imread ('alfa / F.bmp'); G = imead ('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 = imead ('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 = imead ('alfa / V.bmp'); W = imread ('alfa / W.bmp'); X = imread ('alfa / X.bmp '); Y = imead ('alfa / Y.bmp'); Z = imread ('alfa / Z.bmp'); % Numere naturale one = imread ('alfa / 1.bmp'); two = imread ('alfa / 2.bmp'); three = imread ('alfa / 3.bmp'); patru = imread ('alfa / 4.bmp'); five = imread ('alfa / 5.bmp'); six = imread ('alfa / 6.bmp'); seven = imread ('alfa / 7.bmp'); opt = imread ('alfa / 8.bmp'); nouă = imread ('alfa / 9.bmp'); zero = imread ('alfa / 0.bmp'); % Crearea matricei pentru alfabet litera =; % Crearea matricei pentru numerele număr =; NewTemplates =; save ('NewTemplates', 'NewTemplates') șterge totul
Aici, în codul de mai sus salvăm imaginile într-o variabilă utilizând comanda ' imread () '. Această funcție este utilizată pentru a apela imaginile din folder sau din orice locație a computerului în MATLAB. Să luăm un exemplu din codul de mai sus:
A = imread ('alfa / A.bmp');
Unde A este variabila, iar în „ alfa / A.bmp” , „alfa” este numele folderului și „ A.bmp” este numele fișierului.
Apoi creați o matrice de „ literă ” și „ număr ” și salvați-o în variabila „ NewTemplates ” utilizând comanda „ save (nume de fișier, variabile)” .
% Crearea matricei pentru alfabet litera =; % Crearea matricei pentru numerele număr =; NewTemplates =; save ('NewTemplates', 'NewTemplates') șterge totul
Acum începeți să codificați Letter_detection.m , într-o nouă fereastră de editor.
Detectarea scrisorilor
Aici creăm al doilea fișier de cod numit Letter_detection.m . Acum, copiați și lipiți codul de mai jos în acel fișier și salvați fișierul în folderul proiectului cu numele Letter_detection. Acest fișier poate fi descărcat de aici, fișierele zip atașate conțin și alte fișiere legate de acest proiect de detectare a plăcuței de înmatriculare.
function letter = readLetter (snap) load NewTemplates snap = imresize (snap,); rec =; pentru n = 1: lungime (NewTemplates) cor = corr2 (NewTemplates {1, n}, snap); rec =; end ind = find (rec == max (rec)); display (find (rec == max (rec))); % Alfabete listări. if ind == 1 - ind == 2 letter = 'A'; elseif ind == 3 - ind == 4 litere = 'B'; elseif ind == 5 litere = 'C' elseif ind == 6 - ind == 7 litere = 'D'; elseif ind == 8 litere = 'E'; elseif ind == 9 litere = 'F'; elseif ind == 10 litere = 'G'; elseif ind == 11 litere = 'H'; elseif ind == 12 litere = 'Eu'; elseif ind == 13 litere = 'J'; elseif ind == 14 litere = 'K'; elseif ind == 15 litere = 'L'; elseif ind == 16 litere = 'M'; elseif ind == 17 litere = 'N'; elseif ind == 18 - ind == 19 litere = 'O'; elseif ind == 20 - ind == 21 litere = 'P'; elseif ind == 22 - ind == 23 letter = 'Q'; elseif ind == 24 - ind == 25 litere = 'R'; elseif ind == 26 litere = 'S'; elseif ind == 27 litere = 'T'; elseif ind == 28 litere = 'U'; elseif ind == 29 letter = 'V'; elseif ind == 30 letter = 'W'; elseif ind == 31 litere = 'X'; elseif ind == 32 litera = 'Y'; elseif ind == 33 litere = 'Z'; % * - * - * - * - * % Numerale listări. elseif ind == 34 litere = '1'; elseif ind == 35 litere = '2'; elseif ind == 36 litere = '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 litere = '7'; elseif ind == 44 - ind == 45 litere = '8'; elseif ind == 46 - ind == 47 - ind == 48 letter = '9'; else letter = '0'; sfârșit sfârșit
Aici, în codul de mai sus am creat o funcție numită literă care ne oferă ieșirea alfanumerică a imaginii de intrare din clasa „ alfa ” utilizând comanda „ readLetter ()” . Și apoi încărcați șabloanele salvate utilizând comanda de încărcare „NewTemplates .
După aceea, am redimensionat imaginea de intrare, astfel încât să poată fi comparată cu imaginile șablonului folosind comanda „imresize (nume de fișier, dimensiune)” . Apoi pentru buclă se folosește pentru a corela imaginea de intrare cu fiecare imagine din șablon pentru a obține cea mai bună potrivire.
Se creează o matrice „ rec ” pentru a înregistra valoarea corelației pentru fiecare șablon alfanumeric cu șablonul de caractere din imaginea de intrare, așa cum se arată în codul de mai jos,
cor = corr2 (NewTemplates {1, n}, snap);
Apoi comanda 'find ()' este utilizată pentru a găsi indexul care corespunde celui mai mare caracter potrivit. Apoi, conform acelui index, caracterul corespunzător este tipărit folosind instrucțiunea „if-else” .
Acum, după ce ați terminat cu aceasta, deschideți o nouă fereastră de editor pentru a porni codul pentru programul principal.
Detectarea plăcilor numerice
Iată al treilea și ultimul fișier de cod numit Plate_detection.m copiați și lipiți codul de mai jos în acest fișier și salvați-l în folderul proiectului. Pentru o pornire rapidă puteți descărca de aici toate fișierele de cod cu șabloane de imagine.
inchide tot; curata tot; im = imread ('Imagini ale numerelor / imagine1.png'); imgray = rgb2gray (im); imbin = imbinarize (imgray); im = edge (imgray, 'prewitt'); % Pașii de mai jos sunt pentru a găsi locația plăcuței de înmatriculare Iprops = regionprops (im, 'BoundingBox', 'Area', 'Image'); area = Iprops.Area; count = numel (Iprops); maxa = zona; boundingBox = Iprops.BoundingBox; pentru i = 1: numărați dacă maxa
Comenzile de bază utilizate în codul de mai sus sunt menționate mai jos:
imread () - Această comandă este utilizată pentru a deschide imaginea în MATLAB din folderul țintă.
rgb2gray () - Această comandă este utilizată pentru a converti imaginea RGB în format de tonuri de gri.
imbinarize () - Această comandă este utilizată pentru a binariza imaginea 2-D în tonuri de gri sau pur și simplu putem spune că convertește imaginea în format alb-negru.
edge () - Această comandă este utilizată pentru a detecta marginile din imagine, utilizând diverse metode precum Roberts, Sobel, Prewitt și multe altele.
regionprops () - Această comandă este utilizată pentru a măsura proprietățile regiunii imaginii.
numel () - Această comandă este utilizată pentru a calcula numărul de elemente matrice.
imcrop () - Această comandă este utilizată pentru a decupa imaginea în dimensiunea introdusă.
bwareaopen () - Această comandă este utilizată pentru a elimina obiecte mici din imaginea binară.
Folosind comenzile de mai sus în cod, apelăm imaginea de intrare și o convertim în tonuri de gri. Apoi, scala de gri este convertită în imaginea binară, iar marginea imaginilor binare este detectată prin metoda Prewitt.
Apoi, codul de mai jos este folosit pentru a detecta locația plăcuței de înmatriculare în întreaga imagine de intrare, Iprops = regionprops (im, 'BoundingBox', 'Area', 'Image'); area = Iprops.Area; count = numel (Iprops); maxa = zona; boundingBox = Iprops.BoundingBox; pentru i = 1: numărați dacă maxa
După aceea decupați numărul de înmatriculare și scoateți obiectele mici din imaginea binară folosind comanda 'imcrop ()' și respectiv 'bwareaopen ()' .
Apoi, codul de mai jos este utilizat pentru a procesa acea imagine de înmatriculare decupată și pentru a afișa numărul detectat în formatul de imagine și text (în fereastra de comandă).
Iprops = regionprops (im, 'BoundingBox', 'Area', 'Image'); count = numel (Iprops); noPlate =; pentru i = 1: count ow = length (Iprops (i). Imagine (1,:)); oh = lungime (Iprops (i). Imagine (:, 1)); if ow <(h / 2) & oh> (h / 3) letter = Letter_detection (Iprops (i).Image); noPlate = sfârșitul finalului
Funcționarea sistemului de detectare a numărului de înmatriculare a vehiculului utilizând MATLAB
În fișierul template_creation.m avem proiectat codul pentru a salva toate imaginile binare ale alfanumericelor într-un director sau fișier denumit „ NewTemplates ”. Apoi, acel director este apelat în Letter_detection.m așa cum puteți vedea în cele de mai jos
Apoi, în fișierul de cod Plate_detection.m, fișierul de cod Letter_detection.m este apelat atunci când procesăm imaginea așa cum se arată în imaginea de mai jos,
Acum, faceți clic pe butonul „RUN” pentru a rula fișierul.m
MATLAB poate dura câteva secunde pentru a răspunde, așteptați până când apare mesajul ocupat în colțul din stânga jos, așa cum se arată mai jos,
Pe măsură ce începe programul, veți obține fereastra pop-up a numărului de înmatriculare și numărul din fereastra de comandă. Ieșirea pentru imaginea mea va arăta ca imaginea dată mai jos;
Funcționarea completă a sistemului de detectare a plăcuțelor de înmatriculare a vehiculului este demonstrată în videoclipul de mai jos, iar toate fișierele de coduri cu șabloane de imagine pot fi descărcate de aici.
De asemenea, verificați aici toate proiectele MATLAB.