- Creazione di modelli
- Rilevamento delle lettere
- Rilevamento della targa
- Funzionamento del sistema di rilevamento del numero di targa del veicolo utilizzando MATLAB
Ti sei mai chiesto come funziona un sistema ANPR (Automatic Number Plate Recognition)? Lascia che ti dica il concetto alla base, la telecamera del sistema ANPR cattura l'immagine della targa del veicolo e quindi l'immagine viene elaborata attraverso più algoritmi per fornire una conversione alfanumerica dell'immagine in un formato di testo. Il sistema ANPR viene utilizzato in molti luoghi come pompe di benzina, centri commerciali, aeroporti, autostrade, caselli, hotel, ospedali, parcheggi, punti di controllo della difesa e militari ecc.
Sono disponibili molti strumenti di elaborazione delle immagini per questo rilevamento della targa, ma qui in questo tutorial utilizzeremo MATLAB Image Processing per ottenere il numero di targa del veicolo nel formato di testo. Se sei nuovo con MATLAB o l'elaborazione delle immagini, controlla i nostri precedenti progetti MATLAB:
- Iniziare con MATLAB: una rapida introduzione
- Guida introduttiva all'elaborazione delle immagini utilizzando MATLAB
Innanzitutto, lasciate che vi spieghi il concetto che stiamo usando per rilevare le targhe. Sono disponibili tre programmi o file ".m" per questo progetto.
- Creazione di modelli ( template_creation.m ) - Questo viene utilizzato per chiamare le immagini alfanumeriche salvate e quindi salvarle come nuovo modello nella memoria MATLAB.
- Rilevamento lettere ( Letter_detection.m ): legge i caratteri dall'immagine di input e trova il valore alfanumerico corrispondente con la corrispondenza più alta.
- Plate Detection ( Plate_detection.m ) - Elabora l'immagine e quindi chiama i due file m sopra per rilevare il numero.
Ora impareremo come codificare questi file m e cosa devi fare prima di iniziare a scrivere codice. Dopo aver seguito questo tutorial, puoi trovare tutti i file di codice e il video di spiegazione di lavoro alla fine di questo progetto.
Creazione di modelli
Per prima cosa crea una cartella per il progetto (il nome della mia cartella è Number Plate Detection ) per salvare e archiviare i file. Abbiamo memorizzato le immagini binarie di tutti gli alfabeti e i numeri nella sottocartella denominata " alpha" .
Ora apri la finestra Editor in MATLAB, come mostrato nell'immagine sottostante,
Se non hai familiarità con la terminologia di base di MATLAB ti suggerisco di controllare il tutorial collegato.
Ora copia e incolla il codice seguente nel file template_creation.m e salva il file nella cartella del progetto ( Number Plate Detection ). Tutti i file relativi a questo progetto, inclusi i file dei modelli di immagine, possono essere scaricati da qui. Controlla anche il video fornito alla fine di questo progetto.
% Alfabeti 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'); % Natural Numbers uno = imread ('alpha / 1.bmp'); due = imread ('alpha / 2.bmp'); tre = imread ('alpha / 3.bmp'); quattro = imread ('alpha / 4.bmp'); cinque = imread ('alpha / 5.bmp'); sei = imread ('alpha / 6.bmp'); sette = imread ('alpha / 7.bmp'); otto = imread ('alpha / 8.bmp'); nove = imread ('alpha / 9.bmp'); zero = imread ('alpha / 0.bmp'); % Creazione di array per alfabeti letter =; % Creazione di array per numeri numero =; NewTemplates =; save ('NewTemplates', 'NewTemplates') cancella tutto
Qui, nel codice sopra, stiamo salvando le immagini in una variabile usando il comando ' imread () '. Questa funzione viene utilizzata per richiamare le immagini dalla cartella o da qualsiasi posizione del PC nel MATLAB. Facciamo un esempio dal codice sopra:
A = imread ('alpha / A.bmp');
Dove A è la variabile e in " alpha / A.bmp" , "alpha" è il nome della cartella e " A.bmp" è il nome del file.
Quindi creare una matrice di " lettera " e " numero " e salvarla nella variabile " Nuovi modelli " utilizzando il comando " salva (nome file, variabili)" .
% Creazione di array per alfabeti letter =; % Creazione di array per numeri numero =; NewTemplates =; save ('NewTemplates', 'NewTemplates') cancella tutto
Ora inizia a codificare Letter_detection.m , in una nuova finestra dell'editor.
Rilevamento delle lettere
Qui stiamo creando il secondo file di codice denominato Letter_detection.m . Ora copia e incolla il codice seguente in quel file e salva il file nella cartella del progetto con il nome Letter_detection. Questo file può essere scaricato da qui, questo file zip allegato contiene anche altri file relativi a questo progetto di rilevamento della targa.
function letter = readLetter (snap) carica NewTemplates snap = imresize (snap,); rec =; per n = 1: length (NewTemplates) cor = corr2 (NewTemplates {1, n}, snap); rec =; end ind = find (rec == max (rec)); display (trova (rec == max (rec))); % Elenchi di alfabeti. se ind == 1 - ind == 2 lettera = '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 lettera = 'F'; elseif ind == 10 lettere = 'G'; elseif ind == 11 lettera = 'H'; elseif ind == 12 letter = 'I'; elseif ind == 13 lettera = 'J'; elseif ind == 14 lettera = 'K'; elseif ind == 15 letter = 'L'; elseif ind == 16 lettera = 'M'; elseif ind == 17 lettera = 'N'; elseif ind == 18 - ind == 19 letter = 'O'; elseif ind == 20 - ind == 21 lettera = 'P'; elseif ind == 22 - ind == 23 letter = 'Q'; elseif ind == 24 - ind == 25 letter = 'R'; elseif ind == 26 lettera = 'S'; elseif ind == 27 lettera = 'T'; elseif ind == 28 lettera = 'U'; elseif ind == 29 lettera = 'V'; elseif ind == 30 letter = 'W'; elseif ind == 31 lettera = 'X'; elseif ind == 32 lettera = 'Y'; elseif ind == 33 lettera = 'Z'; % * - * - * - * - * % i riferimenti numerici in lista. elseif ind == 34 lettera = '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 lettera = '6'; elseif ind == 43 letter = '7'; elseif ind == 44 - ind == 45 letter = '8'; elseif ind == 46 - ind == 47 - ind == 48 letter = '9'; altrimenti lettera = '0'; fine fine
Qui, nel codice sopra abbiamo creato una funzione chiamata letter che ci fornisce l'output alfanumerico dell'immagine di input dalla classe ' alpha ' usando il comando ' readLetter ()' . Quindi carica i modelli salvati utilizzando il comando load 'NewTemplates .
Dopodiché, abbiamo ridimensionato l'immagine di input in modo che possa essere confrontata con le immagini del modello utilizzando il comando 'imresize (nomefile, dimensione)' . Quindi il ciclo for viene utilizzato per correlare l'immagine di input con ogni immagine nel modello per ottenere la migliore corrispondenza.
Viene creata una matrice ' rec ' per registrare il valore di correlazione per ogni modello alfanumerico con il modello di caratteri dall'immagine di input, come mostrato nel codice sottostante,
cor = corr2 (NewTemplates {1, n}, snap);
Quindi il comando 'find ()' viene utilizzato per trovare l'indice che corrisponde al carattere con la corrispondenza più alta. Quindi, secondo quell'indice, il carattere corrispondente viene stampato utilizzando l' istruzione "if-else" .
Ora, dopo aver completato con questo, apri una nuova finestra dell'editor per avviare il codice per il programma principale.
Rilevamento della targa
Ecco il terzo e ultimo file di codice denominato Plate_detection.m copia e incolla il codice seguente in questo file e salva nella cartella del progetto. Per un avvio rapido puoi scaricare tutti i file di codice con i modelli di immagine da qui.
chiudi tutto; cancella tutto; im = imread ('Number Plate Images / image1.png'); imgray = rgb2gray (im); imbin = imbinarize (imgray); im = edge (imgray, 'prewitt'); % I passaggi seguenti servono a trovare la posizione della targa Iprops = regionprops (im, 'BoundingBox', 'Area', 'Image'); area = Iprops.Area; count = numel (Iprops); maxa = area; boundingBox = Iprops.BoundingBox; per i = 1: conta se maxa
I comandi di base utilizzati nel codice precedente sono menzionati di seguito:
imread () - Questo comando viene utilizzato per aprire l'immagine in MATLAB dalla cartella di destinazione.
rgb2gray (): questo comando viene utilizzato per convertire l'immagine RGB in formato scala di grigi.
imbinarize () - Questo comando viene utilizzato per binarizzare un'immagine in scala di grigi 2-D o semplicemente possiamo dire che converte l'immagine in formato bianco e nero.
edge () - Questo comando viene utilizzato per rilevare i bordi nell'immagine, utilizzando vari metodi come Roberts, Sobel, Prewitt e molti altri.
regionprops () - Questo comando viene utilizzato per misurare le proprietà della regione dell'immagine.
numel () - Questo comando viene utilizzato per calcolare il numero di elementi dell'array.
imcrop () - Questo comando viene utilizzato per ritagliare l'immagine nella dimensione inserita.
bwareaopen () - Questo comando viene utilizzato per rimuovere piccoli oggetti dall'immagine binaria.
Usando i comandi di cui sopra nel codice, chiamiamo l'immagine di input e la convertiamo in scala di grigi. Quindi la scala di grigi viene convertita nell'immagine binaria e il bordo delle immagini binarie viene rilevato dal metodo Prewitt.
Quindi il codice sottostante viene utilizzato per rilevare la posizione della targa nell'intera immagine di input, Iprops = regionprops (im, 'BoundingBox', 'Area', 'Image'); area = Iprops.Area; count = numel (Iprops); maxa = area; boundingBox = Iprops.BoundingBox; per i = 1: conta se maxa
Dopodiché ritaglia la targa e rimuovi i piccoli oggetti dall'immagine binaria usando rispettivamente i comandi 'imcrop ()' e 'bwareaopen ()' .
Quindi, il codice seguente viene utilizzato per elaborare l'immagine della targa ritagliata e per visualizzare il numero rilevato nell'immagine e nel formato di testo (nella finestra di comando).
Iprops = regionprops (im, 'BoundingBox', 'Area', 'Image'); count = numel (Iprops); noPlate =; per i = 1: count ow = length (Iprops (i).Image (1,:)); oh = lunghezza (Iprops (i).Image (:, 1)); if ow <(h / 2) & oh> (h / 3) letter = Letter_detection (Iprops (i).Image); noPlate = end end
Funzionamento del sistema di rilevamento del numero di targa del veicolo utilizzando MATLAB
Nel file template_creation.m abbiamo progettato il codice per salvare tutte le immagini binarie di caratteri alfanumerici in una directory o in un file denominato " NewTemplates ". Quindi quella directory viene chiamata in Letter_detection.m come puoi vedere di seguito
Poi nel Plate_detection.m file di codice il Letter_detection.m file di codice viene chiamato quando si elaborare l'immagine come mostrato nella immagine qui sotto,
Ora, fai clic sul pulsante "ESEGUI" per eseguire il file.m
MATLAB potrebbe impiegare alcuni secondi per rispondere, attendere finché non mostra il messaggio di occupato nell'angolo inferiore sinistro come mostrato di seguito,
All'avvio del programma verranno visualizzati il popup dell'immagine della targa e il numero nella finestra di comando. L'output per la mia immagine sarà simile all'immagine fornita di seguito;
Il funzionamento completo del sistema di rilevamento della targa del veicolo è dimostrato nel video sottostante e tutti i file di codice con i modelli di immagine possono essere scaricati da qui.
Inoltre, controlla tutti i progetti MATLAB qui.