基于ios的车牌识别系统的设计与实现本科论文.docx
- 文档编号:12720548
- 上传时间:2023-04-21
- 格式:DOCX
- 页数:24
- 大小:417.90KB
基于ios的车牌识别系统的设计与实现本科论文.docx
《基于ios的车牌识别系统的设计与实现本科论文.docx》由会员分享,可在线阅读,更多相关《基于ios的车牌识别系统的设计与实现本科论文.docx(24页珍藏版)》请在冰豆网上搜索。
基于ios的车牌识别系统的设计与实现本科论文
d3ihou____________________________________________________________________________________________山西大学论文编号:
论文题目基于iOS的车牌识别系统的设计与实现
姓名
院系、专业计算机与信息技术学院、软件工程
学习年限2011年9月至2015年7月
指导教师
学位级别学士
2015年4月8日
基于iOS的车牌识别系统的设计与实现
指导教师:
学生姓名:
内容摘要本毕设基于iOS平台实现了移动手机上的车牌识别,可以通过相机或者相册选取图像,将图像中的车牌识别并以文本的形式输出。
系统主要使用了开源计算机视觉库OpenCV和SVM等机器学习算法,完成了车牌的定位检测,字符的分割识别等步骤,最终实现了车牌识别。
本系统可用于交警在不良条件下执法,亦可以用于私家车车主,方便车主在事故现场取证报警。
关键字iOS;OpenCV;车牌识别
1、引言
1.1国内外现状
模式识别(PatternRecognition)技术于二十世纪八十年代开始迅速发展,基于这一技术的相关应用也迅速被人们付诸于实践,如人脸识别、指纹识别等,这其中也包括了车牌识别(LicensePlateRecognition)技术。
在车牌识别方面,国外的研究要早于国内,且技术相对成熟。
二十世纪九十年代,A.S.Johnson等人通过字符的模版匹配技术设计并实现了一种车牌识别系统,与此同时,R.A.Lotufo等采用自适应阈值,边界跟踪,垂直投影,统计最近邻分类器等方法也实现了一种车牌识别系统[6]。
在市场产品化方面,国外也有许多优秀的产品得到推广,如HTS公司的SeeCar车牌识别(LPR/ANPR)系统可在高速公路实现车牌的实时识别。
以色列的See/CarSystem和Insignia系统,新加坡的VLPRS、澳大利亚Auty公司的Safe--Cam系统、俄罗斯的GoldenEaglej等产品也在其本国有着很好的应用。
我国对车牌识别技术的研究要晚于西方发达国家,而且我国车牌构成复杂,既有汉字,又有字母和阿拉伯数字,而且车牌还分不同的类别,类别不同车牌的规格颜色也不尽相同,这都给车牌识别带来了一定难度,国外的车牌识别技术也并不适用于我国。
因此,我国有许多高校和学者从事此方面的研究,国内最早的车牌识别产品有北京汉王科技公司智能交通部门的“汉王眼”车牌识别系统和四川川大智胜软件公司的基于“车牌识别”的智能交通应用系统[6]。
目前,市场上有很多成熟的以车牌识别为核心的产品,如基于DSP的嵌入式车牌识别、车牌识别停车场管理系统、超速抓拍举证系统等产品[6]。
但是由于车牌识别的准确率和获取的图像质量有很大关系,因此,大部分产品对使用环境有较高的要求。
随着智能移动终端的发展与普及,智能手机、平板电脑已经接管了人类的许多工作。
在计算机视觉处理方面,移动终端越来越高的硬件配置也让许多任务从专业平台或者传统计算转移到移动终端上来,并创造出了新的价值,这其中,最显著要数拥有3D画质的游戏的发展,如iOS平台上的《无尽之剑》。
车牌识别在移动终端上的应用则较晚,2011年Linnaeus大学的Ahmad成功将车牌识别系统在Android平台上实现,但是在车牌字符识别的过程中达到85%的识别率[8]。
在国内,华中科技大学的徐伟、张舟在武汉ETC(电子不停车收费)系统的稽查子系统中,成功将车牌识别移植到Android平台[8]。
但是,基于iOS平台的车牌识别系统至今还没有出现,有待人们去开发相关应用。
1.2选题的目的及意义
随着移动终端设备的迅速发展,与其相关的应用已经体现在了人们日常生活中的方方面面,人们可以使用随身携带的可移动设备做更多事情。
交通作为与人们生活息息相关的一个方面,与之相关的移动开发也是层出不穷,如基于地图导航的公交查询,线路查询,以及其向旅游方面衍生的周边服务类应用,还有车票(机票)查询与订购等等。
这些都极大的方便了人们的出行。
由于车牌是车辆的一种重要身份标记,车牌识别系统也自然成为了交通监管环节的核心,而且是交通系统的重要研究领域。
随着我国经济的腾飞与交通事业的发展,越来越多的人们拥有了私家车,出租车、专车、公交车等公共交通车辆数目也急剧增长,伴随而来的是越来越多的逃避年检,肇事逃逸等违法行为,此时传统的交通监控系统也就显现出了它的局限性。
例如,在2014,在新闻中屡次出现女青年乘车失踪,然后被害的案件。
导致这样的惨案发生,在一定程度上就是因为传统的交通监控系统无法在地域偏僻的地方及时给民警提供犯罪嫌疑人驾驶的车辆信息。
随着国家对智慧城市建设的推进,结合了物联网、云服务等技术的智能交通系统将会给人们提供更丰富的信息,更优的建议,更可靠的服务。
由此,车牌识别技术在移动终端上的实现也就有了更加广泛的应用。
交警可以利用手机或者平板电脑更加便捷地进行道路稽查,违法取证,普通民众可以对违法车辆给予及时的监督举报,车主也能方便的自己在手机上查询自己的违章信息。
基于以上所述,本系统将在iOS系统上设计并实现一套车牌识别系统。
2、关键技术
2.1OpenCV
OpenCV(OpenSourceComputerVisionLibrary),即“开源计算机视觉库”,由一系列C函数和C++类构成,涵盖了计算机视觉的诸多领域,如物体识别、图像分区、人脸识别、动作识别、运动跟踪、机器人等。
OpenCV的基本模块如下图所示:
图1OpenCV基本模块
2.2基于iOS平台的App开发
本系统基于iOS8.2实现,用于测试的移动端是iPhone6手机,CPU是A8+M8协处理器(64位),GPU是ImaginationPowerVRSGX6450,RAM为1GB,屏幕分辨率为1334*750,ppi是326,主摄像头拥有800万像素。
开发平台为Xcode6.2和iOS8SDK,iOS系统的架构可以分为四层,如下图所示:
图2iOS体系结构
iOS的主要开发语言为Objective-C,而OpenCV类库是以C++语言编写的,但是两种语言同样是基于C语言发展而来的面向对象语言,因此在Xcode开发平台上,用户在同一个源文件里进行C++和Objective-C的混合编程,因此我们就可以自由的在iOS程序中使用OpenCV类库。
3、目标检测与字符识别
本章首先介绍了手机拍摄车牌的特点,基于这些特点,本文采用了基于垂直边缘的车牌检测方法,然后,使用漫水填充法将包含车牌的区域进行提取分割,并利用已知车牌的尺寸比对分割区域车牌做出初步验证,得到候选车牌。
接着再使用SVM二分类方法对候选车牌进行挑选,最后使用人工神经网络的方法进行车牌字符的识别。
3.1预处理及垂直边缘特征提取
3.1.1手机拍摄车牌的特点
随着移动终端设备的快速发展,智能手机的中的数码相机功能不断完善,拍摄出图像质量也越来越高,并且通过算法与硬件的配合,手机拍照可以很好的优化普通摄像头拍照时会产生的白平衡,以及对比宽容度等问题。
以最新的iPhone6来说,即是主摄像头只有800万像素,但是在专业的测评网站上,其拍照效果,完全可以匹敌1300像素的Xshot。
除了这些iPhone6的拍摄特点外,一般智能手机拍摄的车牌还有以下特点:
(1)具有良好的移动性。
基于手持拍摄设备的特点,拍摄者可以选择一个拍摄效果相对较好的角度,这极大的方便了车牌识别工作。
(2)自带图片处理功能。
当我们在环境不理想的情况拍摄车牌照片时,可以通过手机相机中自带的曝光、对比度、色偏等调节功能来改善相片质量,并且还可以对图片方便的进行旋转、缩放等操作。
图3调节对比度图4旋转
3.1.2基于垂直边缘的图像特征提取
本文中,我们先对原始图像进行灰度化、以及5×5的高斯模糊去噪,来去除由拍摄或者环境影响产生的噪声,之后主要利用Sobel算子对去噪后的灰度图像进行垂直边缘检测。
Sobel算子不仅是一种梯度算子,并且还结合了高斯平滑。
Sobel算子的主要计算过程如下[16]:
设I为图像的矩阵表示。
(1)分别在x和y方向上求导。
水平变化:
将I与一个n×n大小的内核Gx进行卷积,其中n是奇数。
如,当n为3时:
Gx=×I
(1)
垂直变化:
与水平变化同理,当n为3时可以得到垂直变化:
Gy=×I
(2)
(2)对于图像上的每一个点,利用上述的水平与垂直变化来求出近似梯度:
G=(3)
表1边缘检测算法描述
输入
图像矩阵src
算法流程
用m,n分别代表输入矩阵src的行数与列数,设目标图像为dst,行数和列数从0开始。
从第一行第一列到第m-2行n-2列,用变量i,j遍历src中(m-2)×(n-2)的矩阵。
对于每个像素点(i,j),我们取以其为中心的3×3的矩阵,与垂直变化做矩阵的积,记为ux:
ux=src[i+1][j-1]*1+src[i+1][j]*2+src[i+1][j+1]*1+
src[i-1][j-1]*(-1)+src[i-1][j]*(-2)+src[i-1][j+1]*(-1)
然后,利用上述结果,求出该点梯度,存入目标图像,作为目标图像在该坐标点的像素值:
dst[i][j]=sqrt(ux*ux)
输出
目标图像dst
对图像进行过Sobel算子处理之后,再对其进行二值化处理,我们就得到了含有明显垂直边缘信息的图像,之后我们再对图像采用闭形态学的操作,消除垂直边缘的间的空白区域,并连接含有大量边的所有区域。
图5sobel处理图6二值化图7闭形态学处理
3.2基于漫水填充算法的车牌分割
经过上述步骤的处理,我们已经得到了一张含有车牌区域,但大部分区域都不含有车牌的图像。
接下来,我们通过获取这些二值图像中的轮廓来将这些区域分开,然后,对于每个轮廓,我们提取其最小外界矩形,并基于先验知识中车牌的宽高比对其做出初步验证。
经过初步验证的矩形就成为了我们的候选车牌区域,基于车牌背景为白色的这一特征,我们采用漫水填充算法来对这些区域进行分割。
漫水填充算法的主要原理是,创建一个种子类Seed,用来存放指定颜色的像素坐标信息,并用堆栈seeds存放入符合颜色要求的种子,用指针StackPoint来标记栈顶元素,对堆栈顶种子点周围所连接颜色一致的点进行判断,若符合颜色要求,,则将该点存入seeds中,原栈顶种子出栈,存入种子类型数组saveSeed中。
在操作过程中,我们x,y,pixel分别存放当前像素的坐标及像素值,用Getpixel(i,j)来获取图像位于(i,j)的像素值。
表3.1描述了漫水填充法在一张灰色图像上获得一个白色连通区域的一般算法。
表2漫水填充法标定描述
输入
灰色连通图像src
算法流程
//首先,申明种子堆栈、栈指针,种子存放数组,存放当前像素位置和像素值的变量
stack
intStackPoint;
vector
intx,y;
unsignedcharpixel;
//然后,我们开始遍历带有连通区域的灰色图像src,如果某点的像素值为255,即为白//色,我们将该像素点作为种子压入栈,并在存入其位置信息。
之后,我们随即检查种//子栈是否为空,若不为空,则取出栈顶元素,对其周围八个点做出判断
fori=0:
src.rows
forj=0:
src.cols
ifsrc.Getpixel(i,j)==255//寻找对白色像素点,并初始化种子
Seedseed(i,j);
seeds.push(seed);
StackPoint=1;
whileStackPoint>=1
//取出栈顶元素,存入临时变量,并将栈顶元素存入saveSeed
x=seeds[StackPoint].x;
y=seeds[StackPoint].y;
pixel=(unsignedchar)src.Getpixel(x,y);
saveSeed.push(seeds[StackPoint]);
seeds.pop;
//种子点周围八个方向的点可以看成一个3*3的矩阵,我们用两层循环
//来控制行和列,分别判断种子点八个方向的点,如果是白色,则压入//栈,因为种子点已经压入栈,在循环过程中忽略种子点
fork=x-1:
x+1
form=y-1:
y+1
if(k>=0&&k (k! =x&&m! =y) pixel=(unsignedchar)src.Getpixel(k,m); ifpixel=255 StackPoint++; seeds[StackPoint].x=k; seeds[StackPoint].y=m; end(if) end(if) end(form) end(fork) end(while) end(if) end(forj) end(fori) 输出 saveSeed 算法在本文中的操作步骤如下: (1)首先在矩形的中心选取确定一个中心点,并在该点附近产生几个随机种子。 然后利用车牌的宽和高得到车牌的最小尺寸,并使用它在块中心附近产生随机种子。 (2)当这几个随机种子至少有一个落在白色像素上时,对每个种子我们使用floodFill()函数绘制一个新的掩码来存储最新的最接近的分割区域,当该种子附近的像素点位于给定的范围时,我们在掩码中将其涂成白色。 (3)对每个获得的掩码,我们得到一个最小面积的矩形,对其进行尺寸验证,最后进行分割。 ab cd 图8(a)掩码一(b)掩码二(c)掩码三(d)掩码四 图9分割后得到的车牌 3.3基于SVM的车牌分类 SVM(SupportVectorMachine)即支持向量机算法,属于机器学习中的监督学习算法,算法通过一组带有标签的数据来进行训练。 SVM会构造一个或多个与分类数据间隔最大的超平面,通过超平面来将数据进行归类。 如下图4.1所示是SVM的二分类。 在图中,我们用黑点和白点分别表示两个类别,设训练样本T=,其中是样本的指标,是样本的标签。 H: w*x-b=0是分类线,若是在空间中即为一个超平面。 H1: w*x-b=1和H2: w*x-b=-1分别是黑点和白点集距离H最近,且平行于H的边界线。 H1和H2之间的界限: Margin=(4) 当Margin的值最大,且所有的样本点满足下列条件时,则称H为一个最优超平面,两类数据在H1和H2上的样本点称为支持向量。 (5) SVM除了可以进行二分类外,还可以进行多分类,其原理与二分类的方法类似,当我们分某一类时,只需要将剩下的n-1类看做一类即可。 图10SVM二分类 本系统中,首先使用通过预处理、边缘检测及漫水填充法对图像进行分割,得到75张车牌图像与25张非车牌图像,接着将图像数据存为XML文件,并以此作为SVM二分类算法的训练数据。 SVM二分类方法依此得到最佳分类线,当输入新的数据时,即可判断其是否为车牌。 3.4车牌字符的分割与识别 将候选车牌区域经SVM的分类判断,我们就可以筛选出了正确的车牌区域图像。 首先,对于获取的车牌图像,我们采用直方图均衡处理以及滤波函数锐化图像,以此来增加图像的对比度。 因为边缘检测是对白色边缘进行检测,所以接着我们通过阈值滤波器,将图像二值化,并将白色变为黑色,将黑色变为白色。 去除车牌边缘的噪声之后,查找白色的字符轮廓,并获取轮廓的最小外接矩形进行分割。 最后,对分割后的字符做出基于宽高比和像素占比的验证后,统一为修改为20×20的大小,保存到类向量CharSegment中。 ab cd 图11(a)高斯模糊后的车牌;(b)为锐化后的车牌;(c)为二值化后的车牌;(d)为去除边缘后的车牌 abcdefg 图12(a)~(g)为字符分割结果 在进行基于人工神经网络算法的字符识别之前,我们首先要对训练图形中所有的车牌图像做出上述分割处理,将所有分割出来的字符进行人工分类,然后提取字符的特征作为训练数据,以便用于人工神经网络的训练和分类。 在本文中,我们使用图像在水平或竖直方向上的累计直方图,以及低分辨图像样本作为字符特征[15]。 对于每个字符M,我们分别按行按列统计行或列中非零像素的个数,并将结果保存与行向量mhist中,然后让向量mhist中的元素除以mhist中的最大值来进行归一化。 最后,我们将字符M的行向量特征,列向量特征以及其分辨率图像特征都放到一个行向量中作为字符M的特征数据。 ANN(ArtificialNeuralNetwork,ANN)即人工神经网络算法,通过模拟生物神经网络结构,构建类似于神经元的节点作为基本的“处理单元”,数据在输入层输入,然后通过一层或多层隐藏层处理,最后由输出层输出。 整个过程类似于信息在生物神经系统上的传播,如下图所示为一个三层神经元感知器。 图13ANN算法 在人工神经网络的多层感知器(Multi-LayerPerceptron,MLP)中,每个神经元都有一个或者多个输入输出,用于连接上一层或下一层。 每个神经元将输入的值加上一个偏移项作为输出值,并由激励函数转换后传递给与之相连的下一层。 图14神经元对数据的处理 3.5基于iOS系统的软件设计与实现 基于本系统过程式的处理方式,我们按照主要过程将体统分为图像采集、车牌的识别与分割、字符的分割与识别三个部分,并分别封装成类,此外,为了便于我们对车牌数据的存储,还加入了一个车牌辅助类Plate。 如下图所示,用户向交互层传递“选择照片”或者“检测”的信息,当交互层接收到选择照片的交互信息后,弹出“相册”“相机”的选项,供用户用不同的方式选择照片,当用户选择好照片后,向交互层传达“检测”的信息,则系统开始按照如图所示的流程,一层一层地进行处理,最后将显示结果以文本的形式通过交互层传递给用户。 图15总数据流图 对于车牌分类和字符识别,我们分别使用了OpenCV中的CvSVM类和CvANN_MLP类: CvSVM(constCvMat*trainData,constCvMat*responses,constCvMat*varIdx=0,constCvMat*sampleIdx=0,CvSVMParamsparams=CvSVMParams()); trainData和responses分别为训练数据及其所属分类,本文中,我们使用离线训练的方法,将准备好的训练数据存入可扩展标记语言文件中,然后再从中读取数据,分别放入变量trainData和responses中。 varIdx用来指定感兴趣的特征,如可以是整数向量,默认值中是以0为开始的索引。 sampleIdx用来指定感兴趣的样本。 params为SVM的类参数,通过创建CvSVMParams类的对象来设置这些参数。 最后,我们就可以用CvSVM类的predict()函数来进行分类,以此来判断候选车牌中那些是正真的车牌。 CvANN_MLP(constCvMat*layerSizes,intactivateFunc=CvANN_MLP: : SIGMOID_SYM,doublefparam1=0,doublefparam2=0); layerSizes为神经网络层数,activateFunc为激励函数,默认值为SIGMOID_SYM,即Sigmoid函数,fparam1和fparam2分别为和的值。 在进行字符识别之前,我们还需要利用从数据库中提取的字符特征作为训练集对算法进行训练。 由先验知识可知,车牌中的字符来自14个字母和10个数字,因此,与之前对车牌进行SVM算法分类不同,我们这里需要进行多分类,数据的标签有24个,而数据则是通过我们上一节的方法对24各字符进行处理得到的字符特征。 当我们对算法进行训练之后,便可以使用CvANN_MLP类中的predict()函数对分割处理后的字符图形进行分类了。 如下图所示,展示了该系统软件对一张彩色图片检测并识别的过程。 ab cd 图16(a)~(d)为车牌检测识别过程截图 4功能测试与结果分析 本文中所使用的数据均来自于国立雅典理工大学多媒体技术实验室(MultimediaTechnologyLaboratory,NationalTechnicalUniversityofAthens),数据均为希腊地区车牌,由红外摄像机所拍摄,分为三种尺寸,640×480的车牌图像144张,800×600的车牌图像77张,1792×1312的车牌图像100张。 本文所使用的车牌大小为520mm×110mm,车牌中字符的前三位包括A、B、E、Z、H、I、K、M、N、O、P、T、Y、X共十四个大写字母,后四位包括0-9十个阿拉伯数字,每个字符的大小为44mm×77mm。 44mm 77mm 110mm 520mm 图17希腊车牌样例 在系统实现中,我们使用了100张640×480的车牌作为训练数据,使用数据库其余数据作为测试数据,测试结果如下所示: 表3车牌识别结果统计 (一) 识别率(%) 测试集1 (640×480,44张) 测试集2 (800×600,77张) 测试集3 (1792×1312,100张) 车牌 65 72 80 字母 68 79 82 数字 80 84 87 从统计结果中我们可以看出,高分辨率的图像更容易准确识别出车牌以及车牌中的字符。 但是在测试中我们也发现本文中基于灰度图像的垂直检测当遇到白色或者银色的车体时,往往较难发现车牌边界,或者车牌边界易与周围区域混淆,这时,如果使用手机自带功能,来提升车牌区域的对比度则可在一定程度上解决该问题。 在字符的识别方面,由于一些字符的特征极为相似或相近,如“0”和“O”,“1”和“I”,“6”和“E”,“8”和“B”等,这给字符识别带来了一定的误差,而且基于直方图统计的特征匹配很难准确地将其区分开。 在今后的工作,我们需要挖掘字符更多的特征或者采用其他分类方法。 表4车牌识别结果统计 (二) 5总结 本毕设成功完成了车牌定位检测、字符的分割识别等功能步骤,并最终实现了车牌识别。 该系统可以在手机端完成从图像采集到结果输出的所有步骤,使用十分方便,提供内部接口,可以方便地移植到其他软件,而且可以利用手机的通信功能方便的将数据传输。 为了达到更好的识别效果,本系统将会尝试使用第三方OCR,以此实现对更多语言的支持。 致谢 本科四年转眼即逝,在我本科学习的最后这一段时间里,我的毕设导师**老师,和研究生导师**教授都给了我极大的帮助,在此我对两位老师表示最诚挚的谢意。 *老师对研前学习的细致安排让我充实地度过了大学的最后一年,不仅对自己的专业有了更深的认识,同时也为研究生阶段的学习打下了夯实的基础。 *老师是一位平易近人的良师益友,她对工作严谨负责的态度,给我留下了深刻印象,在完成毕设期间,她在算法方面对我所提出
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 ios 车牌 识别 系统 设计 实现 本科 论文