袁单飞-正文基于ARM的车牌识别技术研究与实现_第1页
袁单飞-正文基于ARM的车牌识别技术研究与实现_第2页
袁单飞-正文基于ARM的车牌识别技术研究与实现_第3页
袁单飞-正文基于ARM的车牌识别技术研究与实现_第4页
袁单飞-正文基于ARM的车牌识别技术研究与实现_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于 ARM 的车牌识别技术研究与实现1前言1.1 课题背景和目的意义随着经济的不断发展,交通需求的不断增加,全球各国都在受到交通拥堵的困扰。在这种情况下,智能交通系统 ITS(elligent Transporion Systems)孕育而生。它是解决各种交通问题的主要之一,在交通中起着重要的作用12。智能交通系统是指包括、通讯技术、控制技术、计算机技术和网络技术等,综合起来应用在整个交通管理中,从而发挥实时、准确的控制和管理交通的综合管理系统23。车辆牌照是车辆的,在交通系统中有着不可替代的作用。系统、优化交通管理系统的实现都离不开对车辆牌照的识别。车辆牌照识别系统是智能交通系统的一个重要

2、组成部分,它能从一副图像中自动提取车牌图像,分割车牌图像中的字符,进而对字符进行识别,从而可以在无需对车辆外加其他装置的情况下实现对车辆牌照的自动识别4。1.2 解决问题和技术要求本课题解决问题主要包括:通过支持向量机学习识别车牌图像;通过神经网络学习识别车牌字符;通过开发模式引导程序实现 TFTPLinux 内核和挂载 NFS 根文件系统;通过文件系统;通过模式引导程序实现 Nand Flash 加载Linux 内核和挂载 YAFFS2 根头捕获车辆图像;通过网页进行交互。本课题技术要求主要包括:熟悉 OpneCV(Open Source Computer ViLibrary)编程;了解支持

3、向量机和神经网络的原理;熟悉 ARM 处理器引导启制,Linux 系统内核启制和文件系统挂载机制;熟悉 TCP/IP 协议;熟悉 Linux 驱动编程;熟悉 CGI(Common Gatewayerface)编程。1.3 研究现状和发展趋势从 20 世纪 80 年代起,、澳大利亚、法国、意大利、英国、韩国以及我国都车辆牌照自动识别技术的研究。目前国外已开发出不少成熟产品,如德克萨斯仪器公司的 TIRIS AVI 系统,以色列 Hi_Tech 公司的 See/Car System 系统,新加坡 Optasia 公司的 LPRS 系统等5。我国在 90 年始了车辆牌照自动识别技术的研究。目前比较成

4、产品有汉王公司的汉王眼,杭州海康威视、信路威等车辆牌照识别产品。这些产品基本能满内实际应用。但是这些产品对环境的要求高,在不同的光照环境下会影响识别率。所以如何准确的定位车牌,识别字符,提高识别率仍是一项重要的任务5。车辆牌照识别系统是推进交通管理自动化的之一,其主要功能是通过摄像设备车辆图像,并通过图像处理、机器视觉、人工智能等技术,在车辆图像中定位车牌和识别字符。它能够对过往的车辆进行实时、控制交通。并能被广泛地应用于红绿灯车辆检测,交通车流量统计,发展必将大大加速智能交通系统的进程6。车辆追踪,物业车辆管理等领域。其2方案论证2.1 车牌定位算法选择车牌定位算法在车牌识别技术中占有很重要

5、的地位,一个车牌识别系统的识别率往往取决于车牌定位的准确度。主流的车牌定位算法有两种6。第一种是基于边缘检测的车牌定位算法。从车牌纹理特征入手,找出车牌不同于背景图像的特征是这种车牌定位算法的关键。观察多幅车辆图像会发现车身和背景的纹理多为横向纹理,而车牌字符则为纵向纹理。基于这些纹理特征可以从背景图像中定位出车牌。这类方法的优点是计算速度快。缺点是定位出来的区域较多,无法直接定位出车牌。第二种是基于颜色信息的车牌定位算法。从车牌颜色特征入手,找出车牌不同于背景图像的特征是这种车牌定位算法的关键。根据车牌颜色的先验知识知道车牌颜色主要包含蓝底白字、黄底黑字等颜色特征。基于这些颜色特征可以从背景

6、图像中定位出车牌。这类方法的优点是定位出来的区域较少。缺点是计算速度慢,当车牌底色和背景颜色相近时无法定位出车牌。本文采用的是基于边缘检测和支持向量机相结合的车牌定位算法。首先通过滤波器滤波、形态学变换、角点检测算法来分割图像中的可能存在车牌的区域。然后通过训练支持向量机来对可能存在车牌的区域进行分类,识别出车牌区域。从而达到车牌定位的目的。2.2 字符识别算法选择字符识别算法直接影响车牌识别系统的最终结果,一个车牌识别系统的识别率往往决定于字符识别的准确度。主流的字符识别算法有两种6。第一种是基于模板匹配的字符识别算法。字符识别的最简单方法是对提取的字符轮廓与标准的字符轮廓进行相似度比较。矩

7、是通过对轮廓上所有点进行积分运算而得到的轮廓特征。矩依赖于所选的坐标系,这意味着字符旋转后就无法正确的匹配。Hu矩是归一化中心距的线性组合。Hu 矩对缩放、旋转和对称变换具有不变性。模板匹配算法是通过提取字符 Hu 矩来进行字符识别。这类方法的优点是算法实现简单,识别速度快。缺点是识别率低,无法识别不同角度拍摄的车牌字符图像。第二种是基于神经网络的字符识别算法。字符识别的一般方法是对提取的字符特征与标准的字符特征进行相似度比较。字符特征包括字符图像的直方图特征和低分辨率特征等。神经网络是一种受生物学启发而产生的一种模拟人脑的数学算法模型,它使用梯度下降调整神经网络层节点之间连接权值来最小化误差

