آموزش متلبتکنولوژی

تشخیص شماره پلاک خودرو با متلب و پردازش تصویر

سلام. آموزش تشخیص شماره پلاک خودرو با استفاده از MATLAB و پردازش تصویر را آماده کردیم.

پروژه تشخیص پلاک ماشین با پردازش تصویر و MATLAB

آیا تا به حال‌ کنجکاو بوده اید که یک سیستم ANPR (تشخیص خودکار پلاک توسط دوربین مدار بسته) چگونه کار می کند؟ اجازه دهید روش انجام کار آن را به شما بگویم، دوربین سیستم ANPR از پلاک خودرو عکس می گیرد و سپس تصویر توسط تعداد زیادی الگوریتم پردازش می شود تا تبديل تصویری عددی، به شکل متن پردازش شود. سیستم ANPR در مکان های زیادی استفاده می شود مانند پمپ بنزین ها، مراکز خرید، فرودگاه ها، بزرگراه ها، عوارضی ها، هتل ها، بیمارستان ها، پارکینگ ها، مکان های بازرسی نظامی و دفاعی و غیره.

ابزارهای پردازش تصویر بسیاری برای تشخیص شماره پلاک وجود دارد، اما اینجا در این آموزش، ما از پردازش تصویر متلب استفاده‌ خواهیم کرد تا شماره پلاک خودرو را در قالب متن به دست آوریم. اما اگر شما در استفاده از MATLAB یا پردازش تصویر تازه وارد و بی تجربه هستید، بنابراین پروژه های متلب قبلی ما را بررسی کنید :

اول، اجازه دهید به طور مختصر برای شما در مورد راه کاری که برای تشخیص پلاک خودرو استفاده می کنیم، توضيح دهیم. سه برنامه یا فایل های m. برای این پروژه وجود دارد.

  • . ایجاد الگوی معین (template _creation. m) – این مورد برای نام گذاری تصاویر عددی ذخیره شده استفاده می شود و سپس آنها را به عنوان یک الگوی جدید در حافظه MATLAB ذخیره می کند.
  • . تشخیص حروف (Letter_detection. m) – کاراکتر ها را بواسطه تصویر ورودی می خواند و بیشترین الفبای عددی مشابه به آن را پیدا می کند.
  • . تشخیص پلاک (plate_detection. m) – تصویر را پردازش کنید و سپس‌ برای تشخیص شماره‌ی دو فایل m بالا، آنها را نام گذاری کنید.

اکنون، در مورد نحوه رمزگذاری این فایل های m و آنچه باید قبل از شروع رمزگذاری انجام دهید، یاد خواهیم گرفت. پس از گذراندن این آموزش، می توانید تمام فایل های کد (code files) و فیلم آموزشی نحوه کار را در انتهای این پروژه دانلود کنید.

همچنین ببینید : آموزش کامل پروژه تشخیص پلاک خودرو ایرانی با متلب

ایجاد الگوی معین برای تشخیص پلاک

ابتدا یک پوشه برای پروژه برای ذخیره ی فایل ها ایجاد کنید (اسم پوشه ی من تشخیص شماره پلاک است). ما عکس های دودویی همه ی حروف و اعداد را در زیر پوشه ای به نام alpha ذخیره کرده ایم.

اکنون، پنجره ی ویرایشگر در 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('alpha/X.bmp');
Y=imread('alpha/Y.bmp');Z=imread('alpha/Z.bmp');

%Natural Numbers
one=imread('alpha/1.bmp');two=imread('alpha/2.bmp');
three=imread('alpha/3.bmp');four=imread('alpha/4.bmp');
five=imread('alpha/5.bmp'); six=imread('alpha/6.bmp');
seven=imread('alpha/7.bmp');eight=imread('alpha/8.bmp');
nine=imread('alpha/9.bmp'); zero=imread('alpha/0.bmp');

%Creating Array for Alphabets
letter=[A B C D E F G H I J K L M N O P Q R S T U V W X Y Z];

%Creating Array for Numbers
number=[one two three four five six seven eight nine zero];

NewTemplates=[letter number];
save ('NewTemplates','NewTemplates')
clear all

آموزش کامل تشخیص پلاک با متلب

در اینجا ، در کد بالا با استفاده از دستور “Imread ()”  ، تصاویر را در یک متغیر ذخیره می کنیم. این عملکرد برای فراخوانی تصاویر از پوشه یا هر مکان کامپیوتر به MATLAB استفاده می شود. بیایید در مورد کد بالا مثالی بزنیم :

A=imread('alpha/A.bmp');

در اینجا A متغیر است ، و در “alpha / A.bmp” ،عبارت “alpha” نام پوشه و “A.bmp” نام پرونده است.

