- Creación de plantillas
- Detección de letras
- Detección de matrícula
- Funcionamiento del sistema de detección de matrículas de vehículos mediante MATLAB
¿Alguna vez se ha preguntado cómo funciona un sistema ANPR (reconocimiento automático de matrículas)? Déjame decirte el concepto detrás de esto, la cámara del sistema ANPR captura la imagen de la matrícula del vehículo y luego la imagen se procesa a través de varios algoritmos para proporcionar una conversión alfanumérica de la imagen en un formato de texto. El sistema ANPR se utiliza en muchos lugares, como bombas de gasolina, centros comerciales, aeropuertos, carreteras, cabinas de peaje, hoteles, hospitales, estacionamientos, puntos de control de defensa y militares, etc.
Hay muchas herramientas de procesamiento de imágenes disponibles para esta detección de matrículas, pero aquí en este tutorial usaremos Procesamiento de imágenes MATLAB para obtener el número de matrícula del vehículo en formato de texto. Si es nuevo en MATLAB o en el procesamiento de imágenes, consulte nuestros proyectos anteriores de MATLAB:
- Introducción a MATLAB: una introducción rápida
- Introducción al procesamiento de imágenes con MATLAB
Primero, permítame informarle sobre el concepto que estamos utilizando para detectar matrículas. Hay tres programas o archivos '.m' para este proyecto.
- Creación de plantilla ( template_creation.m ): se utiliza para llamar a las imágenes guardadas de caracteres alfanuméricos y luego guardarlas como una nueva plantilla en la memoria de MATLAB.
- Detección de letras ( Letter_detection.m ): lee los caracteres de la imagen de entrada y encuentra el alfanumérico correspondiente más coincidente.
- Plate Detection ( Plate_detection.m ): procese la imagen y luego llame a los dos archivos m anteriores para detectar el número.
Ahora, aprenderemos cómo codificar estos archivos my lo que tiene que hacer antes de comenzar a codificar. Después de seguir este tutorial, puede encontrar todos los archivos de código y el video de explicación de trabajo al final de este proyecto.
Creación de plantillas
Primero cree una carpeta para el proyecto (el nombre de mi carpeta es Detección de matrícula ) para guardar y almacenar los archivos. Hemos almacenado las imágenes binarias de todos los alfabetos y números en la subcarpeta denominada ' alfa' .
Ahora, abra la ventana del Editor en MATLAB, como se muestra en la imagen de abajo,
Si no está familiarizado con la terminología básica de MATLAB, le sugiero que consulte el tutorial vinculado.
Ahora, copie y pegue el código siguiente en el archivo template_creation.m y guarde el archivo en la carpeta del proyecto ( Detección de matrícula ). Todos los archivos relacionados con este proyecto, incluidos los archivos de plantillas de imágenes, se pueden descargar desde aquí. Consulte también el video que se encuentra al final de este proyecto.
% Alfabetos 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'); % Números naturales uno = imread ('alpha / 1.bmp'); dos = imread ('alpha / 2.bmp'); tres = imread ('alpha / 3.bmp'); cuatro = imread ('alpha / 4.bmp'); cinco = imread ('alpha / 5.bmp'); seis = imread ('alpha / 6.bmp'); siete = imread ('alpha / 7.bmp'); ocho = imread ('alpha / 8.bmp'); nueve = imread ('alpha / 9.bmp'); cero = imread ('alpha / 0.bmp'); % Creando matriz para alfabetos letter =; % Creando una matriz para números number =; NewTemplates =; guardar ('Nuevas plantillas', 'Nuevas plantillas') borrar todo
Aquí, en el código anterior, estamos guardando las imágenes en una variable usando el comando ' imread () '. Esta función se utiliza para llamar las imágenes de la carpeta o desde cualquier ubicación de la PC en MATLAB. Tomemos un ejemplo del código anterior:
A = imread ('alfa / A.bmp');
Donde A es la variable y en ' alpha / A.bmp' , 'alpha' es el nombre de la carpeta y ' A.bmp' es el nombre del archivo.
Luego cree una matriz de ' letra ' y ' número ' y guárdela en la variable ' Nuevas plantillas ' usando el comando ' guardar (nombre de archivo, variables)' .
% Creando matriz para alfabetos letter =; % Creando una matriz para números number =; NewTemplates =; guardar ('Nuevas plantillas', 'Nuevas plantillas') borrar todo
Ahora comience a codificar Letter_detection.m , en una nueva ventana del editor.
Detección de letras
Aquí estamos creando el segundo archivo de código llamado Letter_detection.m . Ahora, copie y pegue el siguiente código en ese archivo y guarde el archivo en la carpeta del proyecto con el nombre Letter_detection. Este archivo se puede descargar desde aquí, estos archivos zip adjuntos también contienen otros archivos relacionados con este proyecto de detección de matrículas.
función letra = readLetter (snap) cargar NewTemplates snap = imresize (snap,); rec =; para n = 1: longitud (Nuevas plantillas) cor = corr2 (Nuevas plantillas {1, n}, snap); rec =; end ind = find (rec == max (rec)); mostrar (buscar (rec == max (rec))); % Listados de alfabetos. si ind == 1 - ind == 2 letra = 'A'; elseif ind == 3 - ind == 4 letras = 'B'; elseif ind == 5 letra = 'C' elseif ind == 6 - ind == 7 letra = 'D'; elseif ind == 8 letras = 'E'; elseif ind == 9 letra = 'F'; elseif ind == 10 letras = 'G'; elseif ind == 11 letra = 'H'; elseif ind == 12 letras = 'I'; elseif ind == 13 letra = 'J'; elseif ind == 14 letra = 'K'; elseif ind == 15 letra = 'L'; elseif ind == 16 letra = 'M'; elseif ind == 17 letra = 'N'; elseif ind == 18 - ind == 19 letra = 'O'; elseif ind == 20 - ind == 21 letra = 'P'; elseif ind == 22 - ind == 23 letra = 'Q'; elseif ind == 24 - ind == 25 letra = 'R'; elseif ind == 26 letra = 'S'; elseif ind == 27 letra = 'T'; elseif ind == 28 letra = 'U'; elseif ind == 29 letra = 'V'; elseif ind == 30 letra = 'W'; elseif ind == 31 letra = 'X'; elseif ind == 32 letra = 'Y'; elseif ind == 33 letra = 'Z'; % * - * - * - * - * % Números listados. elseif ind == 34 letra = '1'; elseif ind == 35 letra = '2'; elseif ind == 36 letra = '3'; elseif ind == 37 - ind == 38 letra = '4'; elseif ind == 39 letra = '5'; elseif ind == 40 - ind == 41 - ind == 42 letra = '6'; elseif ind == 43 letra = '7'; elseif ind == 44 - ind == 45 letra = '8'; elseif ind == 46 - ind == 47 - ind == 48 letra = '9'; else letra = '0'; fin fin
Aquí, en el código anterior hemos creado una función llamada letra que nos da la salida alfanumérica de la imagen de entrada de la clase ' alpha ' usando el comando ' readLetter ()' . Y luego cargue las plantillas guardadas usando el comando load 'NewTemplates .
Después de eso, cambiamos el tamaño de la imagen de entrada para que se pueda comparar con las imágenes de la plantilla mediante el comando 'imresize (nombre de archivo, tamaño)' . Luego, el bucle for se utiliza para correlacionar la imagen de entrada con cada imagen de la plantilla para obtener la mejor coincidencia.
Se crea una matriz ' rec ' para registrar el valor de correlación de cada plantilla alfanumérica con la plantilla de caracteres de la imagen de entrada, como se muestra en el siguiente código,
cor = corr2 (Plantillas nuevas {1, n}, snap);
Luego , el comando 'find ()' se usa para encontrar el índice que corresponde al carácter coincidente más alto. Luego, de acuerdo con ese índice, el carácter correspondiente se imprime usando la instrucción 'if-else' .
Ahora, después de completar con esto, abra una nueva ventana del editor para iniciar el código del programa principal.
Detección de matrícula
Aquí está el tercer y último archivo de código llamado Plate_detection.m copie y pegue el siguiente código en este archivo y guárdelo en la carpeta del proyecto. Para un inicio rápido, puede descargar todos los archivos de código con plantillas de imágenes desde aquí.
cierra todo; limpiar todo; im = imread ('Imágenes de matrículas / image1.png'); imgray = rgb2gray (im); imbin = imbinarizar (imgray); im = borde (imgray, 'prewitt'); % Los siguientes pasos son para encontrar la ubicación de la matrícula Iprops = regionprops (im, 'BoundingBox', 'Area', 'Image'); area = Iprops.Area; count = numel (Iprops); maxa = área; boundingBox = Iprops.BoundingBox; para i = 1: cuenta si maxa
Los comandos básicos utilizados en el código anterior se mencionan a continuación:
imread (): este comando se usa para abrir la imagen en MATLAB desde la carpeta de destino.
rgb2gray (): este comando se utiliza para convertir la imagen RGB en formato de escala de grises.
imbinarize (): este comando se usa para binarizar una imagen en escala de grises 2-D o simplemente podemos decir que convierte la imagen en formato blanco y negro.
edge (): este comando se usa para detectar los bordes en la imagen, usando varios métodos como Roberts, Sobel, Prewitt y muchos otros.
regionprops (): este comando se utiliza para medir las propiedades de la región de la imagen.
numel (): este comando se utiliza para calcular el número de elementos de la matriz.
imcrop (): este comando se usa para recortar la imagen en el tamaño ingresado.
bwareaopen (): este comando se usa para eliminar pequeños objetos de la imagen binaria.
Al usar los comandos anteriores en el código, estamos llamando a la imagen de entrada y convirtiéndola en escala de grises. Luego, la escala de grises se convierte en la imagen binaria y el borde de las imágenes binarias se detecta mediante el método Prewitt.
Luego, el siguiente código se usa para detectar la ubicación de la matrícula en toda la imagen de entrada, Iprops = regionprops (im, 'BoundingBox', 'Área', 'Imagen'); area = Iprops.Area; count = numel (Iprops); maxa = área; boundingBox = Iprops.BoundingBox; para i = 1: cuenta si maxa
Después de eso, recorte la placa de número y elimine los objetos pequeños de la imagen binaria usando el comando 'imcrop ()' y 'bwareaopen ()' respectivamente.
Luego, el siguiente código se usa para procesar esa imagen de matrícula recortada y para mostrar el número detectado en el formato de imagen y texto (en la ventana de comando).
Iprops = regionprops (im, 'BoundingBox', 'Área', 'Imagen'); count = numel (Iprops); noPlate =; para i = 1: count ow = length (Iprops (i).Image (1,:)); oh = longitud (Iprops (i).Image (:, 1)); if ow <(h / 2) & oh> (h / 3) letter = Letter_detection (Iprops (i).Image); noPlate = end end
Funcionamiento del sistema de detección de matrículas de vehículos mediante MATLAB
En el archivo template_creation.m hemos diseñado el código para guardar todas las imágenes binarias alfanuméricas en un directorio o archivo llamado ' NewTemplates '. Luego, ese directorio se llama en Letter_detection.m como puede ver a continuación
Luego, en el Plate_detection.m archivo de código del Letter_detection.m archivo de código se llama cuando se procesa la imagen como se muestra en la imagen de abajo,
Ahora, haga clic en el botón 'EJECUTAR' para ejecutar el archivo.m
MATLAB puede tardar unos segundos en responder, espere hasta que muestre un mensaje de ocupado en la esquina inferior izquierda como se muestra a continuación,
A medida que se inicia el programa, aparecerá la imagen emergente de la matrícula y el número en la ventana de comandos. La salida de mi imagen se verá como la imagen que se muestra a continuación;
El funcionamiento completo del sistema de detección de matrículas de vehículos se muestra en el video a continuación, y todos los archivos de código con plantillas de imágenes se pueden descargar desde aquí.
Además, consulte todos los proyectos de MATLAB aquí.