- Создание шаблона
- Обнаружение букв
- Обнаружение номерного знака
- Работа системы определения номеров транспортных средств с использованием MATLAB
Вы когда-нибудь задумывались над тем, как работает система ANPR (автоматическое распознавание номерных знаков)? Позвольте мне рассказать вам о концепции, лежащей в основе этого: камера системы ANPR фиксирует изображение номерного знака транспортного средства, а затем изображение обрабатывается с помощью нескольких алгоритмов для обеспечения буквенно-цифрового преобразования изображения в текстовый формат. Система ANPR используется во многих местах, таких как бензиновые насосы, торговые центры, аэропорты, шоссе, пункты взимания платы, гостиницы, больницы, автостоянки, контрольно-пропускные пункты обороны и военных и т. Д.
Для этого обнаружения номерного знака доступно множество инструментов обработки изображений, но здесь, в этом руководстве, мы будем использовать MATLAB Image Processing, чтобы преобразовать номерной знак транспортного средства в текстовый формат. Если вы новичок в MATLAB или обработке изображений, проверьте наши предыдущие проекты MATLAB:
- Начало работы с MATLAB: краткое введение
- Начало работы с обработкой изображений с использованием MATLAB
Во-первых, позвольте мне рассказать вам о концепции, которую мы используем для обнаружения номерных знаков. Для этого проекта есть три программы или файлы.m.
- Создание шаблона ( template_creation.m ) - это используется для вызова сохраненных буквенно-цифровых изображений и затем сохранения их в качестве нового шаблона в памяти MATLAB.
- Обнаружение букв ( Letter_detection.m ) - считывает символы из входного изображения и находит соответствующие буквенно-цифровые символы с наибольшим соответствием.
- Обнаружение пластины ( Plate_detection.m ) - обработайте изображение, а затем вызовите два вышеуказанных m-файла, чтобы определить номер.
Теперь мы узнаем, как кодировать эти m-файлы и что вам нужно сделать, прежде чем начинать кодирование. Пройдя через это руководство, вы можете найти все файлы кода и рабочее видео с объяснениями в конце этого проекта.
Создание шаблона
Сначала создайте папку для проекта (имя моей папки - Number Plate Detection ) для сохранения и хранения файлов. Мы сохранили двоичные изображения всех алфавитов и чисел в подпапке с именем « альфа» .
Теперь откройте окно редактора в MATLAB, как показано на изображении ниже,
Если вы не знакомы с базовой терминологией MATLAB, я предлагаю вам проверить связанный учебник.
Теперь скопируйте и вставьте приведенный ниже код в файл template_creation.m и сохраните файл в папке проекта ( Определение номерных знаков ). Все файлы, связанные с этим проектом, включая файлы шаблонов изображений, можно скачать здесь. Также посмотрите видео, приведенное в конце этого проекта.
% Alphabets 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 ('альфа / X.bmp '); Y = imread ('alpha / Y.bmp'); Z = imread ('alpha / Z.bmp'); % Natural Numbers один = imread ('alpha / 1.bmp'); two = imread ('alpha / 2.bmp'); три = imread ('alpha / 3.bmp'); четыре = imread ('alpha / 4.bmp'); пять = imread ('alpha / 5.bmp'); шесть = imread ('alpha / 6.bmp'); семь = imread ('alpha / 7.bmp'); восемь = imread ('alpha / 8.bmp'); девять = imread ('alpha / 9.bmp'); ноль = imread ('alpha / 0.bmp'); % Создание массива для алфавитов letter =; % Создание массива для чисел number =; NewTemplates =; save ('NewTemplates', 'NewTemplates') очистить все
Здесь, в приведенном выше коде мы спасаем изображения в переменную с помощью команды « imread () ». Эта функция используется для вызова изображений из папки или из любого места ПК в MATLAB. Возьмем пример из приведенного выше кода:
A = imread ('alpha / A.bmp');
Где А переменная, а в « альфа / A.bmp» , «альфа» это имя папки и « A.bmp» это имя файла.
Затем создайте матрицу « буквы » и « числа » и сохраните ее в переменной « NewTemplates » с помощью команды « save (имя файла, переменные)» .
% Создание массива для алфавитов letter =; % Создание массива для чисел number =; NewTemplates =; save ('NewTemplates', 'NewTemplates') очистить все
Теперь начните кодировать Letter_detection.m в новом окне редактора.
Обнаружение букв
Здесь мы создаем второй файл кода с именем Letter_detection.m . Теперь скопируйте и вставьте приведенный ниже код в этот файл и сохраните файл в папке проекта с именем Letter_detection. Этот файл можно скачать отсюда, этот прикрепленный zip-файл также содержит другие файлы, связанные с этим проектом по обнаружению номерных знаков.
функция letter = readLetter (snap) load NewTemplates snap = imresize (snap,); rec =; для n = 1: длина (NewTemplates) cor = corr2 (NewTemplates {1, n}, snap); rec =; конец ind = find (rec == max (rec)); дисплей (найти (rec == max (rec))); % Алфавитные списки. если ind == 1 - ind == 2 letter = '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 letter = 'F'; elseif ind == 10 letter = 'G'; elseif ind == 11 letter = 'H'; elseif ind == 12 letter = 'I'; elseif ind == 13 letter = 'J'; elseif ind == 14 letter = 'K'; elseif ind == 15 letter = 'L'; elseif ind == 16 letter = 'M'; elseif ind == 17 letter = 'N'; elseif ind == 18 - ind == 19 letter = 'O'; elseif ind == 20 - ind == 21 letter = 'P'; elseif ind == 22 - ind == 23 letter = 'Q'; elseif ind == 24 - ind == 25 letter = 'R'; elseif ind == 26 letter = 'S'; elseif ind == 27 letter = 'Т'; elseif ind == 28 letter = 'U'; elseif ind == 29 letter = 'V'; elseif ind == 30 letter = 'W'; elseif ind == 31 буква = 'X'; elseif ind == 32 буква = 'Y'; elseif ind == 33 letter = 'Z'; % * - * - * - * - * %. Цифры объявлений 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'; иначе буква = '0'; конец конец
Здесь, в приведенном выше коде, мы создали функцию с именем letter, которая дает нам буквенно-цифровой вывод входного изображения из класса ' alpha ' с помощью команды ' readLetter ()' . Затем загрузите сохраненные шаблоны с помощью команды load 'NewTemplates .
После этого мы изменили размер входного изображения, чтобы его можно было сравнить с изображениями шаблона, используя команду imresize (filename, size) . Затем цикл for используется для сопоставления входного изображения с каждым изображением в шаблоне для получения наилучшего соответствия.
Матрица rec создается для записи значения корреляции для каждого буквенно-цифрового шаблона с шаблоном символов из входного изображения, как показано в приведенном ниже коде.
cor = corr2 (NewTemplates {1, n}, привязка);
Затем команда find () используется для поиска индекса, который соответствует самому высокому совпадающему символу. Затем в соответствии с этим индексом печатается соответствующий символ с использованием оператора if-else .
Теперь, после завершения этого, откройте новое окно редактора, чтобы запустить код для основной программы.
Обнаружение номерного знака
Вот третий и последний файл кода с именем Plate_detection.m, скопируйте и вставьте приведенный ниже код в этот файл и сохраните в папку проекта. Для быстрого старта вы можете скачать все файлы кода с шаблонами изображений отсюда.
закрыть все; очистить все; im = imread ('Number Plate Images / image1.png'); imgray = rgb2gray (им); imbin = imbinarize (imgray); im = край (imgray, 'prewitt'); % Ниже приведены шаги для определения местоположения номерного знака Iprops = regionprops (im, 'BoundingBox', 'Area', 'Image'); area = Iprops.Area; count = numel (Iprops); maxa = площадь; boundingBox = Iprops.BoundingBox; для i = 1: считать, если maxa
Основные команды, используемые в приведенном выше коде, упомянуты ниже:
imread () - эта команда используется для открытия изображения в MATLAB из целевой папки.
rgb2gray () –Эта команда используется для преобразования изображения RGB в формат оттенков серого.
imbinarize () - эта команда используется для преобразования двухмерного изображения в градациях серого в двоичную форму, или просто мы можем сказать, что она преобразует изображение в черно-белый формат.
edge () - эта команда используется для обнаружения краев изображения с помощью различных методов, таких как Roberts, Sobel, Prewitt и многих других.
regionprops () - эта команда используется для измерения свойств области изображения.
numel () - эта команда используется для вычисления количества элементов массива.
imcrop () - эта команда используется для обрезки изображения до заданного размера.
bwareaopen () - эта команда используется для удаления небольших объектов из двоичного изображения.
Используя приведенные выше команды в коде, мы вызываем входное изображение и преобразуем его в оттенки серого. Затем оттенки серого преобразуются в двоичное изображение, и край двоичных изображений определяется методом Prewitt.
Затем приведенный ниже код используется для определения местоположения номерного знака во всем входном изображении, Iprops = regionprops (im, 'BoundingBox', 'Area', 'Image'); area = Iprops.Area; count = numel (Iprops); maxa = площадь; boundingBox = Iprops.BoundingBox; для i = 1: считать, если maxa
После этого обрежьте номерной знак и удалите мелкие объекты из двоичного изображения с помощью команд imcrop () и bwareaopen () соответственно.
Затем приведенный ниже код используется для обработки кадрированного изображения номерного знака и отображения обнаруженного номера в формате изображения и текста (в командном окне).
Iprops = regionprops (im, 'BoundingBox', 'Area', 'Image'); count = numel (Iprops); noPlate =; для i = 1: count ow = length (Iprops (i).Image (1,:)); oh = длина (Iprops (i).Image (:, 1)); если ow <(h / 2) & oh> (h / 3) letter = Letter_detection (Iprops (i).Image); noPlate = конец конец
Работа системы определения номеров транспортных средств с использованием MATLAB
В файле template_creation.m мы разработали код для сохранения всех двоичных изображений буквенно-цифровых символов в каталог или файл с именем « NewTemplates ». Затем этот каталог вызывается в Letter_detection.m, как вы можете видеть ниже.
Затем в кодовом файле Plate_detection.m вызывается кодовый файл Letter_detection.m, когда мы обрабатываем изображение, как показано на изображении ниже,
Теперь нажмите кнопку «ЗАПУСТИТЬ», чтобы запустить файл.m.
MATLAB может занять несколько секунд, чтобы ответить, подождите, пока он не покажет сообщение о занятости в нижнем левом углу, как показано ниже,
При запуске программы вы увидите всплывающее окно с изображением номерного знака и номер в командном окне. Результат для моего изображения будет выглядеть так, как показано ниже;
Полная работа системы обнаружения номерных знаков транспортных средств продемонстрирована на видео ниже, а все файлы кода с шаблонами изображений можно скачать отсюда.
Также проверьте здесь все проекты MATLAB.