- Створення шаблону
- Виявлення листів
- Виявлення номерної таблички
- Працює система виявлення номера номерного знака транспортного засобу за допомогою MATLAB
Ви коли-небудь замислювалися про те, як працює система ANPR (автоматичне розпізнавання номерних знаків)? Дозвольте мені розповісти вам концепцію, яка стоїть за нею, камера системи ANPR фіксує зображення номерного знака транспортного засобу, а потім зображення обробляється через безліч алгоритмів, щоб забезпечити алфавітно-цифрове перетворення зображення в текстовий формат. Система ANPR використовується в багатьох місцях, таких як бензинові насоси, торгові центри, аеропорти, автомагістралі, платні каси, готелі, лікарні, автостоянки, оборонні та військові контрольно-пропускні пункти тощо.
Для цього виявлення номерних знаків доступно безліч інструментів для обробки зображень, але тут, у цьому посібнику, ми будемо використовувати обробку зображень MATLAB, щоб отримати номерний знак транспортного засобу у текстовому форматі. Якщо ви новачок у MATLAB або обробці зображень, перевірте наші попередні проекти MATLAB:
- Початок роботи з MATLAB: короткий вступ
- Початок роботи з обробкою зображень за допомогою MATLAB
Спочатку дозвольте коротко розповісти вам про концепцію, яку ми використовуємо для виявлення номерних знаків. Для цього проекту існує три програми або файли.m.
- Створення шаблону ( template_creation.m ) - Це використовується для виклику збережених зображень буквено-цифрових символів, а потім збереження їх як нового шаблону в пам'яті MATLAB.
- Розпізнавання літер ( Letter_detection.m ) - зчитує символи із вхідного зображення та знаходить відповідні буквено-цифрові відповідні.
- Виявлення пластини ( Plate_detection.m ) - обробіть зображення, а потім зателефонуйте до двох m-файлів, щоб виявити номер.
Тепер ми дізнаємося про те, як кодувати ці m-файли, і про те, що потрібно зробити перед початком кодування. Пройшовши цей посібник, ви зможете знайти всі файли коду та робоче відео з поясненнями в кінці цього проекту.
Створення шаблону
Спочатку створіть папку для проекту (моя назва папки - номерна табличка ) для збереження та збереження файлів. Ми зберегли двійкові зображення всіх алфавітів та цифр у підпапці, названій як " альфа" .
Тепер відкрийте вікно редактора в MATLAB, як показано на малюнку нижче,
Якщо ви не знайомі з основною термінологією MATLAB, я пропоную вам перевірити пов'язаний підручник.
Тепер скопіюйте та вставте наведений нижче код у файл template_creation.m та збережіть файл у папці проекту ( виявлення номерної таблички ). Усі файли, пов’язані з цим проектом, включаючи файли шаблонів зображень, можна завантажити звідси. Також перевірте відео, подане в кінці цього проекту.
% Алфавітів A = непрочитане ('alpha / A.bmp'); B = непрочитане ('alpha / B.bmp'); C = непрочитане ('alpha / C.bmp'); D = непрочитане ('alpha / D.bmp'); E = непрочитане ('alpha / E.bmp'); F = непрочитане ('alpha / F.bmp'); G = непрочитане ('alpha / G.bmp'); H = непрочитане ('alpha / H.bmp'); I = непрочитане ('alpha / I.bmp'); J = непрочитане ('alpha / J.bmp'); K = непрочитане ('alpha / K.bmp'); L = непрочитане ('alpha / L.bmp'); M = непрочитане ('alpha / M.bmp'); N = непрочитане ('alpha / N.bmp'); O = непрочитане ('alpha / O.bmp'); P = непрочитаний ('alpha / P.bmp'); Q = непрочитаний ('alpha / Q.bmp'); R = непрочитаний ('alpha / R.bmp'); S = непрочитане ('alpha / S.bmp'); T = непрочитане ('alpha / T.bmp'); U = непрочитане ('alpha / U.bmp'); V = непрочитане ('alpha / V.bmp'); W = непрочитане ('alpha / W.bmp'); X = непрочитане ('альфа / X.bmp '); Y = непрочитаний ('alpha / Y.bmp'); Z = непрочитаний ('alpha / Z.bmp'); % Натуральних чисел one = imread ('alpha / 1.bmp'); two = imread ('alpha / 2.bmp'); три = непрочитане ('альфа / 3.bmp'); чотири = непрочитане ('альфа / 4.bmp'); п'ять = непрочитане ('альфа / 5.bmp'); шість = непрочитане ('alpha / 6.bmp'); сім = непрочитане ('alpha / 7.bmp'); вісім = непрочитане ('alpha / 8.bmp'); дев'ять = непрочитане ('alpha / 9.bmp'); нуль = непрочитане ('альфа / 0.bmp'); % Створення масиву для алфавітів letter =; % Створення масиву для чисел number =; NewTemplates =; save ('NewTemplates', 'NewTemplates') очистити все
Тут, у наведеному вище коді, ми зберігаємо зображення у змінну за допомогою команди ' imread () '. Ця функція використовується для виклику зображень з папки або з будь-якого місця ПК у MATLAB. Візьмемо приклад із наведеного вище коду:
A = непрочитане ('alpha / A.bmp');
Де A - змінна, а в ' alpha / A.bmp' , 'alpha' - це назва папки, а ' A.bmp' - це назва файлу.
Потім створіть матрицю з « букви » та « числа » та збережіть її у змінну « NewTemplates », використовуючи команду « save (ім’я файлу, змінні)» .
% Створення масиву для алфавітів letter =; % Створення масиву для чисел number =; NewTemplates =; save ('NewTemplates', 'NewTemplates') очистити все
Тепер розпочніть кодування Letter_detection.m , у новому вікні редактора.
Виявлення листів
Тут ми створюємо другий файл коду з назвою Letter_detection.m . Тепер скопіюйте та вставте наведений нижче код у цей файл та збережіть файл у папці проекту з назвою Letter_detection. Цей файл можна завантажити звідси, ці вкладені zip-файли також містять інші файли, пов'язані з цим проектом виявлення номерних знаків.
букву функції = readLetter (snap) завантаження NewTemplates snap = imresize (snap,); rec =; для n = 1: довжина (NewTemplates) cor = corr2 (NewTemplates {1, n}, оснастка); rec =; кінець ind = знайти (rec == max (rec)); відображати (знайти (rec == max (rec))); % Списки алфавітів. якщо ind == 1 - ind == 2 буква = 'A'; elseif ind == 3 - ind == 4 буква = 'B'; elseif ind == 5 літера = 'C' elseif ind == 6 - ind == 7 літера = 'D'; elseif ind == 8 літера = 'E'; elseif ind == 9 літера = 'F'; elseif ind == 10 літера = 'G'; elseif ind == 11 літера = 'H'; elseif ind == 12 літера = 'I'; elseif ind == 13 літера = 'J'; elseif ind == 14 літера = 'K'; elseif ind == 15 літера = 'L'; elseif ind == 16 літера = 'M'; elseif ind == 17 літера = 'N'; elseif ind == 18 - ind == 19 буква = 'O'; elseif ind == 20 - ind == 21 буква = 'P'; elseif ind == 22 - ind == 23 літера = 'Q'; elseif ind == 24 - ind == 25 літера = 'R'; elseif ind == 26 літера = 'S'; elseif ind == 27 літера = 'T'; elseif ind == 28 літера = 'U'; elseif ind == 29 літера = 'V'; elseif ind == 30 літера = 'W'; elseif ind == 31 літера = 'X'; elseif ind == 32 літера = 'Y'; elseif ind == 33 літера = 'Z'; % * - * - * - * - * %. Цифри оголошень elseif ind == 34 літера = '1'; elseif ind == 35 літера = '2'; elseif ind == 36 літера = '3'; elseif ind == 37 - ind == 38 літера = '4'; elseif ind == 39 літера = '5'; elseif ind == 40 - ind == 41 - ind == 42 літера = '6'; elseif ind == 43 літера = '7'; elseif ind == 44 - ind == 45 літера = '8'; elseif ind == 46 - ind == 47 - ind == 48 літера = '9'; інакше буква = '0'; кінець кінець
Тут, у наведеному вище коді, ми створили функцію з назвою буква, яка дає нам буквено-цифровий вивід вхідного зображення із класу ' alpha ' за допомогою команди ' readLetter ()' . А потім завантажте збережені шаблони за допомогою команди завантаження 'NewTemplates .
Після цього ми змінили розмір вхідного зображення, щоб його можна було порівняти із зображеннями шаблону за допомогою команди 'imresize (ім'я файлу, розмір)' . Потім цикл for використовується для кореляції вхідного зображення з кожним зображенням у шаблоні, щоб отримати найкращий збіг.
Створюється матриця ' rec ' для запису значення кореляції для кожного буквено-цифрового шаблону із шаблоном символів із вхідного зображення, як показано в коді нижче,
cor = corr2 (NewTemplates {1, n}, оснастка);
Потім команда 'find ()' використовується для пошуку індексу, який відповідає найпопулярнішому символу. Потім відповідно до цього індексу відповідний символ друкується за допомогою оператора "якщо-ще" .
Тепер, після завершення цього, відкрийте нове вікно редактора для запуску коду основної програми.
Виявлення номерної таблички
Ось третій і остаточний файл коду з назвою Plate_detection.m, скопіюйте та вставте наведений нижче код у цей файл та збережіть у папці проекту. Для швидкого запуску ви можете завантажити всі файли коду із шаблонами зображень звідси.
закрити всіх; очистити все; im = imread ('Зображення номерних знаків / image1.png'); imgray = rgb2gray (im); imbin = imbinarize (імграй); im = край (imgray, 'prewitt'); % Нижче наведено кроки для знаходження номерного знака Iprops = regionprops (im, 'BoundingBox', 'Area', 'Image'); площа = Iprops.Area; count = numel (Iprops); maxa = площа; boundingBox = Iprops.BoundingBox; для i = 1: підрахувати, якщо maxa
Основні команди, що використовуються у наведеному вище коді, згадані нижче:
imread () - Ця команда використовується для відкриття зображення в MATLAB із цільової папки.
rgb2gray () - Ця команда використовується для перетворення зображення RGB у формат градацій сірого.
imbinarize () - Ця команда використовується для Binarize 2-D сірого зображення, або просто можна сказати, що вона перетворює зображення в чорно-білий формат.
edge () - Ця команда використовується для виявлення країв зображення, використовуючи різні методи, такі як Робертс, Собель, Превітт та багато інших.
regionprops () - Ця команда використовується для вимірювання властивостей області зображення.
numel () - Ця команда використовується для обчислення кількості елементів масиву.
imcrop () - Ця команда використовується для обрізання зображення у введеному розмірі.
bwareaopen () - Ця команда використовується для видалення дрібних об'єктів із двійкового зображення.
Використовуючи наведені вище команди в коді, ми викликаємо вхідне зображення і перетворюємо його у відтінки сірого. Потім відтінки сірого перетворюються у двійкове зображення, а край бінарних зображень виявляється методом Превітта.
Потім наведений нижче код використовується для виявлення розташування номерного знака на всьому вхідному зображенні, Iprops = regionprops (im, 'BoundingBox', 'Area', 'Image'); площа = 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)); if 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, коли ми обробляємо зображення, як показано на малюнку нижче,
Тепер натисніть кнопку "RUN", щоб запустити файл.m
MATLAB може зайняти кілька секунд, щоб відповісти, зачекайте, поки в нижньому лівому куті не з’явиться повідомлення про зайнятість, як показано нижче
Під час запуску програми ви отримаєте спливаюче зображення номерного знака та номер у вікні команди. Вихідні дані для мого зображення будуть виглядати як зображення, подане нижче;
Повна робота системи виявлення номерних знаків транспортного засобу продемонстрована у відео нижче, і всі файли коду із шаблонами зображень можна завантажити звідси.
Також перевірте всі проекти MATLAB тут.