8、。神经网络算法通过提取字符图像特征来识别字符。这类方法的优点是识别速度快,具有鲁棒性。缺点是需要大量的训练样本。本文采用的是基于神经网络的字符识别算法。首先,通过阈值变换和角点检测来分割车牌图像中的字符。然后,通过训练神经网络来对字符图像进行识别,识别出车牌号码。从而达到字符识别的目的。3设计论述应用程序设计车牌规格介绍中民机动车号牌的规格共有 19 种。本文以小型汽车号牌为例来说明车牌识别系统的设计方法。该方法同样适用于其他规格的汽车号牌。小型汽车号牌如图 1 所示,外轮廓尺寸为 440mm140mm,每个字符的轮廓尺寸为 90mm45mm7。小型汽车号牌共有七个字符,字符被点号分为两组。点

9、号前两个字符表示省、示序号,由、直辖市的简称,由汉字和英文字符组成。点号后五个字符表数字和英文字符组成。序号每一位可以单独使用数字和英文字符,英文字符中不包含 O 和 I。图 1小型汽车号牌3.1.2车牌识别架构车牌识别架构如图 2 所示,分为车牌定位和字符识别两个部分。车牌定位的目的是从原始图像中找出车牌位置。字符识别的目的是从车牌图像中识别出车牌号码。车牌定位又分为车牌分割和车牌识别,因为车牌识别中使用了支持向量机,所以在这之前先要进行车牌学习。字符识别又分为字符分割和字符识别,因为字符识别中使用了神经网络,所以在这之前先要进行字符学习。接下来对这几个部分做详细论述。图 2车牌识别架构3.

10、1.3车牌分割设计车牌分割流程如图 3 所示,其中最重要的是均值滤波、垂直检测、形态变换、漫水填充和裁剪图像五个部分。接下来对这些部分做详细说明。图 3车牌分割流程均值滤波的作用是为了减少图像上的噪声,使用的方法是均值滤波8。均值滤波输出图像的每一个像素是卷积核中输入图像对应像素的简单平均值。本择的卷积核大小为 55,均值滤波核如公式 1 所示。原始图像如图 4 所示,均值滤波结果如图 5 所示。1 11 11(1)K =KwidthKheight图 4原始图 5均值滤波结果垂直检测的作用是为了检测均值滤波结果中的纵向纹理,使用的方法是 Sobel 求导9。如果需要表示图像的纹理变化,那么需要

11、找到纹理变化的特征。从图像的纹理边缘部分可以看到这些像素值明显变化了,通过导数可以表示这些像素值的改变。 Sobel 算子是一个离散微分算子,可以用它来计算图像灰度函数的近似梯度。本择的 Sobel 算子内核的大小为 33,Sobel 算子内核如公式 2 所示。垂直检测结果如图 6 所示。1Gy = 0+120+210 I+1(2)图 6垂直检测结果形态变换的作用是为了连通垂直检测结果中的纵向纹理,使用的方法是形态学闭运算。形态学闭运算能够连通形态核内的区域。本态变换结果如图 7 所示。择的形态核大小为 213。形漫水填充的作用是为了连通形态变换结果中颜色相近的区域,使用的方法是漫水填充算法1

12、0。车牌具有相同背景底色,可以利用这个特征来填充颜色相同的区域,便于接下来对图像的裁剪。本取距离形态变换结果中白域中心的 10 个随机点对图像进行填充,来获得更大的连通区。漫水填充结果如图 8 所示。裁剪图像的作用是为了从漫水填充结果中筛选出车牌图像,并旋转图像位置和调整大小。在裁剪图像时,利用车牌的宽高比 440/140 对漫水填充结果的多个区域进行裁剪,最后筛选出符合要求的车牌图像。裁剪图像的结果如图 9 所示。图 7形态变换结果图 8漫水填充结果图 9裁剪图像结果3.1.4车牌学习设计从车牌分割中可以得到包含车牌在内的多幅图像。为了从这些图像中识别出车牌图像,需要对这些图像进行分类,即将

13、图像分为车牌图像和非车牌图像两类。本文使用支持向量机来实现分类。在使用支持向量机进行分类前,首先需要对支持向量机进行训练。接下来介绍支持向量机的原理,然后详细说明支持向量机的训练过程。支持向量机 SVM(Support Vector Machine)是一个监督式分类器。它是一个能够将不同类的样本在样本空间内分隔的超平面。换句话说,如果给定一些标记好的训练样本,SVM 算法能输出一个最优分隔超平面11。假设一些分类属于两类二维点,这些点可以通过直线分割,需要找到一条最优的分割线。分隔直线如图 10 所示12。图 10分隔直线在图 10 中可以看到有多条可能的直线将样本分开。那么是不是存在某条直线

14、比其他的更加合适呢?距离样本太近的直线不是最优的,因为这样的直线对噪声敏感度高,泛化性较差。所以目标就是找到一条直线,离所有点的距离最远。SVM 算法的实质是找出一个能够将某个值最大化的超平面,这个值就是超平面离所有训练样本的最小距离。这个最小距离在 SVM 术语中称为间隔。换句话说,最优分隔超平面的目标是最大化训练数据的间隔。上例中的最优化分隔超平面如图 11 所示12。图 11最优分隔超平面在分割车牌结果中可以得到两类图像样本。一类是车牌样本,另一类是非车牌样本。对支持向量机训练实质上就是根据这两类图像样本,找出最优分隔超平面。车牌学习流程如图 12 所示,其中最重要的是设置数据、学习模型

15、和测试模型三个部分。接下来对这些部分做详细说明。图 12车牌学习流程设置数据的作用是为了提取图像特征。支持向量机不仅可以对二维特征分类,还可以对特征分类。本文把图像的像素直接作为特征,用于支持向量机的训练和分类。当然这不是最好的特征提取方法,更好的特征提取方法有主成分分析、换、纹理分析等。变学习模型的作用是为了构建对图像进行分类的支持向量机模型。支持向量机的核函数可以把线性不可分的特征到空间,使之变为线性可分。本文在训练支持向量机时选择的核函数是线性核函数,不对特征进行,训练迭代次数为 1000次。经过测试可以看到该训练参数能够很好的对车牌图像和非车牌图像进行分类。测试模型的作用是为了对学习模

16、型时的参数进行调整。本文训练的车牌样本和非车牌样本各 40 个,测试的车牌样本和非车牌样本各 10 个。由于样本数量有限,测试结果的识别率都是 100%。相信随着样本数量增加,使用该方法对车牌图像进行识别也能取得同样优秀的识别率。3.1.5字符分割设计字符分割流程如图 13 所示,其中最重要的是二值变化、获取轮廓和裁剪轮廓三个部分。接下来对这些部分做详细说明。图 13字符分割流程二值变化的作用是为了对图像进行预处理,使用的方法是二进制阈值化。在运用这种阈值变化时,首先要选定一个特定阈值。根据所选阈值,将灰度值大于该阈值的像素点的灰度值变为 255,灰度值小于该阈值的像素点的灰度值变为 0。本特

17、定阈值为 200。阈值变化结果如图 14 所示。择的图 14阈值变化结果获取轮廓的作用是为了从阈值变化结果中分割出字符图像,使用的方法是查找轮廓。首先将二值图像标记为轮廓和孔。轮廓表示白域的外部边界,孔表示白域分割出来。本文只检查图像域的。通过查找轮廓可以把阈值变化结果中白最外层的轮廓,使用 Teh-Chin 链 近算法。轮廓裁剪的作用是为了分割获取轮廓结果中查找到的字符,同时旋转位置和调整大小。在轮廓裁剪时,利用字符的宽高比 90/45 对获取轮廓的多个区域进行裁剪,最后筛选出符合要求的字符图像。轮廓裁剪结果如图 15 所示。图 15轮廓裁剪结果3.1.6字符学习设计为了从字符分割结果中识别

18、出车牌字符,需要用到神经网络模型。在使用神经网络对字符图像进行识别前,首先需要对神经网络进行训练。接下来介绍神经网络的原理,然后详细说明神经网络的训练过程。人工神经网络 ANN(Artifil Neural Networks)是一种模仿动物神经网络行为特征,进行分布式并行信息处理的数学算法模型。这种网络根据系统的复杂程度,通过调整大量节点之间相互连接的关系,从而达到处理信息的目的13。假设一些分类属于两类三维点,对这些点进行分类使用一个三层神经网络。假设输入层 3 个节点,隐藏层 5 个节点,输出层 2 个节点,则所构建成的神经网络模型如图 16 所示14。图 16神经网络模型每一个节点可以看

19、做是一个神经细胞,神经细胞模型如图 17 所示14。x1 到 xN 表示输入,1 表示先验偏差;wi0 到 wiN 表示权重,ui 表示所有输入的和;f(u)表示激励函数,yi 表示输出。进入神经细胞的每一个输入都与一个权重相关联,正是这些权重决定了神经网络的整体活跃性。因为权重可正可负,所以能对与之相关联的输入施加不同的影响。如果权重为正,那么会有激发作用;如果权重为负,那么会有抑制作用。当输入信号进入神经细胞时,它们的值将与对应的权重求和,作为激励函数的输入。通过激励函数输出一个激励值,然后根据激励值产生神经细胞的输出。当激励值超过某个阀值,就会产生一个值为 1 的输出信号;当激励值小于某

20、个阀值,就会产生一个值为1 的输出信号。图 17神经细胞模型激励函数的作用是将和值回归到 1 至1 之间。常用的神经网络激励函数有恒等函数、S 型函数和函数。本文使用的激励函数是 S 型函数。S 型函数如公式3 所示,曲线如图 18 所示14。() = 1(3)1+图 18S 型函数分割字符的结果共有 35 类。对神经网络进行训练实质上是对每一个神经细胞相关联的权重进行调整,使之能对这 35 类字符图像进行识别。字符学习流程如图 19 所示,其中最重要的是设置数据、学习模型和测试模型三个部分。接下来对这些部分做详细说明。图 19字符学习流程设置数据的作用是为了提取字符特征。本文把字符图像的水平

21、投影直方图和垂直投影直方图,以及 2020 像素的低分辨率图像作为特征,用于神经网络的训练和识别。神经网络的输入必须是一维的,需要将这些字符特征转换为一维向量。学习模型的作用是为了获取对字符进行识别的神经网络模型。本文使用的神经网络包含三层。输入层节点数为字符特征一维向量的长度。隐藏层节点数为 20 个。输出层节点数为 35 个,分别为 10 个数字、24 个英文字符和 1 个其他字符。由于系统没有移植汉字库,所以把车牌号码中出现的汉字全部识别为其他字符。激励函数为 S 型函数,和值分别为 1。神经网络的学习算法为弹性反向测试可以看到该训练参数能够很好的对字符图像进行识别。测试模型的作用是为了

22、对学习模型时的参数进行调整。本文训练的字符样本各为算法。经过80 个,测试的字符样本各为 20 个。由于样本数量有限,的识别率都在 95%以上。相信随着样本数量的增加,使用该方法对字符图像进行识别也能取得同样优秀的识别率。3.1.7车牌识别设计车牌识别流程如图 20 所示,其中最重要的是车牌检测、字符识别和显示结果三个部分。接下来对这些部分做详细说明。车牌检测的作用是为了对输入图像进行车牌定位。车牌检测算法与车牌分割算法大致相同。不同在于最后调用了车牌学习产生的支持向量机模型,对分割出来的车牌图像进行识别。字符识别的作用是为了对车牌图像进行字符识别。字符识别算法与字符分割算法大致相同。不同在于

23、最后调用了字符学习产生的神经网络模型,对分割出来的字符图像进行识别。显示结果的作用是用来在输出图像中定位车牌位置和显示车牌号码。车牌识别结果如图 21 所示。图 20车牌识别流程图 21车牌识别结果引导程序设计启动流程介绍引导程序是一段在系统启动时自动执行的代码。它的作用是初始化处理器和启动操作系统。本文使用的开发板为 MINI2440,引导的操作系统为 Linux。接下来简单地介绍该处理器的启动流程。ARM 处理器 S3C2440 的地址空间如图 22 所示15。处理器的启动模式分为 NorFlash 模式和 Nand Flash 模式两种。本文使用的是 Nand Flash 模式。处理器的

24、启动流程分为两个阶段,第一个阶段是Nand Flash 中的前 4KB 引导程序代码到片内RAM 中运行,称之为 BL1;第二个阶段是Nand Flash 中剩余的引导程序代码到片外RAM 中运行,称之为BL2。片内RAM 的地址空间为0 x00000000 到0 x00008000,片外 RAM 的地址空间为 0 x30000000 到 0 x40000000。图 22S3C2440 的地址空间引导程序分为两种模式,第一种是通过 TFTPLinux 内核和挂载 NFS 根文件系统的开发模式;第二种是通过 Nand Flash 加载 Linux 内核和挂载 YAFFS2 根文件系统的模式。开发

25、模式引导程序的作用是用来在开发中调试操作系统,模式引导程序的作用是用来在实际应用中引导操作系统。在接下来的几个小节中将分别对这两种引导程序的设计进行详细说明。3.2.2开发模式设计开发模式架构如图 23 所示,分为引导第一阶段和引导第二阶段两个部分。引导第一阶段又分为初始化、低级初始化、环境初始化和跳转到内存四个部分;引导第二阶段又分为串口初始化、网卡初始化、中断初始化和显示命令行四个部分。图 23开发模式架构初始化的作用是对处理器环境进行预处理,以便于接下来对处理器和外部设备进行初始化。低级初始化的作用是设置系统时钟和初始化内存。环境初始化的作用是提供 C 程序运行的环境。跳转到内存的作用是

26、从 Nand Flash 中剩余的引导程序代码到内存中,并跳转到内存运行。串口初始化的作用是将引导程序输出的信息打印到串口终端。网卡初始化的作用是获取 TFTP 服务器的物理地址和Linux 内核镜像。中断初始化的作用是处理系统产生的中断。显示命令行的作用是提供用户交互。接下来对这些初始化步骤做详细说明。第一步需要设置异常向量表。ARM 处理器 S3C2440 共有七种异常模式,分别为复位异常、未定义指令异常、中断异常、指令预取异常、数据预取异常、中断异常和快速中断异常。当系统发生某种异常时,处理器会跳转到异常对应的固定地址处去执行异常处理程序,这个固定的地址称为异常向量表。第二步需要设置处理

27、器模式。ARM 处理器 S3C2440 共有七种工作模式,分别为用户模式、未定义指令模式、系统保护模式、系统模式、异常模式、中断模式和快速中断模式。初始化系统时需要很高的权限,需要设置处理器到系统保护模式。第三步需要关闭看门狗控制器。看门狗是一个硬件模块,当系统死机时,它可以帮助系统实现自动重启。如果超过了设定时间,还没有重新设置看门狗,那么它会认为系统已经死机,然后自动重启系统。为了简化引导程序的设计,所以需要关闭看门狗控制器。第四步需要关闭中断控制器。为了在初始化处理器和外部设备时,不被系统中断打断,所以需要关闭中断控制器。第五步需要关闭内存管理器。管理包速缓存和虚拟地址转换。为了简化引导

28、程序的设计,所以需要关闭高速缓存和虚拟地址转换功能。第六步需要初始化系统时钟。系统时钟是处理器的心跳,所有的指令全部都在统一的节拍下工作。本文提供的外部晶振频率为 12MHz,需要通过设置系统时钟来提高系统的工作频率。系统时钟分为 FCLK、HCLK、PCLK 和 UCLK 四种。FLCK 为处理器提供工作时钟,HCLK 为外部高速设备提供工作时钟,PCLK 为外部低速设备提供工作时钟,UCLK 为外部USB 设备提供工作时钟。本文设置的FCLK 为405MHz,HCLK 为 101MHz,PCLK 为 50MHz,UCLK 为 96MHz。第七步需要初始化内存控制器。内存是一种随机器,用来运

29、行操作系统和应用程序。对内存控制器的初始化主要包括设置内存的地址空间和工作频率。本文设置内存的地址空间为 0 x30000000 到 0 x34000000,工作频率为 101MHz。第八步需要设置栈空间地址。栈是一种具有先进后出性质的数据组织方式。栈底是第一个入栈数据所处的位置;栈顶是最后一个入栈数据所处的位置。当栈顶指针总是指向最后一个入栈数据所处的位置时,称之为满栈;当栈顶指针总是指向下一个将要入栈数据所处的位置时,称之为空栈。随着数据的入栈,栈顶指针从低地址向高地址移动,称之为升栈;随着数据的入栈,栈顶指针从高地址向低地址移动,称之为降栈。ARM 处理器 S3C2440 的栈结构为满降

30、栈。因为 C 程序中的函数参数、局部变量和返回时寄存器环境全部都保存在栈中,为了使用 C 语言进行编程,所以需要初始化栈空间地址。值得注意的是,当处理器工作在不同模式下时,会有不同的栈空间地址。本文设置系统保护模式下栈起始地址为 0 x34000000,中断模式下栈起始地址为 0 x33000000。第九步需要初始化文本段地址。文本段又称成为 BSS 段,C 程序中未初始化的全局变量保存在文本段中。为了避免使用时忘记赋值而导致出现意想不到的情况,所以需要对文本段进行清零。第十步需要初始化辅存控制器。本文使用的辅存是 Nand Flash,相当于设备的硬盘。Nand Flash 采用独立编址,只

31、能通过 Nand Flash 控制器来,所以需要对 Nand Flash 控制器进行初始化。初始化辅存控制器分为初始化控制器和复位闪存两个步骤。初始化控制器又分为设置配置寄存器和设置控制寄存器两个步骤;复位闪存又分为选中闪存,清除繁忙信号,发送重启命令,判断繁忙状态和释放闪存五个步骤。第十一步需要拷贝引导到内存。ARM 处理器 S3C2440 启动时,片内 ROM 中引导程序BL0 会自动地把 Nand Flash 中的前 4KB 引导程序BL1 拷贝到片内RAM 中运行。当引导程序大于 4KB 时,需要通过引导程序 BL1 把剩余的引导程序 BL2 拷贝到外部 RAM 中继续运行。通过调用辅

32、存读数据函数把引导程序 BL2 拷贝到内存。第十二步需要跳转到内存运行。跳转指令分为相对跳转和绝对跳转两种。当使用相对跳转指令时,跳转的地址是相对于当前地址的偏移;当使用绝对跳转指令时,跳转的地址是相对于地址空间的绝对地址。引导程序 BL1 运行在片内 RAM 的地址空间中,引导程序 BL2 运行在片外 RAM 的地址空间中。所以需要使用绝对跳转指令跳转到片外 RAM(也就是内存)的地址空间中去运行引导程序 BL2。第十三步需要初始化串口控制器。初始化串口控制器的作用是将引导程序输出的信息打印到串口终端。串口通信方式分为同步通信和异步通信,通信时双方按照约定好的数据格式进行通信。串口通信的数据

33、格式包括起始位、数据位、奇偶校验位、停止位和波特率。波特率是指在时间内载波参数变化的次数,换句话说,就是每秒内发送的码元数。本文串口通信使用异步通信方式,起始位 1 位,数据位 8 位,无奇偶校验位和停止位,波特率为 115200Bd。串口控制器的工作模式分为轮询模式、中断模式和直接器模式三种。为了简化引导程序的设计,本文使用的是轮询模式。初始化串口控制器分为配置功能引脚,设置数据格式,设置工作模式和设置工作频率四个步骤。第十四步需要移植格式化函数。移植格式化函数的作用是使串口能够输入或输出带有变参列表的字符串。需要使用 C 函数库中开始转换 va_start、输入参数 vsscanf、输出参

34、数 vsprf 和结束转换 va_end 四个宏定义。输入格式化字符串函数分为输入格式化字符串和转换字符串参数两个步骤;与之相反,输出格式字符串函数分为转换字符串参数和输出格式化字符串两个步骤。第十五步需要初始化网卡控制器。初始化网卡控制器的作用是获取 TFTP 服务器Linux 内核镜像。本文使用的网卡为 DM9000。网卡的物理地址和的地址端口为 0 x20000300,数据端口为 0 x20000304。网卡的寄存器不能直接访问,只能通过地址端口加偏移来。初始化网卡分为初始化总线片选,初始化网卡中断,复位网卡,判断捕获网卡和启动网卡五个步骤。初始化总线片选又分为设置总线位宽和设置片选时钟

35、两个步骤。初始化网卡中断又分为配置功能引脚,设置触发方式,清除中断掩码和清除中断请求四个步骤。复位网卡又分为配置引脚、设置复位、等待复位完成、再次设置复位和等待复位完成五个步骤。判断捕获网卡又分为获取网卡和判断匹配成功两个步骤。启动网卡又分为配置网卡、配置物理地址、显示网络地址和设置接收中断四个步骤。第十六步需要移植地址协议。在网络通讯中,每一台计算机都有一个唯一的标识 Mac 地址。两台计算机之间想要通过网络进行通讯,就必须知道对方的 Mac地址。但是通常情况下只知道对方的 IP 地址,这时就需要利用地址协议 ARP 来向局域网中的所有计算机发送 ARP 请求。收到请求并且满足条件的计算机会

36、发送ARP 应答,告知对方其 Mac 地址。发送 ARP 请求函数分为创建 ARP 请求包和发送ARP 请求包两个步骤。创建 ARP 请求包又分为填充 ARP 头部和填充 Mac 头部两个步骤。Mac 头部包括目的 Mac 地址、源 Mac 地址和 Mac 协议类型。ARP 头部包括硬件类型、协议类型、Mac 地址长度、IP 地址长度、ARP 协议类型、源 Mac 地址、源IP 地址、目的 Mac 地址和目的 IP 地址。Mac 头部和 ARP 头部如下所示。第十七步需要移植文件传输协议。移植文件传输协议的作用是为了从 TFTP 服务Linux 内核镜像。简单文件传输协议 TFTP(Trivi

37、al File Transfrotocol)是器中TCP/IP 协议族中用来在客户机与服务器之间进行文件传输的协议。它是基于 UDP 实现的协议,读写端 为 69。TFTP 交换过程分为三个步骤。首先,客户端发送请求报文到服务器;然后,服务器发送数据报文到客户端;最后,客户端发送响应报文到服务器。TFTP 报文类型分为请求读报文、请求写报文、数据报文、应答报文和出错报文五种。发送 TFTP 读数据请求函数分为设置请求块号,创建读请求包和发送读请求包三个步骤。创建读请求包又分为填充 TFTP 数据,填充 TFTP 头部,填充 UDP 头部,填充 IP 头部和填充 Mac 头部五个步骤。接收 TF

38、TP 响应数据函数分为判断响应块号,创建接收应答包和发送接收应答包三个步骤。创建接收应答包又分为填充 TFTP块号,填充 TFTP 头部,填充 UDP 头部,填充 IP 头部和填充 Mac 头部五个步骤。IPtypedef struct ehhdrunsigned char eh_dst6; unsigned char eh_src6; unsigned short eh_type;EHHDR;typedef struct arphdrunsigned short arp_hrd; unsigned short arp_pro;unsigned char arp_hln; unsigned c

39、har arp_pln; unsigned short arp_op;unsigned char arp_sha6; unsigned char arp_spa4; unsigned char arp_ 6; unsigned char arp_tpa4;ARPHDR;头部包括协议版本、服务类型、IP 头部长度、报文、报文偏移、生存时间、UDP协议类型、IP 校验和、源 IP 地址和目的 IP 地址。UDP 头部包括源端、目的端、UDP 报文长度和 UDP 检验和。TFTP 头部包括 TFTP 协议类型。IP 头部、UDP头部和 TFTP 头部如下所示。第十八步需要打开中断标志。为了处理网卡产

40、生的数据接收中断,所以需要打开系统中断标志。第十九步需要显示命令行。显示命令行的作用是提供用户交互。本文菜单命令选typedef struct iphdrunsigned char ip_vhl; unsigned char ip_tos; unsigned short ip_len;unsigned short ip_id; unsigned short ip_off;unsigned charip_ttl; unsigned charip_pro; unsigned short ip_sum;unsigned char ip_srcIP_ADR_LEN; unsigned char ip_

41、dstIP_ADR_LEN;IPHDR;typedef struct udphdrunsigned short udp_sport; unsigned short udp_dport;unsigned short udp_len; unsigned short udp_sum;UDPHDR;typedef struct tftphdrunsigned short tftp_op;TFTPHDR;项分为获取物理地址,设置网络地址,内核镜像,保存内核镜像,加载内核镜像和启动操作系统六项。第二十步需要移植启动系统命令。为了设置操作系统的启动参数,需要移植启动系统命令。Linux 内核镜像分为不加信息

42、头部的内核镜像 zImage 和加信息头部的内核镜像 uImage。本文启动系统命令用来启动不加信息头部的内核镜像。启动系统命令函数分为设置启动地址,设置启动参数和启动操作系统三个步骤。设置启动参数又分为设置参数,设置内存参数,设置命令参数和设置结束标志四个步骤。设置的命令参数为挂载 NFS 根文件系统。3.2.3模式设计模式架构如图 24 所示,分为初始化,低级初始化,环境初始化和跳转到内存四个部分。初始化又分为设置异常向量表,设置处理器模式,关闭看门狗控制器,关闭中断标志位和关闭内存管理器四个步骤;低级初始化又分为初始化系统时钟和初始化内存控制器两个步骤;环境初始化又分为初始化栈空间地址和

43、初始化文本段地址两个步骤;跳转到内存又分为初始化串口控制器,初始化辅存控制器,拷贝引导和内核,以及跳转到内存启动四个步骤。模式引导程序的前十一个步骤与开发模式引导程序大致相同。不同在于,第十二步需要拷贝引导和内核,通过辅存读数据函数把引导程序和内核镜像从 Flash 中拷贝到内存;第十三步需要跳转到内存启动,设置 令参数为挂载 YAFFS2 根文件系统。图 24模式架构3.3 内核驱动设计3.3.1驱动设计设备驱动程序是一种可以使计算机和外部设备进行通信的特殊程序。设备驱动程序常见分类方法有常规分类法和总线分类法。常规分类法又分为字符设备驱动、块设备驱动和网络设备驱动。总线分类法又分为总线驱动