سپس یک ماتریس “حروف” و “عدد” را به وجود بیاورید و آن را با استفاده از فرمان ‘save(filename,variables)’ در متغیرِ ‘NewTemplates’ ذخیره کنید.

%Creating Array for Alphabets
letter=[A B C D E F G H I J K L M N O P Q R S T U V W X Y Z];

%Creating Array for Numbers
number=[one two three four five six seven eight nine zero];

NewTemplates=[letter number];
save ('NewTemplates','NewTemplates')
clear all

اکنون کدگذاری Letter_detection.m را در یک پنجره ویرایشگر جدید شروع کنید.

اگر در مورد این مطلب سوالی دارید در قسمت نظرات بپرسید

تشخیص حروف در پلاک

در اینجا،فایل کد دوم را با نام Letter_detection.m ایجاد میکنیم و کد زیر را در آن کپی و جایگذاری کرده و فایل را در پوشه ای به نام Letter_detection ذخیره می کنیم. فایلهای فشرده ضمیمه شده حاوی فایل های دیگری هستند که مربوط به پروژه تشخیص شماره پلاک است.

function letter=readLetter(snap)

load NewTemplates
snap=imresize(snap,[42 24]);
rec=[ ];

for n=1:length(NewTemplates)
    cor=corr2(NewTemplates{1,n},snap);
    rec=[rec cor];
end

ind=find(rec==max(rec));
display(find(rec==max(rec)));

% Alphabets listings.
if 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='T';
elseif ind==28
    letter='U';
elseif ind==29
    letter='V';
elseif ind==30
    letter='W';
elseif ind==31
    letter='X';
elseif ind==32
    letter='Y';
elseif ind==33
    letter='Z';
 %*-*-*-*-*% Numerals listings.
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';
else
    letter='0';
end
end

در کد بالا، تابعی را با نام Letter ایجاد کرده ایم که با استفاده از دستور readLetter () ،الفبای خروجی تصویر ورودی از رده “alpha” را به ما می دهد و سپس الگوهای ذخیره شده را با استفاده از فرمان NewTemplates دانلود میکنیم.

پس از آن ، اندازه تصویر ورودی را با استفاده از فرمان imresize(filename,size) تغییر می دهیم ‘ تا بتوان آن را با تصاویر الگوها مقایسه کرد.  سپس حلقه های for، برای قرینه سازی تصاویر ورودی با تصویر الگوها ، استفاده میشود تا بهترین تطبیق صورت بگیرد.

یک ضبط ماتریس برای ثبت مقدار همبستگی هر الگوی الفبایی با الگوی کاراکترها از تصویر ورودی، ایجاد شده است ، همانطور که در کد زیر نشان داده شده است :

cor=corr2(NewTemplates{1,n},snap);

سپس فرمان find () برای یافتن فهرست که با بالاترین کاراکتر تطبیق یافته سازگار است ، استفاده می شود و با توجه به آن فهرست ، کاراکتر تطبیق یافته با استفاده از عبارت if-other چاپ می شود.

اکنون پس از اتمام این کار ، یک پنجره ویرایشگر جدید، برای شروع کد برنامه اصلی باز کنید.

تشخیص شماره های پلاک

در اینجا این سومین و آخرین فایل کد است که  plate_detection.m نام گذاری شده است. کد زیر را کپی کنید و در این فایل جایگذاری کنید.

close all;
clear all;

im = imread(' Number Plate Images/ image1.png');
imgray = rgb2gray(im);
imbin = imbinarize(imgray);
im = edge(imgray, 'prewitt');

%Below steps are to find location of number plate
Iprops=regionprops(im,'BoundingBox','Area', 'Image');
area = Iprops.Area;
count = numel(Iprops);
maxa= area;
boundingBox = Iprops.BoundingBox;
for i=1:count
   if maxa<Iprops(i).Area
       maxa=Iprops(i).Area;
      ​ boundingBox=Iprops(i).BoundingBox;
   end
end   

im = imcrop(imbin, boundingBox);
im = bwareaopen(~im, 500);
 [h, w] = size(im);

imshow(im);

Iprops=regionprops(im,'BoundingBox','Area', 'Image');
count = numel(Iprops);
noPlate=[];
for i=1:count
   ow = length(Iprops(i).Image(1,:));
   oh = length(Iprops(i).Image(:,1));
   if ow<(h/2) & oh>(h/3)
       letter=Letter_detection(Iprops(i).Image);
       noPlate=[noPlate letter]
   end
end

