- Създаване на шаблон
- Откриване на писма
- Откриване на регистрационния номер
- Работа на системата за откриване на номера на регистрационния номер на превозното средство с помощта на MATLAB
Чудили ли сте се някога, че как работи системата ANPR (автоматично разпознаване на регистрационния номер)? Позволете ми да ви разкажа концепцията зад нея, камерата на системата ANPR улавя изображение на регистрационния номер на превозното средство и след това изображението се обработва чрез множество алгоритми, за да осигури буквено-цифрово преобразуване на изображението в текстов формат. Системата ANPR се използва на много места като бензинови помпи, търговски центрове, летища, магистрали, пунктове за събиране на такси, хотели, болници, паркинги, отбранителни и военни контролни пунктове и др.
Налични са много инструменти за обработка на изображения за това откриване на регистрационния номер, но тук в този урок ще използваме Обработка на изображения MATLAB, за да вкараме номера на регистрационния номер на превозното средство в текстов формат. Ако сте нов с 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 и го запазете в папката на проекта ( Откриване на номерната плоча ). Всички файлове, свързани с този проект, включително файловете с шаблони на изображения, могат да бъдат изтеглени от тук. Също така проверете видеото, дадено в края на този проект.
% Азбуки A = imread ('alpha / A.bmp'); B = imread ('alpha / B.bmp'); C = imread ('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 = 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 = непрочетено ('алфа / V.bmp'); W = непрочетено ('алфа / W.bmp'); X = непрочетено ('алфа / X.bmp '); Y = непрочетено ('alpha / Y.bmp'); Z = непрочетено ('alpha / Z.bmp'); % Естествени числа one = imread ('alpha / 1.bmp'); two = imread ('alpha / 2.bmp'); three = imread ('alpha / 3.bmp'); four = imread ('alpha / 4.bmp'); пет = непрочетено ('alpha / 5.bmp'); шест = непрочетено ('alpha / 6.bmp'); седем = непрочетени ('alpha / 7.bmp'); осем = непрочетени ('alpha / 8.bmp'); девет = непрочетено ('alpha / 9.bmp'); нула = непрочетено ('alpha / 0.bmp'); % Създаване на масив за азбуки letter =; % Създаване на масив за числа номер =; NewTemplates =; save ('NewTemplates', 'NewTemplates') изчистване на всички
Тук, в горния код, ние записваме изображенията в променлива с помощта на командата ' imread () '. Тази функция се използва за извикване на изображения от папката или от всяко място на компютъра в MATLAB. Нека вземем пример от горния код:
A = непрочетено ('alpha / A.bmp');
Където A е променливата, а в „ alpha / A.bmp“ , „alpha“ е името на папката, а „ A.bmp“ е името на файла.
След това създайте матрица от „ буква “ и „ номер “ и я запазете в променлива „ NewTemplates “, като използвате командата „ save (име на файл, променливи)“ .
% Създаване на масив за азбуки letter =; % Създаване на масив за числа номер =; NewTemplates =; save ('NewTemplates', 'NewTemplates') изчистване на всички
Сега започнете да кодирате Letter_detection.m , в нов прозорец на редактора.
Откриване на писма
Тук създаваме втория кодов файл с име Letter_detection.m . Сега копирайте и поставете кода по-долу в този файл и запазете файла в папката на проекта с име Letter_detection. Този файл може да бъде изтеглен от тук, този прикачен zip файл съдържа и други файлове, свързани с този проект за откриване на регистрационния номер.
буквата на функцията = readLetter (snap) load 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'; край край
Тук, в горния код, ние създадохме функция, наречена буква, която ни дава буквено-цифровия изход на входното изображение от клас „ алфа “ с помощта на командата „ readLetter ()“ . И след това заредете запазените шаблони, като използвате командата load "NewTemplates .
След това сме преоразмерили входното изображение, за да може да се сравни с изображенията на шаблона с помощта на командата 'imresize (име на файл, размер)' . След това цикълът for се използва за корелация на входното изображение с всяко изображение в шаблона, за да се получи най-доброто съвпадение.
Създава се матрица ' rec ' за запис на стойността на корелация за всеки буквено-цифров шаблон с шаблона за символи от входното изображение, както е показано в долния код,
cor = corr2 (NewTemplates {1, n}, щракване);
След това командата 'find ()' се използва за намиране на индекса, който съответства на най-добре съвпадащия знак. След това според този индекс се отпечатва съответният знак, като се използва операторът „if-else“ .
Сега, след като завършите с това, отворете нов прозорец на редактора, за да стартирате кода за основната програма.
Откриване на регистрационния номер
Ето третия и последен кодов файл, наречен Plate_detection.m, копирайте и поставете долния код в този файл и го запазете в папката на проекта. За бърз старт можете да изтеглите всички кодови файлове с шаблони за изображения от тук.
затвори всички; изчисти всичко; im = imread ('Изображения на номерния номер / image1.png'); imgray = rgb2gray (im); imbin = imbinarize (imgray); 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 () - Тази команда се използва за откриване на ръбовете в изображението, като се използват различни методи като Roberts, Sobel, Prewitt и много други.
regionprops () - Тази команда се използва за измерване на свойствата на областта на изображението.
numel () - Тази команда се използва за изчисляване на броя на елементите на масива.
imcrop () - Тази команда се използва за изрязване на изображението във въведения размер.
bwareaopen () - Тази команда се използва за премахване на малки обекти от двоично изображение.
Използвайки горните команди в кода, ние извикваме входното изображение и го преобразуваме в сивата скала. След това скалата на сивото се преобразува в двоично изображение и ръбът на двоичните изображения се открива чрез метода Prewitt.
Тогава кодът по-долу се използва за откриване на местоположението на регистрационния номер в цялото входно изображение, 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: преброяване ow = дължина (Iprops (i).Image (1,:)); о = дължина (Iprops (i).Image (:, 1)); ако ow <(h / 2) & oh> (h / 3) буква = Letter_detection (Iprops (i).Image); noPlate = краен край
Работа на системата за откриване на номера на регистрационния номер на превозното средство с помощта на MATLAB
Във файла template_creation.m имаме дизайн на кода, за да запазим всички двоични изображения на буквено-цифрови символи в директория или файл, наречен „ NewTemplates “. Тогава тази директория се извиква в Letter_detection.m, както можете да видите по-долу
След това в кодовия файл Plate_detection.m се извиква кодовият файл Letter_detection.m, когато обработваме изображението, както е показано на изображението по-долу,
Сега кликнете върху бутона „RUN“, за да стартирате.m файла
MATLAB може да отнеме няколко секунди, за да отговори, изчакайте, докато се покаже съобщение заето в долния ляв ъгъл, както е показано по-долу,
При стартиране на програмата ще получите изскачащо изображение на номера на табелката и номера в командния прозорец. Резултатът за моето изображение ще изглежда като изображението, дадено по-долу;
Пълната работа на системата за откриване на регистрационния номер на автомобила е демонстрирана във видеото по-долу и всички кодови файлове с шаблони за изображения могат да бъдат изтеглени от тук.
Също така проверете всички проекти на MATLAB тук.