- Criação de modelo
- Detecção de letras
- Detecção de matrícula
- Funcionamento do sistema de detecção do número da placa do veículo usando MATLAB
Você já se perguntou como funciona um sistema ANPR (Automatic Number Plate Recognition)? Deixe-me contar o conceito por trás disso, a câmera do sistema ANPR captura a imagem da placa do veículo e, em seguida, a imagem é processada por meio de vários algoritmos para fornecer uma conversão alfanumérica da imagem em um formato de texto. O sistema ANPR é usado em muitos lugares como bombas de gasolina, shoppings, aeroportos, rodovias, pedágios, hotéis, hospitais, estacionamentos, pontos de verificação de defesa e militar, etc.
Existem muitas ferramentas de processamento de imagem disponíveis para esta detecção de placa de número, mas aqui neste tutorial usaremos o processamento de imagem MATLAB para obter o número da placa do veículo no formato de texto. Se você é novo no MATLAB ou no processamento de imagens, verifique nossos projetos anteriores do MATLAB:
- Introdução ao MATLAB: uma introdução rápida
- Primeiros passos com processamento de imagens usando MATLAB
Em primeiro lugar, gostaria de informá-lo sobre o conceito que estamos usando para detectar placas de matrícula. Existem três programas ou arquivos '.m' para este projeto.
- Criação de modelo ( template_creation.m ) - É usado para chamar as imagens alfanuméricas salvas e salvá-las como um novo modelo na memória do MATLAB.
- Detecção de letras ( Letter_detection.m ) - Lê os caracteres da imagem de entrada e encontra o alfanumérico correspondente com correspondência mais alta.
- Detecção de placa ( Plate_detection.m ) - Processe a imagem e chame os dois arquivos-m acima para detectar o número.
Agora, aprenderemos como codificar esses arquivos-m e o que você deve fazer antes de começar a codificar. Depois de passar por este tutorial, você pode encontrar todos os arquivos de código e vídeo de explicação de trabalho no final deste projeto.
Criação de modelo
Primeiro crie uma pasta para o projeto (meu nome de pasta é Number Plate Detection ) para salvar e armazenar os arquivos. Armazenamos as imagens binárias de todos os alfabetos e números na subpasta denominada ' alfa' .
Agora, abra a janela do Editor no MATLAB, conforme mostrado na imagem abaixo,
Se você não está familiarizado com a terminologia básica do MATLAB, sugiro que verifique o tutorial vinculado.
Agora, copie e cole o código abaixo no arquivo template_creation.m , e salve o arquivo na pasta do projeto ( Number Plate Detection ). Todos os arquivos relacionados a este projeto, incluindo arquivos de modelos de imagem, podem ser baixados aqui. Confira também o vídeo fornecido no final deste projeto.
% 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 ('alfa / J.bmp'); K = imread ('alfa / K.bmp'); L = imread ('alfa / 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 ('alfa / Y.bmp'); Z = imread ('alfa / Z.bmp'); % Números naturais um = imread ('alpha / 1.bmp'); dois = imread ('alpha / 2.bmp'); três = imread ('alpha / 3.bmp'); quatro = imread ('alpha / 4.bmp'); cinco = imread ('alfa / 5.bmp'); seis = imread ('alfa / 6.bmp'); sete = imread ('alfa / 7.bmp'); oito = imread ('alfa / 8.bmp'); nove = imread ('alfa / 9.bmp'); zero = imread ('alfa / 0.bmp'); % Criando Matriz para Alfabetos letter =; % Criando Array para Números number =; NewTemplates =; save ('NewTemplates', 'NewTemplates') limpar todos
Aqui, no código acima, estamos salvando as imagens em uma variável usando o comando ' imread () '. Esta função é usada para chamar as imagens da pasta ou de qualquer local do PC para o MATLAB. Vamos dar um exemplo do código acima:
A = imread ('alfa / A.bmp');
Onde A é a variável e em ' alpha / A.bmp' , 'alpha' é o nome da pasta e ' A.bmp' é o nome do arquivo.
Em seguida, crie uma matriz de ' letra ' e ' número ' e salve-a na variável ' NewTemplates ' usando o comando ' salvar (nome do arquivo, variáveis)' .
% Criando Matriz para Alfabetos letter =; % Criando Array para Números number =; NewTemplates =; save ('NewTemplates', 'NewTemplates') limpar todos
Agora comece a codificar Letter_detection.m , em uma nova janela do editor.
Detecção de letras
Aqui estamos criando o segundo arquivo de código denominado Letter_detection.m . Agora, copie e cole o código abaixo nesse arquivo e salve o arquivo na pasta do projeto com o nome Letter_detection. Este arquivo pode ser baixado aqui, este arquivo zip anexado também contém outros arquivos relacionados a este projeto de detecção de placa de número.
letra de função = readLetter (snap) carregar NewTemplates snap = imresize (snap,); rec =; para n = 1: comprimento (NewTemplates) cor = corr2 (NewTemplates {1, n}, encaixe); rec =; end ind = find (rec == max (rec)); exibir (encontrar (rec == max (rec))); % Listagens de alfabetos. se ind == 1 - ind == 2 letra = 'A'; elseif ind == 3 - ind == 4 letra = '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 letter = 'J'; elseif ind == 14 letras = 'K'; elseif ind == 15 letras = 'L'; elseif ind == 16 letra = 'M'; elseif ind == 17 letra = 'N'; elseif ind == 18 - ind == 19 letter = 'O'; elseif ind == 20 - ind == 21 letra = 'P'; elseif ind == 22 - ind == 23 letter = 'Q'; elseif ind == 24 - ind == 25 letra = 'R'; elseif ind == 26 letter = 'S'; elseif ind == 27 letra = 'T'; elseif ind == 28 letter = 'U'; elseif ind == 29 letra = 'V'; elseif ind == 30 letter = 'W'; elseif ind == 31 letter = 'X'; elseif ind == 32 letra = 'Y'; elseif ind == 33 letra = 'Z'; % * - * - * - * - * % numerais listagens. 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'; outra letra = '0'; fim fim
Aqui, no código acima, criamos uma função chamada letter que nos dá a saída alfanumérica da imagem de entrada da classe ' alpha ' usando o comando ' readLetter ()' . Em seguida, carregue os modelos salvos usando o comando load 'NewTemplates .
Depois disso, redimensionamos a imagem de entrada para que possa ser comparada com as imagens do template usando o comando 'imresize (nome do arquivo, tamanho)' . Então para loop é usado para correlatos a imagem de entrada com todas as imagens no modelo para obter o melhor jogo.
Uma matriz ' rec ' é criada para registrar o valor de correlação para cada modelo alfanumérico com o modelo de caracteres da imagem de entrada, conforme mostrado no código abaixo,
cor = corr2 (NewTemplates {1, n}, snap);
Em seguida , o comando 'find ()' é usado para encontrar o índice que corresponde ao caractere mais correspondido. Então, de acordo com esse índice, o caractere correspondente é impresso usando a instrução 'if-else' .
Agora, depois de concluir isso, abra uma nova janela do editor para iniciar o código do programa principal.
Detecção de matrícula
Aqui está o terceiro e último arquivo de código denominado Plate_detection.m copie e cole o código abaixo neste arquivo e salve na pasta do projeto. Para um início rápido, você pode baixar todos os arquivos de código com modelos de imagem aqui.
feche tudo; limpar tudo; im = imread ('Number Plate Images / image1.png'); imgray = rgb2gray (im); imbin = imbinarizar (imgray); im = borda (imgray, 'prewitt'); % Os passos abaixo são para encontrar a localização da placa de matrícula Iprops = regionprops (im, 'BoundingBox', 'Area', 'Image'); area = Iprops.Area; contagem = numel (Iprops); maxa = área; boundingBox = Iprops.BoundingBox; para i = 1: conta se maxa
Os comandos básicos usados no código acima são mencionados abaixo:
imread () - Este comando é usado para abrir a imagem no MATLAB a partir da pasta de destino.
rgb2gray () –Este comando é usado para converter a imagem RGB no formato de tons de cinza.
imbinarize () - Este comando é usado para Binarizar imagens em tons de cinza 2-D ou simplesmente podemos dizer que converte a imagem em formato preto e branco.
edge () - Este comando é usado para detectar as bordas da imagem, usando vários métodos como Roberts, Sobel, Prewitt e muitos outros.
regionprops () - Este comando é usado para medir propriedades da região da imagem.
numel () - Este comando é usado para calcular o número de elementos da matriz.
imcrop () - Este comando é usado para cortar a imagem no tamanho inserido.
bwareaopen () - Este comando é usado para remover pequenos objetos da imagem binária.
Ao usar os comandos acima no código, estamos chamando a imagem de entrada e convertendo-a em tons de cinza. Em seguida, a escala de cinza é convertida na imagem binária e a borda das imagens binárias é detectada pelo método Prewitt.
Em seguida, o código abaixo é usado para detectar a localização da placa do número em toda a imagem de entrada, Iprops = regionprops (im, 'BoundingBox', 'Área', 'Imagem'); area = Iprops.Area; contagem = numel (Iprops); maxa = área; boundingBox = Iprops.BoundingBox; para i = 1: conta se maxa
Depois disso, corte a placa do número e remova os pequenos objetos da imagem binária usando os comandos 'imcrop ()' e 'bwareaopen ()' respectivamente.
Em seguida, o código a seguir é usado para processar a imagem recortada da placa de carro e exibir o número detectado no formato de imagem e texto (na janela de comando).
Iprops = regionprops (im, 'BoundingBox', 'Área', 'Imagem'); contagem = numel (Iprops); noPlate =; para i = 1: contar ow = comprimento (Iprops (i).Image (1,:)); oh = comprimento (Iprops (i).Imagem (:, 1)); if ow <(h / 2) & oh> (h / 3) letter = Letter_detection (Iprops (i).Image); noPlate = end end
Funcionamento do sistema de detecção do número da placa do veículo usando MATLAB
No arquivo template_creation.m , projetamos o código para salvar todas as imagens binárias de alfanuméricos em um diretório ou arquivo denominado ' NewTemplates '. Então, esse diretório é chamado em Letter_detection.m como você pode ver abaixo
Então, no arquivo de código Plate_detection.m , o arquivo de código Letter_detection.m é chamado quando processamos a imagem, conforme mostrado na imagem abaixo,
Agora, clique no botão 'EXECUTAR' para executar o arquivo.m
O MATLAB pode levar alguns segundos para responder, espere até que ele mostre a mensagem de ocupado no canto esquerdo inferior conforme mostrado abaixo,
Assim que o programa for iniciado, você obterá a imagem da placa da matrícula e o número na janela de comando. A saída da minha imagem será semelhante à imagem fornecida abaixo;
O funcionamento completo do sistema de detecção de matrículas de veículos é demonstrado no vídeo abaixo, e todos os arquivos de código com modelos de imagem podem ser baixados aqui.
Além disso, verifique todos os Projetos MATLAB aqui.