来源:中国一卡通网 作者: 发布时间:2016-01-08 16:54:37 字体:[大 中 小]
摘 要:本章首先对车牌自动识别系统的总体结构进行了一个粗略的说明,主要包括系统的硬件部分和软件部分;然后比较详细地介绍了车牌识别系统的软件流程;最后对本章进行总结。
车牌自动识别系统
本章首先对车牌自动识别系统的总体结构进行了一个粗略的说明,主要包括系统的硬件部分和软件部分;然后比较详细地介绍了车牌识别系统的软件流程;最后对本章进行总结。
车牌识别系统的总体结构
车牌自动识别系统是一个以微处理器为核心,基于图像处理、模式识别、神经网络等技术的高度智能的电子系统,主要由摄像头、视频采集接口、辅助照明装置、计算机和识别软件组成。当车辆通过关卡,经过车体位置传感器的敏感区域时,传感器发送一个信号给图像采集控制部分。采集控制部分控制摄像机采集一幅汽车图像送至计算机内。计算机内的软件模块从输入图像中找到牌照的位置,对牌照作字符分割,得到各个字符的点阵数据。字符识别模块从点阵数据中提取字符特征数据,输入神经网络进行识别,得到字符识别的结果。一个典型的车牌自动识别系统通常由车辆检测、图像采集、车牌提取、字符分割和字符识别等部分组成,其中,车辆检测模块一般使用地感线圈,它可以检测当前是否有车辆通过。目前,随着视频检测技术的提高,有些已经开始使用视频流检测系统,检测是否有车辆通过。图像采集部分包括光线不足时自动光源补足和CCD摄像头,以摄取清晰的车辆图像。车牌提取、字符分割和字符识别部分由计算机或DSP处理器组成,可以完成对车牌的识别。车辆图像采集车牌提取字符分割字符识别车辆检测。
车牌识别系统的硬件部分
车牌识别系统的硬件部分主要包括三个部分:
(1)图像采集部分
图像采集由CCD彩色摄像机和图像采集卡组成。为了提高系统对天气、环境、光线等的自适应性,摄像机一般采用自动对焦、自动光圈的一体化机;车辆检测通常采用车辆传感器,如地感线圈、红外线等。图像采集的工作过程是:首先在摄像机前方检测点设置一传感器,当汽车通过检测点时,传感器向主机发出信号,系统即自动摄下车辆的图像,并将图像输入计算机。但是在这样的图像上,由于车辆处于运动状态以及污损等原因,车牌画面往往不够清晰,难以从中摄取需要的信息。为了解决这一问题,一方面我们尽量采取清晰度更高和更精确的CCD摄像机;另外我们通过设置更精确的硬件来保证图像的清晰度。比如说在摄取车牌图像时加强光照,尽量使车牌的位置和摄像机的距离为最佳等等。这样可以为后续图像处理减小难度和提高系统的精确度以及稳定性。
(2)图像处理部分
主要涉及数字图像的处理过程,一般使用嵌入式的硬件系统,比如说可以采用DSP处理器来集成系统,这样的系统安装和使用比较方便,应用范围更广。当然在特定条件下也可以使用计算机来完成。
(3)结果输出部分
将识别出的车牌号码通过液晶屏幕或者显示器输出出来,必要的时候需要与车辆数据库建立连接,从而进一步显示出该车辆的状态。
车牌识别系统的软件部分
车牌自动识别系统的软件部分包括车牌提取、字符分割和字符识别等三个算法,即从背景复杂的含有车牌的图像中提取出车牌图像,然后对提取的车牌图像进行必要的预处理、分离出单个字符,接着提取字符的特征并与标准字符进行比对,得到待识别车牌的车牌号码,并与车牌数据库进行连接以便确定该车辆的状态。在本章的后续部分我们将对本文中的车牌识别算法做比较详细的说明。
车牌识别系统的软件流程
车牌识别系统的软件部分实现的功能就是把输入的车牌图像(由硬件部分采集的数字图像)进行处理后,得到该车牌所代表的车牌号码。一般把车牌识别系统的处理过程分为三个大步骤:(1)车牌定位;(2)字符分割;(3)字符识别。
车牌定位算法实现的功能就是从一幅复杂背景的数字图像中分割出车牌图像,要求具有较高的识别率和较强的环境适应性。
图像的预处理
由于从摄像机前端得到的原始图像是从不同的环境和针对不同的车辆拍下的,因此在质量上有相当大的差别。如何处理这些质量参差不齐的图像,得到更适合后端图像处理的数据就是图像预处理需要完成的工作。
首先,我们得到的图像可能是彩色图像,但是由于彩色图像数据量巨大,处理起来不方便且速度较慢,所以有必要将彩色图像转换为灰度图像。其次,图像的亮度不同。有的图像较暗,有的图像较亮,需要将这些图像转换为亮度比较接近的图像,这可以用直方图均衡化来实现,以增强图像的对比度。最后,所得图像可能会受到噪声的干扰。当然,对于不同的环境和设备,噪声的类型是不同的,比如说有高斯滤波,中值滤波等等,具体使用那一种滤波,要根据应用环境和系统硬件设备情况而定。
车牌定位算法
车牌提取一直是车牌识别中备受关注的一步,因为它是整个车牌识别的第一步。它的成功与否直接影响到后续的步骤,并最终使我们系统的速度和识别率受到影响。图像预处理车牌提取。
因此,很多人都致力于车牌定位算法的研究,也提出了很多切实可行的方法。本人也提出了两种有效的车牌定位算法,一种是基于高帽变换和小波变换的车牌提取方法,另一种是基于投影法和数学形态学的车牌提取方法。前一个算法的特点是采用水平定位和竖直定位相结合,首先采用高帽变换突出了车牌区域,实现了车牌的水平定位;然后通过小波变换对车牌区域进行特征提取,实现了车牌的竖直定位;最后根据得到的车牌水平位置和竖直位置信息,从原始图像中提取出车牌。后一个算法的特点是首先采用投影法,利用水平一阶差分图的水平投影进行车牌水平定位,即通过对一阶差分水平投影曲线进行扫描,得到较大的波峰值或波峰积分值较大的波峰在平滑的一阶差分水平投影曲线中的位置坐标,进而利用这些波峰位置坐标进行车牌水平定位运算,得到一个或多个车牌水平位置候选区域在原始图像中的位置坐标;然后在竖直定位时,结合数学形态学的特性,利用闭运算,在原始图像中突出车牌区域的位置,通过合理选择二值化阀值,对变换后的图像进行二值化,实现车牌竖直定位,克服了基于扫描行的车牌提取方法和基于彩色的车牌提取方法难以解决在照明不均匀环境下定位准确率的问题。这两种车牌定位方法在第三章中将会有详细的论述。
车牌图像预处理
从车牌定位算法得到的车牌图像具有一些特殊性,所以我们必须首先对他们进行预处理。预处理一般包括归一化和图像增强。之所以要归一化,是因为有的车牌图像的大小各异,我们必须把它们转化为统一大小的车牌;还有就是车牌原先的颜色搭配不同,有的车牌是黄底黑字,转换为灰度图像过后字符的灰度值比车牌预处理定位字符的位置分割字符车牌图像字符图像车牌背景的灰度值要小,而有的车牌是蓝底白字,转换为灰度图像过后就是字符亮而背景比较暗。所以必须统一为黑底白字的图像。同时,车牌图像中基本上只含有车牌,不包括其他的区域,因此我们可以利用这一特点把图像尽量增强。有统计表明,车牌图像面积的20%~30%是字符区域,其余的是车牌的底色区域。我们可以加强这些灰度值较高的字符区域,使之相对于背景而言更突出一些。
定位字符的位置
我们知道,一个普通车牌包括七个字符,且字符大小一定,皆为90mm高,45mm宽。而且字符间的位置,间距是一定的,排列也相当有规律。所以我们一旦确定一个字符的位置并且知道它是第几个字符的话,其他字符的位置我们也就一并确定了。即使车牌上字符出现一定的粘连,但是一般来说还是可以找到一个或者多个没有粘连的字符的。
所以,在这里本人提出了两种字符定位方法,一种是基于拉普拉斯变换、区域生长法和车牌先验知识相结合的车牌字符分割方法,另一种是基于快速区域标号算法和车牌大间隔定位方法的车牌字符分割方法。前一种算法的特点是首先采用拉普拉斯算子对进行车牌区域进行边缘检测;然后,以拉普拉斯变换检测到的边缘点为“种子”点进行区域生长,得到“初步”字符候选区;接着,去除高度、宽度和高宽比明显不符合字符区域要求的“初步”字符候选区,得到“中间”字符候选区域;然后,结合车牌的先验知识修正和补足字符区域,得到“最终”字符候选区域。后一种算法的特点是首先计算二值化阈值把车牌灰度图像转化为二值图像;然后,用快速区域标号算法对车牌二值图像进行连通性分析得到字符的候选区域;接着,从车牌二值化图像中定位出大间隔的位置;然后,结合车牌大间隔的位置特征修正和补齐字符区域,得到最终的字符区域。这两种车牌字符分割方法在第四章中将会有详细的论述。
车牌定位
本章详细介绍了如何从含有车牌的原始图像中提取车牌图像。在这一章,我们将介绍两种车牌定位的算法,分别是基于高帽变换和小波变换的车牌提取方法与基于投影法和数学形态学的车牌提取方法。实验证明,我们所开发的算法是有效而且实用的。在此之前我们将就车牌提取在国内外常用的算法和技术发展状况作一个较详细的说明。车牌定位作为车牌处理流程的前端步骤,具有相当重要的作用,定位的好坏将直接影响到车牌识别的有效性和准确率。
常用的车牌定位方法
车牌定位是车牌识别中的关键环节之一。车牌定位是否成功以及定位的准确程度,直接决定了后期能否进行识别以及识别的效果。由于车牌可以出现在图像上的任何位置,而且由于受天气、背景、磨损等外界干扰因素的影响,造成得到牌定位一直是车牌自动识别系统中的重点和难点。为了准确、快速地定位出车牌区域,人们已经研究了许多定位方法,这些算法基本上都或多或少的借助了车牌自身特征来实现的。车牌自身具有很多的固有特征,这些特征对于不同的国家是不同的。从人的视觉角度出发,我国车牌具有以下可用于定位的特征:
(1)车牌底色往往与车身颜色、字符颜色有较大差异;
(2)车牌有一个连续或由于磨损而不连续的边框,车牌内字符有多个,基本呈水平排列,所以在牌照的矩形区域内存在较丰富的边缘,呈现出规则的纹理特征;
(3)车牌内字符之间的间隔比较均匀,字符和牌照底色在灰度上存在跳变,而字符本身与牌照底的内部都有较均匀灰度;
(4)不同图像中牌照的具体大小、位置不确定,但其长度比变化有一定范围,存在一个最大和最小长宽比。根据这些特点,人们提出了多种车牌定位的方法。下面介绍几种具有代表性的方法。
基于灰度图像的定位方法
一般来说,单色图像的灰度级有256级、128级和64级不等,通常所采用的为256级的灰度图像。灰度图像中每一个点的灰度值可以用一个单值实函数来表示,该函数在某点的值称为在该点灰度级或亮度。由于灰度图像的函数表示比较简单,在图像处理时可以减少运算时间,提高运算速度。因此目前的大多数研究都是基于灰度图像的,以满足车牌识别的实时性需求。
基于特征的车牌定位方法
如前文所述,尽管车牌图像的背景较为复杂,可能包含了行人、建筑和其他车辆等干扰因素,但车牌区域具有较为稳定的特征,即存在若干各等高且水平排列的字符,字符色和牌照底色的灰度值存在明显的跳变,车牌区域存在丰富的边缘特征,因此被广泛应用于车牌的定位研究中。在文献[18]中,作者首先对车辆灰度图像在横向上进行一阶差分运算,并累积其差分直方图。对此直方图采用离散指数平滑法进行平滑,而且具有一定宽度和对称性,因此可以利用这一特征来排除一部分峰点。然后对横向分割出来的车牌子图像应用一个纵向的边界抽取模板作运算,再作纵向累加直方图并平滑,这样得到直方图的许多峰,最后对这些峰的宽度进行从小到大的排序,应用相应的规则来确定车牌所处的位置。作者使用一阶微分算子对原始图像的边缘进行预处理,并在此基础上运用数学形态学的闭运算获得车牌的候选区,然后采用投影法剔除假车牌,定位出真车牌。作者首先将输入的彩色图像进行灰度化,随后在灰度图像上利用滤波算子进行滤波预处理,并生成一个门限,将滤波后的图像转化为二值图像。由于经过预处理后,车牌的投影具有明显的竖线条区域,可以根据这个特点,在二值图像中进行区域搜索,寻找出具有较多竖线条的区域,并将它们作为候选的车牌位置。然后根据车牌号码在水平方向上的投影具有明显的规律以及字符间具有较低的谷点的规律,并结合车牌的高宽比来切割出车牌的位置。根据车牌区域的特征设计了一个处理函数,使用该函数对原始图像进行处理后,突出图像中的竖直边缘,并适当调节参数,使车牌区域的特征得以放大,在此基础上提取车牌的位置。
基于数学形态学和遗传算法等工具的定位方法
数学形态学中的腐蚀和膨胀以及在此基础上产生的开、闭运算在车牌定位中得到了较为广泛的运用。腐蚀是一种消除边界点的过程,结果是使目标缩小,孔洞增大,因而可有效地消除孤立噪声点。膨胀是将与目标物体接触的所有背景点合并到物体中的过程,结果是使目标增大,孔洞缩小,可填补目标物体中的空洞,形成连通域。一般情况下,腐蚀与膨胀是不可恢复的运算,但通过腐蚀与膨胀可以构成开运算和闭运算。先腐蚀后膨胀的过程称为开运算,它具有消除细小物体,并在纤细处分离物体和平滑较大物体边界的作用;先膨胀后腐蚀的过程称为闭运算,它具有填充物体内细小空洞,连接邻近物体和平滑边界的作用。通过开、闭运算,可以将目标区域显示出来。在文献[22]中,作者通过对灰度图像采用属性开运算,削去满足特定属性的峰部,确定出目标以及少量非目标区域,然后计算出图像的倾斜角及目标区域所在范围。这种算法考虑了车牌的倾斜角度,能够有效的确定文字区域。作者将小波分析与数学形态学相结合,通过小波多尺度分解提取出纹理清晰且具有不同空间分辨率、不同方向的边缘子图,其水平方向低频、垂直方向高频的这一细节分量,主要代表车牌的目标区域。然后,用数学形态学方法对小波分解得到的细节图像进行一系列膨胀和腐蚀运算,有效的消除细小的物体,增强目标区域内的连通性,从而在结果图像中只留下了车牌这一待寻的目标。作者首先使用Sobel边缘检测算子,并根据经验和合理的推理选取阈值对图像进行二值化,然后利用形态学的闭运算和开运算,对二值图像进行处理,通过膨胀将邻近的边缘凝聚成一个连通的整体,用某个形状的结构对图像进行腐蚀,滤除细碎的边缘,然后对图像进行进一步聚类,并根据相关准则进行筛选,得到车牌区域。遗传算法是建立在自然选择和群体遗传学机理基础上的随机、迭代、进化,具有广泛适用性的搜索方法,结合了达尔文的适者生存和随机信息交换,消除解中的不适应因素,利用了原有解中已有的知识,从而有力的加快了搜索过程。而车牌的提取从本质上来说可以看作是一个在一幅复杂图像中寻找最符合牌照特征的区域的过程,也就是一个在参数空间中寻找最优定位参数的问题,而这正是遗传算法最为擅长的。因此作者从这一点出发,提出了利用遗传算法对图像进行优化搜索,设计区域的特征矢量,构造出适应函数,寻找到车牌区域的最佳定位参量。
基于c++的车牌自动识别算法
车牌识别系统软件平台。搭建了一个基于c/c++语言的算法演示平台,该平台集成了我们算法研究的结果,以及一些通用的数学算法,该平台是完全开放的,可以自由在其基础上增加新的算法并可方便的观察算法结果。提出的算法均已在软件平台上正确实现,并使用大量从各种不同环境下的具采集有代表性的车辆图像作为算法测试数据源对算法进行测试,研究了车牌自动识别系统是一个以微处理器为核心,基于图像处理、模式识别、神经网络等技术的高度智能的电子系统,主要由摄像头、视频采集接口、辅助照明装置、计算机和识别软件组成。当车辆通过关卡,经过车体位置传感器的敏感区域时,传感器发送一个信号给图像采集控制部分。采集控制部分控制摄像机采集一幅汽车图像送至计算机内。计算机内的软件模块从输入图像中找到牌照的位置,对牌照作字符分割,得到各个字符的点阵数据。字符识别模块从点阵数据中提取字符特征数据,输入神经网络进行识别,得到字符识别的结果。一个典型的车牌自动识别系统通常由车辆检测、图像采集、车牌提取、字符分割和字符识别等部分组成,其中,车辆检测模块一般使用地感线圈,它可以检测当前是否有车辆通过。目前,随着视频检测技术的提高,有些已经开始使用视频流检测系统,检测是否有车辆通过。图像采集部分包括光线不足时自动光源补足和CCD摄像头,以摄取清晰的车辆图像。车牌提取、字符分割和字符识别部分由计算机或DSP处理器组成,可以完成对车牌的识别。车辆图像采集车牌提取字符分割字符识别车辆检测 并利用Visual C+ + 6. 0编程实现。目前该系统已经成功应用于某些实际场合,并取得了良好效果。
switch( Pic)
{case 1: hBitmap=(H BITMAP) LoadImage( AfxGetInstanceHandle) ,
"res\ 1. bmp", IMAGE_BITMAP, 0, 0,
LR _ LOADFROMFILE | LR _ CREAT EDIBSECT ION) ;
break;:
SetCursor ( : : LoadCursor ( NULL, IDC_CROSS) ) ;
case 2:hBitmap=( HBITMA P) LoadImage( AfxGet InstanceH andle( ) ,
"res\ 2. bmp", IMAGE_BITMA P, 0, 0,
LR _ L OA DFROMFILE | LR _ CREA TEDIBSECT ION) ;
break;
SetCursor ( : : LoadCursor( NU LL, IDC_CROS S) ) ;
break;
case 3:
break;
default:
break;}
部分源程序如下:
now_Longitude= m_left + m_ptOrign. x* k_ longit ude;
now_Latit ude ?? = m_bott om- m_ptOr ign. y* k _latit ude;
char* buf1;
buf1= _ ecvt ( now _Longitude, longit ude _ precision,& longitude_decimal, & sign) ;
st rcpy( longitude_buf , buf1) ;
/ /确定需要存储的数据位数
if( now_L atitude< 100)
lat itude_precision= 10;
if( now_L atitude< 10)
lat itude_precision= 9;
/ /转换纬度坐标以待显示* buf2;
buf2= _ ecvt ( now _ L atitude, lat itude _ precision,
& latitude_decimal, & sign) ;
strcpy( latitude_buf, buf2) ;
if( IDOK= = TRUE)
{
myIcon. Draw_Point( dlg. m_Lat itude, dlg. m_Longi??
tude, this) ; / /点击确定时,在此处画点
CSaveDraw * pt _SaveDraw= new CSaveDraw( dlg. m
_Latitude, dlg.m_L ongit ude,
dlg. m_Lat itude, dlg. m_Longit ude,m_linestyle, 3, m_
clr ,m_nL ineWidt h, T RU E) ;
m_pt rAr ray. A dd( pt_SaveDraw) ;
/ /存储,以待重绘( 3代表重绘点)
CsaveT rack* pt _S aveTrack= new CSaveTrack ( dlg.
m_L atitude, dlg.m_Longitude, trackcount) ;
m_pt rT rack. A dd( pt_SaveT rack) ; / /存储,以待重绘}
整体设计流程
采用此种新方法进行IC设计的整体流程如图1所示。从系统设计(虚拟机)入手,用C ++来搭建所需要的系统模型。通过C ++语言的设计与验证[4],可实现向上一层次系统级延伸完成软件仿真,再由Verilog与C ++的一致性转化,将软件设计精确地转化到硬件级上。这样,向上可进行软硬件的联合仿真,向下能够实现下一层次的物理级设计。通过C ++和Verilog形成的上层和下层的纵向层次关系,可实现SOC设计从系统到物理实现的一致与准确。同时,当C ++和Verilog程序在同步的情况下进行编写设计时,可使得两者相互独立,构成平行的横向层次关系。通过C ++和Verilog进行仿真测试,将两者的数据进行对比和等价验证,便确保了所编程序具有很高的容错能力,进一步保证了SOC设计从系统到物理实现的一致与准确。
C ++特性在IC设计中的应用类是C ++最重要的特征,通过类来定义要解决的特定问题,这样做的好处是对每个问题都能够提供最合适的解决方案,所以在设计的开始就可以从类出发。类通过把数据和方法包装在一起并将它们视为整体来封装信息,在结构上隐藏了应用细节并严格限制对其数据和操作的外部访问,保护了数据的完整性。为此,C ++在类中提供了三种数据类型:公有数据(public data)、私有数据(private data)和受保护型数据(protected data)。在应用中,对象的公共成员可由外部程序调用。这种调用由控制各对象相互作用的顶层模块来完成,控制码指挥对象用某种方法或运算访问数据。任务完成后,接收对象返回信息给发送者(输出结果)或给其他对象传递消息,要求执行其他任务。对于以往过程化编程语言来说,可以将它的程序结构表示为:程序=算法+数据结构。而对于C ++这种面向对象的编程语言来说,它的程序结构则可表示为:对象=算法+数据结构,程序=对象+对象+对象+对象+…。根据这一特性,可以看出整个C ++程序设计全面围绕面向对象的方式进行,当使用所定义的类类型时,是通过创建类对象(也称作类的实例)的方式来实现的。类中的成员和成员函数可通过类对象来调用。
Verilog与C ++的对比分析
在设计的过程中需要对两种语言做必要的对比分析,以使Verilog和C ++能够更好的相互配合,保证所设计的逻辑电路具有描述的一致性。对于基础模块的定义,在Verilog中可以使用module来实现;C ++中则可通过类(class)定义来实现。不过, 在Verilog中只能定义有形(concrete)模块,不能定义抽象(abstract)模块。也就是说接口(interface)和实现(implementation)不能分离;而在C ++中,既可以使用有形类(concrete class),也可以使用抽象类(abstract class)。两种语言都可以根据定义出的基础模块来进行操作对象的实例化。在程序的执行处理上,C ++程序是一行接一行依次执行的,属于顺序结构,而Verilog描述的硬件是可以在同一时间同时运行的,属于并行结构。由于两者执行结构的不同,如在处理非阻塞赋值语句的时候,则需要考虑两种语言的语句执行情况,以保证两者语义的一致性。在Verilog中,当两个非阻塞赋值语句a<= b + c和b<= a + d,两条语句需在并行执行条件下才能保证其正确的语义。而在顺序执行程序的C ++语句中,则需加入a的备份变量a_ temp,使用序列a_ temp = b + c,b= a + d,a = a _ temp来完成这两个非阻塞赋值语句。Verilog中模块的调用与C ++语言的函数调用是有区别的,在Verilog中模块调用,可以使用名称绑带来指定端口;在C ++中若调用有参函数,则只能按顺序书写。C ++语言没有时间关系,即在时序的控制上需通过设置状态发生器来进行协调。同样,对于Verilog语言,为了最终可以使用综合工具把Verilog源代码转化为门级逻辑,则Verilog程序必须做到没有任何外加的人工延时信号,也就是需要表示为有限状态机。在逻辑电路设计过程中两种语言对不同的接口类型需区别对待。若某一模块有3种不同类型的接口input_ in、output_ out和inout_ io,输入口_ in和输出口_ out属于单向口,可由相应的连接端持续赋值即可。而对于双向传递的_ io口来说,则需将其分解为一个输入端和一个输出端,同时引入另一变量,以保证分解后的双向连接。两种语言所使用到的关键字和运算符则十分相似,这便提高了在设计过程中实现转化的可行性。通过以上对两种语言的对比分析,可以看出,C ++语言与Verilog硬件描述语言类似,只要运用合理的转化设计方法,就可以准确一致的实现SOC设计在软件与硬件上的相结合。
C ++与Verilog之间的设计转化
在设计的过程中,需要将C ++程序转换成类似Verilog的结构程序[10],保证描述的逻辑电路达到设计要求;同时,又不能使用C ++中较为抽象的语法,如迭代、指针、不确定次数的循环等,以使Verilog描述达到可综合的目的。这里可以采用Visual C ++ 6. 0来进行C ++程序代码的编译与调试,并可通过C ++到Verilog软件进行代码间的转化,下面结合数字信号处理器的设计对此方法进行设计应用。
模块的定义方式
在DSP的设计过程中,其包含有乘法累加器、运算器、状态生成器、指令存储器和外部主机接口等基础模块。以运算器ALU模块中的简化程序为例,对实现Verilog和C ++程序的编写方式加以说明。
parameter ADDC = 2;
always @ ( i_ alu_ state)∥判断状态标志位
case ( r_ alu_ opc[4: 0])
ADDC: begin∥带进位加法运算int i_ alu_ opc[4: 0];∥输入信号
int o_ alu_ z[23: 0];∥输出信号
private:
int r_ alu_ opc[4: 0];∥操作码寄存器
int shift_ amount;∥移位变量
∥…} ;
对于信号的初始化则可在构造函数中完成,这样可以保证在每个对象首次使用之前初始值被编译器自动应用在每个类对象上。对于类的成员函数可通过域区分符在类体外进行定义,不过事先需要在类体内进行声明,然后将类定义作为头文件。类体内用于描述模块内部功能操作的成员函数:
Operation( )声明为private类型,再声明一个public类型成员函数Run( ),其中包含内部功能函数,用于外部对类模块的调用。如
class ALU{
private:
void Operation( ) ;∥指令操作函数
public:
void Run( ) ;∥功能模块运行函数
∥…} ;
ALU∶ ∶ALU( )
{i_alu_state = 0;∥状态标志位
for ( i = 0; i<5; i + + )
r_alu_opc[i]= 0;∥ALU指令操作码
∥…}
void ALU∶∶Run( )∥ALU操作运行函数
{Operation( ) ;
Show( ) ;∥变量输出打印函数}
void ALU∶∶Operation( )
{switch( opc_compute)
{case 2:∥ADDC带进位加法运算
alu_c = alu_a + alu_b + Carry;
break;}
∥……}
模块的连接方式
各基础功能模块编写好后,需将各模块连接起来以构成整体。可以通过编写顶层模块Top来实现基础模块的互连。
在Verilog的顶层Top模块中,将各基础模块文件包含进去,然后在引用时用“·”符号,标明原模块是定义时规定的端口名,
`include "./clkgen.v"∥时钟生成器
`include "./alu.v"∥ALU运算器
∥…
alualu0(.o_alu_z( zbus),i_alu_x( xbus),
.i_alu_y( ybus) )∥模块端口连接
即可实现括号中的连接信号与被引用模块的端口相对应。
结论
本文通过分析C ++这种面向对象的编程语言的特性,使C ++可以在集成电路的设计中发挥出重要的作用,随着车牌自动识别系统性能的提高,其应用也在逐渐深入到我们生活的方方面面。如今市场上已经出现了一些车牌识别系统,它们在系统规定的条件和环境下车牌的识别效果比较良好,但一旦条件发生比较大的变化,或者在一些比较特殊的环境下,比如说雾天、雨天和晚上等拍摄图像质量较差的环境下,这些系统出现识别率迅速下降和拒识等等一系列问题,系统的通用性比较差。因此,寻找一个适合大多数情况和大部分环境的、更加通用的车牌识别方法显得十分有必要和重要。也只有当在大多数环境下LPR都具有很高的性能时,LPR才会得到更加广泛的运用。综上所述,车牌识别技术是未来交通领域必不可少的技术,现在进行车牌识别技术的研究和应用开发是具有相当的理论价值和现实意义的。
推荐文章
论坛热帖