44、、USB 总线驱动和 PCI 总线驱动。为了使用 USB板中,所以需要设计线从宿主机驱动程序。引导程序、内核镜像和文件系统到开发驱动属于总线驱动模型,当有设备插到总线上时,总线会把设备和驱动进行匹配,当设备匹配到驱动时,总线会把控制权交给相应的驱动程序来处理;当设备从总线上拔掉时,总线会找到相应的驱动程序来处理事件。接下来对驱动的设计进行详细说明。驱动架构如图 25 所示,分为设备方法,驱动方法和驱动安装三个部分。设备方法又分为写入方法和打开方法。驱动方法又分为捕获设备和移除设备。驱动安装又分为安装驱动和卸载驱动。当宿主机安装驱动程序时,会调用安装驱动函数来驱动;当宿主机卸载驱动程序时,会调用

45、卸载驱动函数来注销驱动。当把线插到宿主机时,会调用捕获设备函数来设备函数来注销设备。当宿主机打开设备;当线从宿主机拔掉时,会调用移除程序时,会调用打开设备函数来分配数据缓存空间;当宿主机写入数据时,会调用写入方法函数来写入数据。图 25驱动架构3.3.2内核镜像裁剪Linux 是一套免费使用和IX 和 UNIX 的的操作系统,是一个基于多用户、多任务、支持多线程和多处理器的操作系统。它继承了 UNIX 以网络为的设计 ,是一个性能稳定的多用户网络操作系统16。Linux 系统架构分为用户空间和内核空间两个部分。用户空间由应用程序和 C 函数库两个部分组成;内核空间由系统调用接口、系统内核代码和

46、体系结构代码三个部分组成。Linux 内核架构分为系统调用接口、进程管理模块、内存管理模块、虚拟文件系统、网络协议模块、设备驱动模块和体系结构相关七个部分。内核裁剪是指基于硬件和的需求选出需要的功能,去掉不要的功能。本文内核需要的功能包括支持挂载 NFS 根文件系统和 YAFFS2 根文件系统,以及支持ZC3XX USB头驱动。内核裁剪主要包括配置文件系统,设置启动文件和配置摄像头驱动三个步骤。接下来对这些步骤做详细说明。第一步需要配置文件系统,使内核支持挂载 YAFFS2 根文件系统和 NFS 根文件系统。在内核根目录下运行配置菜单命令 makeconfig ARCH=arm。然后进入Dev

47、ice Drivers 选项中,选中 Memory Technology Device (MTD) support 选项,接着进入 Memory Technology Device (MTD) support 选项中,选中 MTD partitioning support选项,配置内核支持挂载 YAFFS2 根文件系统。然后进入 File systems 选项中,选中Network File Systems 选项,接着进入 Network File Systems 选项中,选中 NFS cntsupport 选项和 Root file system on NFS 选项,接着进入 NFS cnt

48、 support 选项中,选中 FS cnt support for NFS ver3 选项,配置内核支持挂载 NFS 根文件系统。第二步需要设置启动文件,使内核对 Nand FLash 进行分区。在内核根目录下的arch/arm/mach-s3c2440 目录中修改启动文件的 mtd_partition 结构体,把 Nand Flash 分为引导程序、内核镜像和文件系统三个分区。修改启动文件如下所示。第三步需要配置头驱动,使内核支持 ZC3XX USB头驱动。在内核根目录下运行配置菜单命令 makeconfig ARCH=arm。然后进入 Device Drivers 选项中,选中 Mult

49、imedia support 选项,接着进入 Multimedia support 选项中,选中capture adapters 选项,接着进入选项,接着进入 V4L USB devicapture adapters 选项中,选中 V4L USB devi选项中,选中 GSPCA baseds 选项,接着进入 GSPCA based支持 ZC3XX USBs 选项中,选中 ZC3XX USB Camera Driver 选项,配置内核头驱动。3.4 文件系统设计3.4.1应用程序移植OpenCV 是一个基于开源的跨计算机视觉库,其中实现了图像处理和计算机视觉方面的很多通用算法1718。CGI

50、是外部应用程序与 Web 服务器之间的sic struct mtd_partition arm_default_nand_part = 0 = .name= i-boot,.offset= 0 x00000000,.size= 0 x00040000,1 = .name= kernel,.offset= 0 x00060000,.size= 0 x00500000,2 = .name= rootfs,.offset= 0 x00560000,.size= MTDPART_SIZ_FULL,;接口标准,是在 CGI 程序和 Web 服务器之间传递信息的规程。CGI 允许 Web 服务器执行 CG

51、I 程序,并将它们的输出发送给 Web 浏览器1920。本文使用 ARM 开发板搭建 Web 服务器,并通过 CGI 调用基于 OpenCV 的车牌识别程序,进而对头的图像进行车牌识别。为了使开发板能支持 OpenCV 和 CGI,需要对相关的动态库进行交叉编译和移植。本文交叉编译的宿主机为 Red Hat Ent开发板为 MINI2440,接下来对这些步骤进行详细说明。rise Linux Server 6.3,第一步需要安装 CMake 工具。CMake 是一个跨的安装和编译工具,可以用简单的语句来描述所有的安装和编译过程。需要用它来产生 OpenCV 的 Makefile文件。首先和解压

52、 CMake 源代码。接着,运行配置命令./configure -prefix=/usr,指明安装路径。运行编译命令 make,编译 CMake 源代码。最后,运行安装命令 makeinstall,安装编译产生的文件到安装路径。第二步需要移植 OpenCV。首先,和解压 OpenCV 源代码。接着,编写交叉编译配置文件,指明交叉编译工具链。运行创建目录命令 mkdir _install,创建安装目录_install。运行配置命令 cmake -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake - DCMAKE_INSTALL_PREFIX=$PWD/_install/

53、,指明交叉编译配置文件和安装路径。运行图形配置命令ccmake .,去掉交叉编译配置文件中 WITH_GTK,WITH_FFMPEG,WITH_GSTREAMER,WITH_TIFF 四个选项。运行编译命令 make,编译 OpenCV 源代码。运行安装命令make install,安装编译产生的文件到安装路径。最后动态库到开发板的/lib 目录。OpenCV第三步需要移植 CGI。首先,和解压 CGI 源代码。接着,运行配置命令./configure -host=arm-linux- -prefix=$PWD/_install/,指明交叉编译工具链和安装路径。运行编译命令 make,编译 C

54、GI 源代码。运行安装命令 make install,安装编译CGI 动态库到开发板的/lib 目录。产生的文件到安装路径。最后,3.4.2网页服务移植BOA 服务器是一个运行在 Unix 或 Linux 下源代码开放、小巧高效的单任务 Web服务器。它不仅支持 CGI,而且适合于系统21。本文需要使用 ARM 开发板来搭建 Web 服务器,为了使开发板能支持 Web 服务,需要对 BOA 服务器进行交叉编译和移植。接下来对这些步骤进行详细说明。首先,和解压 BOA 源代码。接着,运行配置命令./configure,生成编译配置文件 Makefile。修改 Makefile 文件中的编译工具链

55、为交叉编译工具链。运行编译命令make,编译 BOA 源代码。拷贝编译生成的 BOA 服务器到开发板/sbin 目录。在开发板/etc 目录下创建 boa 文件夹,并拷贝 BOA 配置文件到该文件夹。最后,修改 BOARoot 指向网页所在文件夹的路径,ScriptAlias 指配置文件,使配置文件中的向网页运行 CGI 程序所在文件夹的路径。启动 BOA 服务器,在浏览器中输入开发板的 IP 地址,可以看到基于 ARM 的车牌识别系统运行效果,如图 26 所示。图 26基于 ARM 的车牌识别系统3.4.3文件系统制作文件系统是操作系统用于明确磁盘或分区上的文件的方法和数据结构,即在设备上组

56、织文件的方法22。根据设备的硬件特性和系统需求,不同的文件系统有Linux 应用中,主要的设备有 RAM 和 Flash 两种,不同的应用场合。在常用的基于设备的文件系统类型包括 NFS、YAFFS2、JFFS2、UBIDS、RAMDISK等。NFS 文件系统的特点在于可以通过网络直接修改文件系统里面的内容,缺点是需要连接网络,一般在开发阶段中使用。YAFFS2 文件系统的特点在于可以直接烧写到辅存中,便于文件的和保存,一般在实际应用中使用。本文根据开发阶段和实际应用两种不同的需求,分别制作了 NFS 和 YAFFS2 两种根文件系统。接下来对这两种文件系统的制作方法进行详细说明。第一步需要创

57、建系统目录。Linux 根文件系统包括 bin、dev、etc、lib、mnt、proc、sbin、sys、tmp、usr、var 十一个文件夹,以及 usr 文件夹下的 bin、lib、sbin 三个文件夹。需要创建这些文件夹来对 Linux 系统中的应用程序、设备文件、配置文件、库文件等提供分类。第二步需要创建设备文件。Linux 系统启动时必须包含空设备文件 null 和控制台终端设备文件 console。运行命令 mknod -m 666 null c 1 3 来创建空设备文件,-m 666表示所用用户拥有可读可写权限,c 表示字符设备,1 表示主设备号,3 表示次设备号。运行命令 m

58、knod -m 666 console c 5 1 来创建控制台终端设备文件,-m 666 表示所用用户拥有可读可写权限,c 表示字符设备,5 表示主设备号,1 表示次设备号。第三步需要创建配置文件。Linux 系统启动时必须包含 rcS、stab、inittab、profile四个配置文件。rcS 文件中包含 Linux 系统初始化时运行令。为了使系统能够自动启动 Web 服务,需要在该文件中添加/sbin/ifconfig eth0 30 和/sbin/boa 两条命令,用来设置开发板 IP 地址和启动 BOA 服务器。第四步需要移植系统工具。Linux 系统中包含许多常用的系统命令,例如

59、显示文件列表 ls,切换当前路径 cd 等,可以通过移植 BusyBox 来实现。首先,和解压BusyBox 源代码。接着,配置 BusyBox 的交叉编译工具链和安装路径。运行编译命令 make,编译 BusyBox 源代码。最后,运行安装命令 make install,安装编译产生的文件到安装路径。第五步需要制作文件系统。NFS 文件系统是网络文件系统,需要设置引导程序启动参数,来指明根文件系统的路径。YAFFS2 文件系统是辅存文件系统,首先通过mkyaffs2image 工具压缩文件系统,然后烧写到辅存,同时需要设置引导程序启动参数,来指明根文件系统的位置。4结果分析4.1 车牌学习结

60、果分析车牌学习中训练的车牌样本和非车牌样本各 40 个,测试的车牌样本和非车牌样本各 10 个。车牌识别率如表 1 所示。从表 1 中可以得出当支持向量机的核函数为线性核函数,并且训练迭代次数为 1000 次时,支持向量机能够很好的对车牌图像进行识别。表 1车牌识别率4.2 字符学习结果分析字符学习中训练的字符样本各为 80 个,测试的字符样本各为 20 个。字符识别率如表 2 所示。从表 2 中可以得出当神经网络包含三层,隐藏层节点为 20 个,学习算法为弹性反向 算法,并且训练迭代次数为 1000 次时,神经网络能够很好的对字符图像进行识别。除了字符 E 的识别率没有达到 100%之外,其

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论