- Veidņu izveide
- Burtu noteikšana
- Numura plāksnes noteikšana
- Transportlīdzekļa numura zīmes numura noteikšanas sistēmas darbība, izmantojot MATLAB
Vai esat kādreiz domājuši, kā darbojas ANPR (automātiskā numura zīmes atpazīšanas) sistēma? Ļaujiet man pastāstīt, kāds ir tā jēdziens: ANPR sistēmas kamera uztver transportlīdzekļa numura zīmes attēlu, un pēc tam attēls tiek apstrādāts ar vairākiem algoritmiem, lai nodrošinātu attēla burtciparu pārveidošanu teksta formātā. ANPR sistēmu izmanto daudzās vietās, piemēram, benzīna sūkņos, tirdzniecības centros, lidostās, šosejās, maksas nodaļās, viesnīcās, slimnīcās, autostāvvietās, aizsardzības un militārajos kontrolpunktos utt.
Šai numura zīmes noteikšanai ir pieejami daudzi attēlu apstrādes rīki, taču šeit, šajā apmācībā, mēs izmantosim MATLAB attēlu apstrādi, lai iegūtu transportlīdzekļa numura zīmes numuru teksta formātā. Ja esat jauns MATLAB vai attēlu apstrādes lietotājs, pārbaudiet mūsu iepriekšējos MATLAB projektus:
- Darba sākšana ar MATLAB: ātrs ievads
- Darba sākšana ar attēlu apstrādi, izmantojot MATLAB
Pirmkārt, ļaujiet man īsi pastāstīt par koncepciju, kuru izmantojam numura zīmju noteikšanai. Šim projektam ir trīs programmas vai.m faili.
- Veidņu izveide ( template_creation.m ) - to izmanto, lai izsauktu saglabātos burtciparu attēlus un pēc tam tos saglabātu kā jaunu veidni MATLAB atmiņā.
- Burtu noteikšana ( Letter_detection.m ) - nolasa rakstzīmes no ievades attēla un atrod atbilstošāko atbilstošāko burtciparu skaitli .
- Plate Detection ( Plate_detection.m ) - apstrādājiet attēlu un pēc tam izsauciet iepriekš minētos divus m failus, lai noteiktu numuru.
Tagad mēs uzzināsim, kā kodēt šos m-failus un kas jums jādara, pirms sākat kodēšanu. Pēc šīs apmācības iziešanas šī projekta beigās varat atrast visus kodu failus un darba skaidrojuma video.
Veidņu izveide
Vispirms izveidojiet mapi projektam (manas mapes nosaukums ir numurzīmju noteikšana ), lai saglabātu un saglabātu failus. Visu alfabētu un ciparu bināros attēlus esam saglabājuši apakšmapē ar nosaukumu “ alfa” .
Tagad MATLAB atveriet redaktora logu, kā parādīts zemāk esošajā attēlā,
Ja neesat pazīstams ar MATLAB pamata terminoloģiju, iesaku pārbaudīt saistīto apmācību.
Tagad nokopējiet un ielīmējiet zemāk esošo kodu template_creation.m failā un saglabājiet failu projekta mapē ( Number Plate Detection ). Visus ar šo projektu saistītos failus, ieskaitot attēlu veidņu failus, var lejupielādēt šeit. Arī pārbaudīt video doto beigās šo projektu.
% Alfabētu A = nelasīts ('alfa / A.bmp'); B = nelasīts ('alfa / B.bmp'); C = nelasīts ('alfa / C.bmp'); D = nelasīts ('alfa / D.bmp'); E = nelasīts ('alfa / E.bmp'); F = nelasīts ('alfa / F.bmp'); G = nelasīts ('alfa / G.bmp'); H = nelasīts ('alfa / H.bmp'); I = nelasīts ('alfa / I.bmp'); J = nelasīts ('alfa / J.bmp'); K = nelasīts ('alfa / K.bmp'); L = nelasīts ('alfa / L.bmp'); M = nelasīts ('alfa / M.bmp'); N = nelasīts ('alfa / N.bmp'); O = nelasīts ('alfa / O.bmp'); P = nelasīts ('alfa / P.bmp'); Q = nelasīts ('alfa / Q.bmp'); R = nelasīts ('alfa / R.bmp'); S = nelasīts ('alfa / S.bmp'); T = nelasīts ('alfa / T.bmp'); U = nelasīts ('alfa / U.bmp'); V = nelasīts ('alfa / V.bmp'); W = nelasīts ('alfa / W.bmp'); X = nelasīts ('alfa / X.bmp '); Y = nelasīts ('alfa / Y.bmp'); Z = nelasīts ('alfa / Z.bmp'); % Dabiskie skaitļi viens = nelasīts ('alfa / 1.bmp'); divi = nelasīts ('alfa / 2.bmp'); trīs = nelasīts ('alfa / 3.bmp'); četri = nelasīts ('alfa / 4.bmp'); pieci = nelasīti ('alfa / 5.bmp'); seši = nelasīti ('alfa / 6.bmp'); septiņi = nelasīti ('alfa / 7.bmp'); astoņi = nelasīti ('alfa / 8.bmp'); deviņi = nelasīti ('alfa / 9.bmp'); nulle = nelasīts ('alfa / 0.bmp'); % Masīva izveide alfabētiem burts =; % Masīva izveide numuriem =; NewTemplates =; save ('NewTemplates', 'NewTemplates') notīra visus
Šeit, iepriekš minētajā kodā, mēs saglabājam attēlus mainīgajā, izmantojot komandu ' imread () '. Šo funkciju izmanto, lai attēlus no mapes vai no jebkuras datora atrašanās vietas izsauktu MATLAB. Ņemsim piemēru no iepriekš minētā koda:
A = nelasīts ('alfa / A.bmp');
Kur A ir mainīgais un “ alfa / A.bmp” , “alfa” ir mapes nosaukums un “ A.bmp” ir faila nosaukums.
Pēc tam izveidojiet matricu ar burtu un skaitli un saglabājiet to mainīgajā “ NewTemplates ”, izmantojot komandu “ save (faila nosaukums, mainīgie)” .
% Masīva izveide alfabētiem burts =; % Masīva izveide numuriem =; NewTemplates =; save ('NewTemplates', 'NewTemplates') notīra visus
Tagad sāciet kodēt Letter_detection.m jaunā redaktora logā.
Burtu noteikšana
Šeit mēs izveidojam otro koda failu ar nosaukumu Letter_detection.m . Tagad nokopējiet un ielīmējiet zemāk esošo kodu šajā failā un saglabājiet failu projekta mapē ar nosaukumu Letter_detection. Šo failu var lejupielādēt šeit, šajā pievienotajā zip failā ir arī citi faili, kas saistīti ar šo numura zīmes noteikšanas projektu.
funkciju burts = readLetter (snap) slodze NewTemplates snap = imresize (snap,); rec =; par n = 1: garums (NewTemplates) cor = corr2 (NewTemplates {1, n}, snap); rec =; beigu ind = atrast (rec == max (rec)); displejs (atrast (rec == max (rec))); % Alfabētu saraksti. ja ind == 1 - ind == 2 burts = 'A'; elseif ind == 3 - ind == 4 burts = 'B'; elseif ind == 5 burts = 'C' elseif ind == 6 - ind == 7 burts = 'D'; elseif ind == 8 burts = 'E'; elseif ind == 9 burts = 'F'; elseif ind == 10 burti = 'G'; elseif ind == 11 burts = 'H'; elseif ind == 12 burti = 'I'; elseif ind == 13 burts = 'J'; elseif ind == 14 burts = 'K'; elseif ind == 15 burts = 'L'; elseif ind == 16 burts = 'M'; elseif ind == 17 burts = 'N'; elseif ind == 18 - ind == 19 burts = 'O'; elseif ind == 20 - ind == 21 burts = 'P'; elseif ind == 22 - ind == 23 burts = 'Q'; elseif ind == 24 - ind == 25 burts = 'R'; elseif ind == 26 burts = 'S'; elseif ind == 27 burts = 'T'; elseif ind == 28 burts = 'U'; elseif ind == 29 burts = 'V'; elseif ind == 30 burti = 'W'; elseif ind == 31 burts = 'X'; elseif ind == 32 burts = 'Y'; elseif ind == 33 burts = 'Z'; % * - * - * - * - * % cipari saraksti. elseif ind == 34 burts = '1'; elseif ind == 35 burts = '2'; elseif ind == 36 burts = '3'; elseif ind == 37 - ind == 38 burts = '4'; elseif ind == 39 burts = '5'; elseif ind == 40 - ind == 41 - ind == 42 burts = '6'; elseif ind == 43 burts = '7'; elseif ind == 44 - ind == 45 burts = '8'; elseif ind == 46 - ind == 47 - ind == 48 burts = '9'; cits burts = '0'; beigas beigas
Šeit, iepriekš minētajā kodā, mēs esam izveidojuši funkciju ar nosaukumu burts, kas dod mums burtu un ciparu ievades attēla izvadi no klases ' alfa ', izmantojot komandu ' readLetter ()' . Pēc tam ielādējiet saglabātās veidnes, izmantojot komandu load 'NewTemplates .
Pēc tam mēs esam mainījuši ievades attēla izmēru, lai to varētu salīdzināt ar veidnes attēliem, izmantojot komandu 'imresize (faila nosaukums, izmērs)' . Tad , lai cilpa tiek izmantots, lai korelē ievades attēlu ar katru attēlu veidnē, lai iegūtu labāko maču.
Tiek izveidota matrica “ rec ”, lai reģistrētu katras burtciparu veidnes korelācijas vērtību ar ievades attēla rakstzīmju veidni, kā parādīts zemāk esošajā kodā.
cor = corr2 (NewTemplates {1, n}, snap);
Pēc tam komandu 'atrast ()' izmanto, lai atrastu indeksu, kas atbilst visatbilstošākajam rakstzīmei. Tad saskaņā ar šo indeksu atbilstošā rakstzīme tiek izdrukāta, izmantojot “if-else” priekšrakstu.
Pēc tam, kad esat pabeidzis šo darbību, atveriet jaunu redaktora logu, lai sāktu galvenās programmas kodu.
Numura plāksnes noteikšana
Šis ir trešais un pēdējais koda fails ar nosaukumu Plate_detection.m nokopējiet un ielīmējiet zemāk esošo kodu šajā failā un saglabājiet projekta mapē. Lai ātri sāktu, šeit varat lejupielādēt visus kodu failus ar attēlu veidnēm.
aizvērt visus; nodzēst visu; im = imread ('Numura zīmes attēli / image1.png'); imgray = rgb2gray (im); imbin = imbinarize (imgray); im = mala (imgray, 'prewitt'); % Zemāk norādītajām darbībām jāatrod numura zīmes atrašanās vieta Iprops = regionprops (im, 'BoundingBox', 'Area', 'Image'); apgabals = Iprops.Area; skaits = numels (Iprops); maxa = platība; boundingBox = Iprops.BoundingBox; i = 1: skaitīt, ja maks
Zemāk ir minētas pamata komandas, kas tiek izmantotas iepriekš minētajā kodā:
imread () - šo komandu izmanto, lai attēlu atvērtu MATLAB no mērķa mapes.
rgb2gray () - šo komandu izmanto, lai pārveidotu RGB attēlu pelēktoņu formātā.
imbinarize () - Šī komanda tiek izmantota, lai 2-D pelēktoņu attēlus binarizētu, vai vienkārši mēs varam teikt, ka tas pārveido attēlu melnbaltā formātā.
mala () - šo komandu izmanto attēla malu noteikšanai, izmantojot dažādas metodes, piemēram, Robertsu, Sobelu, Pruitu un daudzas citas.
regionprops () - šo komandu izmanto, lai izmērītu attēla reģiona īpašības.
numel () - šo komandu izmanto, lai aprēķinātu masīva elementu skaitu.
imcrop () - šo komandu izmanto, lai apgrieztu attēlu ievadītajā lielumā.
bwareaopen () - šo komandu izmanto, lai no binārā attēla noņemtu mazus objektus.
Izmantojot kodā iepriekš minētās komandas, mēs izsaucam ievades attēlu un pārvēršam to pelēktoņos. Tad pelēktoņi tiek pārvērsti binārā attēlā, un bināro attēlu malu nosaka ar Prewitt metodi.
Tad zemāk redzamais kods tiek izmantots, lai noteiktu numura zīmes atrašanās vietu visā ievades attēlā, Iprops = regionprops (im, 'BoundingBox', 'Area', 'Image'); apgabals = Iprops.Area; skaits = numels (Iprops); maxa = platība; boundingBox = Iprops.BoundingBox; i = 1: skaitīt, ja maks
Pēc tam apgrieziet numurzīmi un noņemiet mazos objektus no binārā attēla, izmantojot attiecīgi komandas 'imcrop ()' un 'bwareaopen ()' .
Pēc tam zemāk redzamais kods tiek izmantots, lai apstrādātu apgriezto numura zīmes attēlu un parādīto numuru parādītu attēla un teksta formātā (komandu logā).
Iprops = regionprops (im, 'BoundingBox', 'Area', 'Image'); skaits = numels (Iprops); noPlate =; i = 1: skaita ow = garums (Iprops (i). Attēls (1,:)); oh = garums (Iprops (i). Attēls (:, 1)); if ow <(h / 2) & oh> (h / 3) burts = Burtu_atklāšana (Iprops (i). Attēls); noPlate = beigu beigas
Transportlīdzekļa numura zīmes numura noteikšanas sistēmas darbība, izmantojot MATLAB
Jo template_creation.m lietas mums ir izstrādāt kodu, lai saglabātu visus binārā attēlus alphanumerics uz direktoriju vai failu ar nosaukumu kā " NewTemplates ". Tad šo direktoriju izsauc Letter_detection.m, kā redzat zemāk
Pēc tam koda failā Plate_detection.m koda fails Letter_detection.m tiek izsaukts, kad mēs apstrādājam attēlu, kā parādīts zemāk esošajā attēlā,
Tagad noklikšķiniet uz pogas RUN, lai palaistu.m failu
MATLAB var paiet dažas sekundes, lai atbildētu, pagaidiet, līdz apakšējā kreisajā stūrī tiek parādīts aizņemts ziņojums, kā parādīts zemāk,
Sākot programmu, jūs saņemsiet numurzīmes attēla uznirstošo logu un numuru komandu logā. Mana attēla izvade izskatīsies kā zemāk sniegtais attēls;
Pilnīga transportlīdzekļa licences numura zīmes noteikšanas sistēmas darbība ir parādīta zemāk esošajā video, un visus kodu failus ar attēlu veidnēm var lejupielādēt šeit.
Šeit pārbaudiet arī visus MATLAB projektus.