您是否曾经想过ANPR(自动车牌识别)系统是如何工作的?让我告诉您其背后的概念:ANPR系统的摄像头捕获车辆牌照的图像,然后通过多种算法对图像进行处理,以将图像进行字母数字转换为文本格式。ANPR系统在许多地方使用,例如加油站,购物中心,机场,高速公路,收费站,酒店,医院,停车场,国防和军事检查站等。
有许多图像处理工具可用于此车牌检测,但在本教程中,我们将使用MATLAB图像处理将车牌号转换为文本格式。如果您不熟悉MATLAB或图像处理,请检查我们以前的MATLAB项目:
- MATLAB入门:快速入门
- 使用MATLAB进行图像处理入门
首先,让我简要介绍一下我们用于检测车牌的概念。此项目有三个程序或“.m”文件。
- 模板创建( template_creation.m )–用于调用已保存的字母数字图像,然后将其另存为MATLAB存储器中的新模板。
- 字母检测( Letter_detection.m ) –从输入图像中读取字符,并找到匹配度最高的对应字母数字。
- 印 版检测( Plate_detection.m ) –处理图像,然后调用上面的两个m文件来检测编号。
现在,我们将学习如何编码这些m文件以及开始编码之前必须要做的事情。阅读完本教程之后,您可以在该项目的末尾找到所有代码文件和工作说明视频。
模板制作
首先为项目创建一个文件夹(我的文件夹名称为 Number Plate Detection )以保存和存储文件。我们已经将所有字母和数字的二进制图像存储在名为' alpha' 的子文件夹中。
现在,在MATLAB中打开“编辑器”窗口,如下图所示,
如果您不熟悉MATLAB的基本术语,建议您检查链接的教程。
现在,将以下代码复制并粘贴到 template_creation.m 文件中,并将该文件保存在项目文件夹中( Number Plate Detection )。可以从此处下载与此项目相关的所有文件,包括图像模板文件。另外,请查看该项目结尾处提供的视频。
%字母 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'); %自然数 one = 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'); nine = imread('alpha / 9.bmp'); 零= imread('alpha / 0.bmp'); %为字母创建数组 letter =; %为数字创建数组 number =; NewTemplates =; 保存(“ NewTemplates”,“ NewTemplates”) 清除所有
在这里,在上面的代码中,我们通过使用命令' imread() '将图像保存到变量中。此功能用于从文件夹或PC的任何位置将图像调用到MATLAB中。让我们以上面的代码为例:
A = imread('alpha / A.bmp');
其中A是变量,在' alpha / A.bmp'中 , 'alpha' 是文件夹名称,而' A.bmp' 是文件名称。
然后创建一个“ 字母 ”和“ 数字 ”矩阵,并使用命令“ save(filename,variables)” 将其保存在变量“ NewTemplates ”中 。
%为字母创建数组 letter =; %为数字创建数组 number =; NewTemplates =; 保存(“ NewTemplates”,“ NewTemplates”) 清除所有
现在,在新的编辑器窗口中开始对 Letter_detection.m进行 编码。
信件检测
在这里,我们创建第二个代码文件,名为 Letter_detection.m 。现在,将以下代码复制并粘贴到该文件中,并将该文件保存在项目文件夹中,名称为 Letter_detection。 可以从这里下载此文件,此附加的zip文件还包含与此车牌检测项目有关的其他文件。
函数letter = readLetter(snap) 加载NewTemplates snap = imresize(snap,); rec =; 对于n = 1:length(NewTemplates) cor = corr2(NewTemplates {1,n},snap); rec =; 结束 ind = find(rec == max(rec)); display(find(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 letter ='E'; elseif ind == 9 字母='F'; elseif ind == 10 字母='G'; elseif ind == 11 字母='H'; elseif ind == 12 letter ='I'; elseif ind == 13 字母='J'; elseif ind == 14 字母='K'; elseif ind == 15 letter ='L'; elseif ind == 16 字母='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 字母='Y'; elseif ind == 33 letter ='Z'; %* - * - * - * - * %数词上市。 elseif ind == 34 字母='1'; elseif ind == 35 letter ='2'; elseif ind == 36 字母='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 字母='7'; elseif ind == 44-ind == 45 letter ='8'; elseif ind == 46-ind == 47-ind == 48 letter ='9'; 否则 letter ='0'; 年底 结束
此处,在上面的代码中,我们创建了一个名为 letter 的函数,该函数通过使用命令' readLetter()' 为类' alpha '提供输入图像的字母数字输出。然后使用命令 load'NewTemplates 加载保存的模板。
之后,我们调整了输入图像的大小,以便可以通过使用命令 'imresize(filename,size)' 将其与模板图像进行比较。然后使用 for 循环将输入图像与模板中的每个图像相关联,以获得最佳匹配。
创建一个矩阵“ rec ”来记录每个字母数字模板与输入图像中字符模板的相关值,如下面的代码所示,
cor = corr2(NewTemplates {1,n},snap);
然后,使用 “ find()” 命令查找与最高匹配字符相对应的索引。然后根据该索引,使用 'if-else' 语句打印相应的字符。
现在,完成此操作后,打开一个新的编辑器窗口以启动主程序的代码。
车牌检测
这是名为 Plate_detection.m 的第三个也是最后一个代码文件 ,将以下代码复制并粘贴到该文件中,然后保存到项目文件夹中。为了快速入门,您可以从此处下载带有图像模板的所有代码文件。
关闭所有; 清除所有 im = imread('车牌图像/ image1.png'); imgray = rgb2gray(im); imbin = imbinarize(imgray); im = edge(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() –此命令用于对二维灰度图像进行二值化,或者简单地说,它可以将图像转换为黑白格式。
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:计数 =长度(Iprops(i).Image(1,:)); 哦=长度(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项目。