فرمان های اصلی مورد استفاده در کد بالا، در پایین نام برده شده است:

  • imread() : این فرمان برای باز کردن تصویر در MATLAB به واسطه پوشه هدف، استفاده می شود.
  • rgb2gray() : از این فرمان برای تبدیل تصویر RGB به فرمت سیاه سفید استفاده می شود.
  • imbinarize() : این فرمان برای دودویی کردن تصویر grayscale استفاده شده است یا در واقع می توان گفت که این تصویر را به فرمت سفید و سیاه تبدیل می کند.
  • edge() : این فرمان برای تشخیص لبه های موجود در تصویر ، با استفاده از روش های مختلفی مانند Roberts، sobel ، prewitt و بسیاری دیگر استفاده می شود.
  • regionprops() : این فرمان برای اندازه گیری مشخصات ناحیه تصویر استفاده می شود.
  • numel() : این فرمان برای محاسبه تعداد عناصر آرایه استفاده می شود.
  • imcrop() : از این فرمان برای برش تصویر در اندازه وارد شده استفاده می شود.
  • bwareaopen() : این فرمان برای حذف اشیاء کوچک از تصویر باینری استفاده می شود.

با استفاده از فرمان های بالا در کد، ما داریم تصویر خروجی را نام گذاری میکنیم و آن را به سیاه سفید تبدیل می کنیم. سپس عکس سیاه سفید به تصویر دودویی تبدیل می شود و لبه ی تصویر باینری بوسیله ی روش Prewitt تشخیص داده می شود.

سپس از کد زیر برای تشخیص محل شماره پلاک در کل تصویر ورودی استفاده می شود ،

Iprops=regionprops(im,'BoundingBox','Area', 'Image');
area = Iprops.Area;
count = numel(Iprops);
maxa= area;
boundingBox = Iprops.BoundingBox;
for i=1:count
   if maxa<Iprops(i).Area
       maxa=Iprops(i).Area;
       boundingBox=Iprops(i).BoundingBox;
   end
end   

بعد از آن که شماره پلاک را برش دادید ، با استفاده از فرمان “imcrop ()” و “bwareaopen ()” اشیاء کوچک را از تصور جدا کنید.

سپس از کد زیر برای پردازش تصویر پلاک برش داده شده و نمایش عدد شناسایی شده در قالب تصویر و متن (در پنجره فرمان) استفاده می شود.

Iprops=regionprops(im,'BoundingBox','Area', 'Image');
count = numel(Iprops);
noPlate=[];

for i=1:count
   ow = length(Iprops(i).Image(1,:));
   oh = length(Iprops(i).Image(:,1));
   if ow<(h/2) & oh>(h/3)
       letter=Letter_detection(Iprops(i).Image);
       noPlate=[noPlate letter]
   end
end

نحوه کار تشخیص شماره پلاک خودرو با استفاده از متلب

در فایل template_creation.m ما این کد را طراحی کرده ایم تا تمام تصاویر باینری (دودویی) الفبایی را در یک فهرست یا فایل با نام “NewTemplates” ذخیره کنیم. سپس آن فهرست Letter_detection.m خوانده می شود، همانطور که می توانید در زیر ببینید.

تشخیص شماره پلاک خودرو با استفاده از متلب

سپس در کد فایل Plate_detection.m ، زمانی که ما تصویر را همانطور که در تصویر زیر نشان داده شده، پردازش می کنیم، کد فایل Letter_detection.m نامیده میشود.

تشخیص شماره های پلاک

اکنون بر روی دکمه ی RUN برای اجرای فایل m. کلیک کنید.

ممکن است MATLAB برای پاسخگویی چند لحظه زمان ببرد، تا زمانی که پیام Busy را پایین گوشه ی چپ ، همانطور که در تصویر زیر نشان داده شده نشان بدهد، صبر کنید.

معنی پیام Busy در متلب

هنگامی که برنامه شروع می شود، شما پنجره ی شماره ی صفحه ی تصویر و شماره ی موجود در پنجره ی فرمان را دریافت می کنید. خروجی برای تصویر من ممکن است شبیه تصویر داده شده در زیر باشد :

خروجی نهایی تشخیص پلاک با متلب

کار کامل سیستم شناسایی شماره پلاک خودرو در فیلم زیر نشان داده شده است و برای دانلود تمامی فایل های کد با الگوهای تصاویر کلیک کنید.

5 (4 نفر)

برای دریافت مطالب جدید کانال تلگرام یا پیج اینستاگرام ما را دنبال کنید.

محمد رحیمی

محمد رحیمی هستم. سعی میکنم در آیرنکس مطالب مفید قرار بدهم. سوالات مربوط به این مطلب را در قسمت نظرات همین مطلب اعلام کنید. سعی میکنم در اسرع وقت به نظرات شما پاسخ بدهم.

1 دیدگاه

  1. سلام
    من متلب ۲۰۱۹ دارم و کدی شبیه به این را دارم چه طور فایل .mat را بخوانم؟ چه طور متغیر در قسمت letter detection تعریف کنم که خطا ( ;sem=corr2(templates{1,n},imagn ندهد؟

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *