有代码的论文

车牌提取系统的设计与实现

摘 要

汽车牌照自动识别系统是制约道路交通智能化的重要因素, 包括车牌定位、字符分割和字符识别三个主要部分。本文首先确定车辆牌照在原始图像中的水平位置和垂直位置, 从而定位车辆牌照, 然后采用局部投影进行字符分割。在字符识别部分, 提出了在无特征提取情况下基于支持向量机的车牌字符识别方法。实验结果表明, 本文提出的方法具有良好的识别性能。随着公路逐渐普及,我国的公路交通事业发展迅速,所以人工管理方式已经不能满着实际的需要,微电子、通信和计算机技术在交通领域的应用极大地提高了交通管理效率。汽车牌照的自动识别技术已经得到了广泛应用。

文章介绍了车牌提取系统使用的关键技术,设计原理,详细设计步骤和系统实现。

关键词:车牌提取;图像识别;设计与实现

ABSTRACT

Car license plates recognition system is restricted by the road traffic intelligent important factors, including license plate localization, character segmentation and character recognition three main parts. This paper first determine the vehicle plate in the original image level and vertical position, thereby positioning vehicle licensing, then use local projection for character segment. In character recognition, and puts forward the part without feature extraction cases based on support vector machine plate character recognition method. Experimental results show that the proposed method has good recognition performance. With the growing popularity of highway in China, road traffic undertakings have developed rapidly, so artificially management mode is not filled with practical needs, microelectronics, communications and computer technology in traffic areas of application greatly improve the traffic management efficiency. Car licence automatic identification technology has been widely used.

This article introduces the license plate extraction systems use the design

principle and key technology, detailed design steps and system implementation.

Keywords: license plate extracted; Image recognition; Design and implementation

目 录

摘 要............................................................................................................................ 1

ABSTRACT . .................................................................................................................. 2

目 录............................................................................................................................ 3

1 相关技术介绍............................................................................................................ 4

1.1 MFC(微软基本类库) ................................................................................... 4

1.2 GDI(图形设备接口) . ....................................................................................... 4

1.3 MFC开发软件 ................................................................................................ 5

2 设计原理.................................................................................................................... 5

2.1 系统流程......................................................................................................... 5

2.2 总体设计步骤................................................................................................. 6

3 详细设计.................................................................................................................... 7

3.1 预处理及边缘提取......................................................................................... 7

3.1.1 图象的采集与转换.............................................................................. 8

3.1.2 边缘提取.............................................................................................. 8

3.2.1 牌照区域的定位................................................................................ 11

3.2.2 牌照区域的分割................................................................................ 11

3.2.3车牌进一步处理................................................................................. 12

3.3 字符的分割与归一化................................................................................... 13

3.3.1 字符分割............................................................................................ 13

3.3.2 字符归一化........................................................................................ 14

3.4 字符的识别................................................................................................... 14

4 关键代码.................................................................................................................. 16

4.1 图像灰度化................................................................................................... 16

4.2 灰度均衡化................................................................................................... 19

4.3 边缘检测....................................................................................................... 21

4.4 预处理........................................................................................................... 23

4.5定位车牌........................................................................................................ 25

4.6 分割车牌....................................................................................................... 32

5 设计结果及分析...................................................................................................... 33

参考文献...................................................................................................................... 35

1 相关技术介绍

1.1 MFC(微软基本类库)

MFC 是Win API与C++的结合,API, 即微软提供的Windows OS(操作系统) 下

应用程序的编程语言接口, 是一种软件编程的规范, 但不是一种程序开发语言本身, 可以允许用户使用各种各样的第三方(如我是一方, 微软是一方,Borland 就是第三方) 的编程语言来进行对Windows OS下应用程序的开发, 使这些被开发出来的应用程序能在Windows OS下运行, 比如VB,VC++,Java,Dehpi编程语言函数本质上全部源于API, 因此用它们开发出来的应用程序都能工作在Windows OS 的消息机制和绘图里, 遵守Windows OS作为一个操作系统的内部实现。上面说到MFC 是微软对API 函数的专用C++封装, 这种结合一方面让用户使用微软的专业C++ SDK来进行Win 下应用程序的开发变得容易, 因为MFC 是对API 的封装, 微软做了大量的工作, 隐藏了好多内节程序开发人员在Windows 下用C++ 和 MFC编制软件时的大量细节, 如应用程序实现消息的处理, 设备环境绘图, 这种结合是以方便为目的的, 必定要付出一定代价(这是微软的一向作风), 因此就造成了MFC 对类封装中的一定程度的的冗余和迂回, 但这是可以接受的。

1.2 GDI(图形设备接口)

GDI 是Graphics Device Interface的缩写,含义是图形设备接口,它的主

要任务是负责系统与绘图程序之间的信息交换,处理所有Windows 程序的图形输出。

在Windows 操作系统下,绝大多数具备图形界面的应用程序都离不开GDI ,我们利用GDI 所提供的众多函数就可以方便的在屏幕、打印机及其它输出设备上输出图形,文本等操作。GDI 的出现使程序员无需要关心硬件设备及设备驱动,就可以将应用程序的输出转化为硬件设备上的输出,实现了程序开发者与硬件设备的隔离,大大方便了开发工作。

GDI 具有如下特点:

(1) 不允许程序直接访问物理显示硬件,通过称为“设备环境”的抽象接口

间接访问显示硬件;

(2) 程序需要与显示硬件(显示器、打印机等) 进行通讯时, 必须首先获得与

特定窗口相关联的设备环境;

(3) 用户无需关心具体的物理设备类型;

(4) Windows 参考设备环境的数据结构完成数据的输出。

1.3 MFC开发软件

MFC开发软件由微软公司提供,常见的有visual studio 2005和visual C++

6.0。本文采用的是后者。 Visual C++是一个功能强大的可视化软件开发工具。

自1993年Microsoft 公司推出Visual C++1.0后,随着其新版本的不断问世,

Visual C++ 6.0已成为专业程序员进行软件开发的首选工具。Visual C++6.0

不仅是一个C++编译器,而且是一个基于Windows 操作系统的可视化集成开发环

境(integrated development environment,IDE)。Visual C++6.0由许多组件

组成,包括编辑器、调试器以及程序向导AppWizard 、类向导Class Wizard等

开发工具。

2 设计原理

2.1 系统流程

由于车辆牌照是机动车唯一的管理标识符号,在交通管理中具有不可替代的

作用,因此车辆牌照识别系统应具有很高的识别正确率,对环境光照条件、拍摄

位置和车辆行驶速度等因素的影响应有较大的容阈,并且要求满足实时性要求。

图2.1 牌照识别系统原理图

该系统是计算机图像处理与字符识别技术在智能化交通管理系统中的应用,

它主要由图像的采集和预处理、牌照区域的定位和提取、牌照字符的分割和识别

等几个部分组成,如图2.1 所示。其基本工作过程如下:

(1)当行驶的车辆经过时,触发埋设在固定位置的传感器,系统被唤醒处

于工作状态;一旦连接摄像头光快门的光电传感器被触发,设置在车辆前方、后

方和侧面的相机同时拍摄下车辆图像;

(2)由摄像机或CCD 摄像头拍摄的含有车辆牌照的图像通视频卡输入计算

机进行预处理,图像预处理包括图像转换、图像增强、滤波和水平较正等;

(3)由检索模块进行牌照搜索与检测,定位并分割出包含牌照字符号码的

矩形区域;

(4)对牌照字符进行二值化并分割出单个字符,经归一化后输入字符识别

系统进行识别。

2.2 总体设计步骤

车辆牌照识别整个系统主要是由车牌定位和字符识别两部分组成,其中车牌

定位又可以分为图像预处理及边缘提取模块和牌照的定位及分割模块;字符识别

可以分为字符分割与特征提取和单个字符识别两个模块。

为了用于牌照的分割和牌照字符的识别,原始图象应具有适当的亮度,较大

的对比度和清晰可辩的牌照图象。但由于该系统的摄像部分工作于开放的户外环

境,加之车辆牌照的整洁度、自然光照条件、拍摄时摄像机与牌照的矩离和角度

以及车辆行驶速度等因素的影响,牌照图象可能出现模糊、歪斜和缺损等严重缺

陷,因此需要对原始图象进行识别前的预处理。

牌照的定位和分割是牌照识别系统的关键技术之一,其主要目的是在经图象

预处理后的原始灰度图象中确定牌照的具体位置,并将包含牌照字符的一块子图

象从整个图象中分割出来,供字符识别子系统识别之用,分割的准确与否直接关

系到整个牌照字符识别系统的识别率。

由于拍摄时的光照条件、牌照的整洁程度的影响,和摄像机的焦距调整、镜

头的光学畸变所产生的噪声都会不同程度地造成牌照字符的边界模糊、细节不

清、笔划断开或粗细不均,加上牌照上的污斑等缺陷,致使字符提取困难,进而

影响字符识别的准确性。因此,需要对字符在识别之前再进行一次针对性的处理。

车牌识别的最终目的就是对车牌上的文字进行识别。主要应用的为模板匹配

方法。

因为系统运行的过程中,主要进行的都是图像处理,在这个过程中要进行大

量的数据处理,所以处理器和内存要求比较高,CPU 要求主频在600HZ 及以上,内

存在128MB 及以上。系统可以运行于Windows98、Windows2000或者Windows XP操

作系统下。

3 详细设计

3.1 预处理及边缘提取

图3.1 预处理及边缘提取流程图

3.1.1 图象的采集与转换

考虑到现有牌照的字符与背景的颜色搭配一般有蓝底白字、黄底黑字、白底

红字、绿底白字和黑底白字等几种,利用不同的色彩通道就可以将区域与背景明

显地区分出来,例如,对蓝底白字这种最常见的牌照,采用蓝色B 通道时牌照

区域为一亮的矩形,而牌照字符在区域中并不呈现。因为蓝色(255,0,0)与

白色(255,255,255)在B 通道中并无区分,而在G 、R 通道或是灰度图象中

并无此便利。同理对白底黑字的牌照可用R 通道,绿底白字的牌照可以用G 通

道就可以明显呈现出牌照区域的位置,便于后续处理。原图、灰度图及其直方图

见图3.2与图3.3。对于将彩色图象转换成灰度图象时,图象灰度值可由下面的

公式计算:

G=0.110B+0.588G+0.302R

(1)

B +G +R G= 3

(2)

图3.2 原图 图3.3 灰度图

3.1.2 边缘提取

边缘是指图像局部亮度变化显著的部分,是图像风、纹理特征提取和形状特

征提取等图像分析的重要基础。所以在此我们要对图像进行边缘检测。图象增强处理对图象牌照的可辩认度的改善和简化后续的牌照字符定位和分割的难度都

是很有必要的。增强图象对比度度的方法有:灰度线性变换、图象平滑处理等。

(1)灰度校正

由于牌照图象在拍摄时受到种种条件的限制和干扰,图象的灰度值往往与实际景物不完全匹配,这将直接影响到图象的后续处理。如果造成这种影响的原因主要是由于被摄物体的远近不同,使得图象中央区域和边缘区域的灰度失衡,或是由于摄像头在扫描时各点的灵敏度有较大的差异而产生图象灰度失真,或是由于曝光不足而使得图像的灰度变化范围很窄。这时就可以采用灰度校正的方法来处理,增强灰度的变化范围、丰富灰度层次,以达到增强图象的对比度和分辨率。我们发现车辆牌照图象的灰度取值范围大多局限在r=(50,200)之间,而且总体上灰度偏低,图象较暗。

(2)平滑处理

对于受噪声干扰严重的图象,由于噪声点多在频域中映射为高频分量,因此

可以在通过低通滤波器来滤除噪声,但实际中为了简化算法也可以直接在空域中用求邻域平均值的方法莱削弱噪声的影响,这种方法称为图象平滑处理。例如,

某一象素点的邻域S 有两种表示方法:8邻域和4邻域分别对应的邻域平均值为

1g (i , j ) =M (i , j ) ∈s ∑f (i , j )

其中,M 为邻域中除中心象素点f(i,j) 之外包括的其它象素总数,对于4

邻域M=4,8 邻域M=8。然而,邻域平均值的平滑处理会使得图象灰度急剧变化的地方,尤其是物体边缘区域和字符轮廓等部分产生模糊作用。为了克服这种平均化引起的图象模糊现象,我们给中心点象素值与其邻域平均值的差值设置一固定的阈值,只有大于该阈值的点才能替换为邻域平均值,而差值不大于阈值时,仍保留原来的值,从而减少由于平均化引起的图象模糊。

图像中车辆牌照是具有比较显著特征的一块图象区域,这此特征表现在:近似水平的矩形区域;其中字符串都是按水平方向排列的;在整体图象中的位置较为固定。正是由于牌照图象的这些特点,再经过适当的图象变换,它在整幅中可以明显地呈现出其边缘。边缘提取是较经典的算法,此处边缘的提取采用的是Roberts 算子。

图3.4 robert算子边缘检测

由上图可以归纳起来以下方面:原始图像清晰度比较高,从而简化了预处理,结合实验过程,得出不是每一种图像处理之初都适合滤波和边界增强。本次汽车车牌的识别,为了保存更多的有用信息。

3.2 牌照的定位和分割

牌照的定位和分割是牌照识别系统的关键技术之一,其主要目的是在经图象预处理后的原始灰度图象中确定牌照的具体位置,并将包含牌照字符的一块子图象从整个图象中分割出来,供字符识别子系统识别之用,分割的准确与否直接关系到整个牌照字符识别系统的识别率。由于牌照图象在原始图象中是很有特征的一个子区域,确切说是水平度较高的横向近似的长方形,它在原始图象中的相对位置比较集中,而且其灰度值与周边区域有明显的不同,因而在其边缘形成了灰度突变的边界,这样就便于通过边缘检测来对图象进行分割。

图3.5 牌照定位于分割流程图

3.2.1 牌照区域的定位

牌照图象经过了以上的处理后,牌照区域已经十分明显,而且其边缘得到了勾勒和加强。此时可进一步确定牌照在整幅图象中的准确位置。这里选用的是数学形态学的方法,其基本思想是用具有一定形态的机构元素去量度和提取图像中的对应形状以达到对图像分析和识别的目的。数学形态学的应用可以简化图像数据,保持它们基本的形态特征,并除去不相干的结构。在本程序中用到了膨胀和闭合这两个基本运算,最后还用了bwareaopen 来去除对象中不相干的小对象。

3.2.2 牌照区域的分割

对车牌的分割可以有很多种方法,本程序是利用车牌的彩色信息的彩色分割方法。根据车牌底色等有关的先验知识,采用彩色像素点统计的方法分割出合理的车牌区域,确定车牌底色蓝色RGB 对应的各自灰度范围,然后行方向统计在此颜色范围内的像素点数量,设定合理的 阈值,确定车牌在行方向的合理区域。然后,在分割出的行区域内,统计列方向蓝色像素点的数量,最终确定完整的车牌区域。

图3.6 行方向区域和最终定位出来的车牌

3.2.3车牌进一步处理

经过上述方法分割出来的车牌图像中存在目标物体、背景还有噪声,要想从图像中直接提取出目标物体,最常用的方法就是设定一个阈值T ,用T 将图像的数据分成两部分:大于T 的像素群和小于T 的像素群,即对图像二值化。均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素。再用模板中的全体像素的平均值来代替原来像素值。

图3.7 裁剪出来的车牌的进一步处理过程图

3.3 字符的分割与归一化

图3.8 字符分割与归一化流程图

3.3.1 字符分割

在汽车牌照自动识别过程中,字符分割有承前启后的作用。它在前期牌照定位的基础上进行字符的分割,然后再利用分割的结果进行字符识别。字符识别的算法很多,因为车牌字符间间隔较大,不会出现字符粘连情况,所以此处采用的方法为寻找连续有文字的块,若长度大于某阈值,则认为该块有两个字符组成,需要分割。

图3.9 分割出来的七个字符图像

3.3.2 字符归一化

一般分割出来的字符要进行进一步的处理,以满足下一步字符识别的需要。但是对于车牌的识别,并不需要太多的处理就已经可以达到正确识别的目的。在此只进行了归一化处理,然后进行后期处理。

图3.10 归一化处理后的七个字符图像

3.4 字符的识别

字符的识别目前用于车牌字符识别(OCR)中的算法主要有基于模板匹配的OCR 算法以及基于人工神经网络的OCR 算法。基于模板匹配的OCR 的基本过程是:首先对待识别字符进行二值化并将其尺寸大小缩放为字符数据库中模板的大小,然后与所有的模板进行匹配,最后选最佳匹配作为结果。模板匹配的主要特点是实现简单,当字符较规整时对字符图像的缺损、污迹干扰适应力强且识别率相当高。综合模板匹配的这些优点我们将其用为车牌字符识别的主要方法。

模板匹配是图象识别方法中最具代表性的基本方法之一,它是将从待识别的图象或图象区域f(i,j)中提取的若干特征量与模板T(i,j)相应的特征量逐个进行比较,计算它们之间规格化的互相关量,其中互相关量最大的一个就表示期间相似程度最高,可将图象归于相应的类。也可以计算图象与模板特征量之间的距离,用最小距离法判定所属类。然而,通常情况下用于匹配的图象各自的成像条件存在差异,产生较大的噪声干扰,或图象经预处理和规格化处理后,使得图象的灰度或像素点的位置发生改变。在实际设计模板的时候,是根据各区域形状固有的特点,突出各类似区域之间的差别,并将容易由处理过程引起的噪声和位移等因素都考虑进去,按照一些基于图象不变特性所设计的特征量来构建模板,

可以避免上述问题。

图3.11 字符识别流程图

此处采用相减的方法来求得字符与模板中哪一个字符最相似,然后找到相似度最大的输出。汽车牌照的字符一般有七个,大部分车牌第一位是汉字,通常代表车辆所属省份,紧接其后的为字母与数字。车牌字符识别与一般文字识别在于它的字符数有限,汉字共约50多个,大写英文字母26个,数字10个。为了实验方便,结合本次设计所选汽车牌照的特点,只建立了4个数字26个字母与10个数字的模板。其他模板设计的方法与此相同。

首先取字符模板,接着依次取待识别字符与模板进行匹配,将其与模板字符相减,得到的0越多那么就越匹配。把每一幅相减后的图的0值个数保存,即为识别出来的结果。

图3.12 识别结果

4 关键代码

4.1 图像灰度化

关键代码:

*

* 函数名称:

* ConvertToGrayScale()

*

* 参数:

* LPSTR lpDIB

*

* 返回值:

* BOOL

*

* 说明:

* 该函数将24位真彩色图转换成256级灰度图

*

************************************************************************/

BOOL WINAPI ConvertToGrayScale(LPSTR lpDIB)

- 成功返回TRUE ,否则返回FALSE 。 - 指向源DIB 图像指针

{

LPSTR lpDIBBits; //指向DIB 的象素的指针 LPSTR lpNewDIBBits; //指向DIB 灰度图图像(新图像) 开始处象素的指针

LONG lLineBytes;

unsigned char * lpSrc; //指向原图像象素点的指针 unsigned char * lpdest; //指向目标图像象素点的指针

unsigned char *ired,*igreen,*iblue;

long lWidth; //图像宽度和高度

long lHeight; long i,j; //循环变量 lWidth = ::DIBWidth(lpDIB); //DIB 宽度 lHeight = ::DIBHeight(lpDIB); //DIB 高度 RGBQUAD *lpRGBquad; lpRGBquad = (RGBQUAD *)&lpDIB[sizeof(BITMAPINFOHEADER)];

//INFOHEADER后为调色板

if(::DIBNumColors(lpDIB) == 256) //256色位图不作任何处理

{ return TRUE;

}

lpdest= new BYTE[lHeight*lWidth]; lpDIBBits = (LPSTR)lpDIB + sizeof(BITMAPINFOHEADER);//指向if(::DIBNumColors(lpDIB) != 256) //非256色位图将它灰度化 { lLineBytes = WIDTHBYTES(lWidth*8*3);//真彩色一个象素为3个字DIB 象素

for(i = 0;i

2;

for(j = 0;j

} //需要做三件事情:1、修改INFOHEADER 2、增加调色板 3、修改原图像灰度值

位置

lLineBytes=WIDTHBYTES(lWidth * 8); //修改灰度值 for(i = 0;i biBitCount = 8; //设置灰度调色板 for(i = 0;i

j ;

} lpSrc = (unsigned char*)lpNewDIBBits + lLineBytes * i+ } } *lpSrc=lpdest[i*lWidth+j]; delete lpdest; return true;

效果如图4.1所示。

4.1 图像变灰效果图

4.2 灰度均衡化

关键代码:

oid CPlateLocateView::OnPlateEqua()

{

// 灰度均衡 // 获取文档 CPlateLocateDoc* pDoc = GetDocument(); //指向DIB 的指针 LPSTR lpDIB; // 指向DIB 象素指针

LPSTR lpDIBBits; // 锁定DIB lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB()); // 找到DIB 图像象素起始位置 lpDIBBits = ::FindDIBBits(lpDIB); // 判断是否是8-bpp 位图(这里为了方便,只处理8-bpp 位图的直方图均衡,其它的可以类推)

if (::DIBNumColors(lpDIB) != 256) { } // 更改光标形状 BeginWaitCursor(); // 调用InteEqualize()函数进行直方图均衡 InteEqualize(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB)); // 设置脏标记 pDoc->SetModifiedFlag(TRUE); // 更新视图 pDoc->UpdateAllViews(NULL); // 解除锁定 ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); // 恢复光标 EndWaitCursor(); // 提示用户 MessageBox("目前只支持256色位图的直方图均衡!", "系统提示" , MB_ICONINFORMATION | MB_OK); // 解除锁定 ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); // 返回 return;

}

效果图如4.2所示。

4.2 灰度均衡化效果图

4.3 边缘检测

//Robert边缘检测运算

// 获取文档 CPlateLocateDoc* pDoc = GetDocument(); // 指向DIB 的指针 LPSTR lpDIB; // 指向DIB 象素指针 LPSTR lpDIBBits; // 锁定DIB lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB()); // 判断是否是8-bpp 位图(这里为了方便,只处理8-bpp 位图的边缘检测,其它的可以类推)

if (::DIBNumColors(lpDIB) != 256)

// 提示用户 MessageBox("目前只支持256色位图的运算!", " 系统提示" , MB_ICONINFORMATION | MB_OK);

// 解除锁定

::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());

// 返回

return;

}

// 更改光标形状

BeginWaitCursor();

// 找到DIB 图像象素起始位置

lpDIBBits = ::FindDIBBits(lpDIB);

// 调用RobertDIB()函数对DIB 进行边缘检测

if (RobertDIB(lpDIBBits, WIDTHBYTES(::DIBWidth(lpDIB)

8), ::DIBHeight(lpDIB)))

{

// 设置脏标记

pDoc->SetModifiedFlag(TRUE);

// 更新视图

pDoc->UpdateAllViews(NULL); *

else { // 提示用户 MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);

} // 解除锁定 ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); // 恢复光标 EndWaitCursor();

效果图如4.3所示。

4.3 边缘检测效果图

4.4 预处理

void CPlateLocateView::OnEditPaste()

{

// 粘贴图像 // 创建新DIB HDIB hNewDIB = NULL; // 打开剪贴板 if (OpenClipboard()) { // 更改光标形状 BeginWaitCursor(); // 读取剪贴板中的图像 hNewDIB = (HDIB) CopyHandle(::GetClipboardData(CF_DIB)); // 关闭剪贴板 CloseClipboard(); // 判断是否读取成功 if (hNewDIB != NULL) { // 获取文档 CPlateLocateDoc* pDoc = GetDocument(); // 替换DIB ,同时释放旧DIB 对象 pDoc->ReplaceHDIB(hNewDIB); // 更新DIB 大小和调色板 pDoc->InitDIBData(); // 设置脏标记 pDoc->SetModifiedFlag(TRUE); // 重新设置滚动视图大小 // SetScrollSizes(MM_TEXT, pDoc->GetDocSize()); // 实现新的调色板 OnDoRealize((WPARAM)m_hWnd,0); // 更新视图 pDoc->UpdateAllViews(NULL);

}

// 恢复光标

EndWaitCursor();

}

效果图如4.4所示。

4.4 预处理效果图

4.5定位车牌

BOOL WINAPI myFindRightAngle(CDC* pDC,LPSTR lpDIB,int* iTop,int* iRight,int* iBottom)

{

LPSTR lpDIBBits; //指向DIB 的象素的指针 LONG lLineBytes; // 图像每行的字节数

unsigned char * lpSrc; //指向原图像象素点的指针

unsigned char pixel = 0; //像素值

long lWidth; //图像宽度和高度

long lHeight;

int i = 0,j = 0;

int lineRequired = 12;//确定一条直线至少要18个象素

int lineLimited = 20;//为确定一条直线应该扫描25个象素

int linePixelCount = 0;//已扫描到的灰度值为255的象素点 iLeft,int*

int pixelCount = 0;//扫描象素时的循环变量 CPen newRedPen(PS_SOLID,2,RGB(255,0,0)); pDC->SelectObject(newRedPen); HGDIOBJ brush=GetStockObject(NULL_BRUSH); pDC->SelectObject((HBRUSH)GetStockObject(NULL_BRUSH));

//INT pzBottom,pzTop,pzLeft,pzRight;

struct topLeftCorner { int pzTop; int pzLeft; }topLeft[1000]; struct bottomRightCorner { int pzBottom; int pzRight; }bottomRight[1000]; int tlCount = 0;//左上角数组的索引 int brCount = 0;//右下角数组的索引 bool findTL=false; //是否找到左上角 bool findBR=false; //是否找到右下角 // 找到DIB 图像象素起始位置 lpDIBBits = ::FindDIBBits(lpDIB); lWidth = ::DIBWidth(lpDIB); //DIB 宽度 lHeight = ::DIBHeight(lpDIB); //DIB 高度 // 计算图像每行的字节数 lLineBytes = WIDTHBYTES(lWidth * 8); for(i = 0;i

} bottomRight[i].pzBottom = 0; bottomRight[i].pzRight = 0;

//计算左上角的位置,可能有多个,保存在topLeft 数组中

for(i = 30;i

{ linePixelCount = 0; for(j = 30;j

{ lpSrc=(unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + pixelCount;

pixel=(unsigned char)(*lpSrc); if(pixel == 255) } /*if(linePixelCount >= lineRequired) { }*/ pDC->MoveTo(j,i); pDC->LineTo(j,i); { linePixelCount++; //pDC->MoveTo(j,i); //pDC->LineTo(j,i); }

{ linePixelCount = 0; for(pixelCount = i;pixelCount

pixel=(unsigned char)(*lpSrc); if(pixel == 255) } if(linePixelCount >= lineRequired) { } if(findTL) { } findTL = false; linePixelCount = 0; topLeft[tlCount].pzTop = i; topLeft[tlCount].pzLeft = j; pDC->MoveTo(j,i); pDC->LineTo(j,i); tlCount++; findTL = true; { linePixelCount++; //pDC->MoveTo(j,i); //pDC->LineTo(j,i); } }

} CPen newGreenPen(PS_SOLID,2,RGB(0,255,0));

pDC->SelectObject(newGreenPen); //计算右下角的位置,可能有多个,保存在bottomRight 数组中 linePixelCount = 0;//重新初始化计数器 for(i = 10;i

{ linePixelCount = 0; for(j = 20;j

{ lpSrc=(unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + pixelCount;

pixel=(unsigned char)(*lpSrc); if(pixel == 255) } if(linePixelCount >= lineRequired) { linePixelCount = 0; for(pixelCount = i;pixelCount > (i - lineLimited);pixelCount--) { lpSrc=(unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - { linePixelCount++; }

pixelCount) + lineRequired + j;

} } pixel=(unsigned char)(*lpSrc); if(pixel == 255) } if(findBR) { } findBR = false; linePixelCount = 0; bottomRight[brCount].pzBottom = i; bottomRight[brCount].pzRight = j + lineRequired; pDC->MoveTo(j + lineRequired,i); pDC->LineTo(j + lineRequired,i); brCount++; { linePixelCount++; } if(linePixelCount >= lineRequired) { } findBR = true; }

//计算车牌的位置

int plateUpHeight = 50; int plateDownHeight = 30; int plateUpWidth = 100; int plateDownWidth = 80; bool plateFind = false;

{ for(j = brCount - 1 ;j >= 0;j--) { if((bottomRight[j].pzBottom - topLeft[i].pzTop > plateDownHeight) && (bottomRight[j].pzBottom - topLeft[i].pzTop plateDownWidth) && (bottomRight[j].pzRight - topLeft[i].pzLeft 2)

} /**iTop = topLeft[0].pzTop; *iLeft = topLeft[0].pzLeft; *iBottom = bottomRight[0].pzBottom; *iRight = bottomRight[0].pzRight;*/ } if(plateFind) break; { } else { } //i++; //j--; *iTop = topLeft[i].pzTop; *iLeft = topLeft[i].pzLeft; *iBottom = bottomRight[j].pzBottom + 10; *iRight = bottomRight[j].pzRight + 15; plateFind = true; break;

} 效果如图4.5所示。

4.5 定位效果图

4.6 分割车牌

/ 粘贴图像

// 创建新DIB HDIB hNewDIB = NULL; // 打开剪贴板 if (OpenClipboard()) { // 更改光标形状 BeginWaitCursor(); // 读取剪贴板中的图像 hNewDIB = (HDIB) CopyHandle(::GetClipboardData(CF_DIB)); // 关闭剪贴板 CloseClipboard(); // 判断是否读取成功 if (hNewDIB != NULL) {

} } // 获取文档 CPlateLocateDoc* pDoc = GetDocument(); // 替换DIB ,同时释放旧DIB 对象 pDoc->ReplaceHDIB(hNewDIB); // 更新DIB 大小和调色板 pDoc->InitDIBData(); // 设置脏标记 pDoc->SetModifiedFlag(TRUE); // 重新设置滚动视图大小 // SetScrollSizes(MM_TEXT, pDoc->GetDocSize()); // 实现新的调色板 OnDoRealize((WPARAM)m_hWnd,0); // 更新视图 pDoc->UpdateAllViews(NULL); // 恢复光标 EndWaitCursor();

最终效果如图4.6所示。

图4.6 最终效果图

5 设计结果及分析

对于光照条件不理想的图象,可先进行一次图象增强处理,使得图象灰度动态范围扩展和对比度增强,再进行定位和分割,这样可以提高分割的正确率。而采用了色彩通道的牌照区域分割算法充分利用了牌照图象的色彩信息,简化了算法的实现,加快了图象的处理速度,具有较高的检出正确率,而且整个过程用 语

言编程实现,无时间滞后感,可以满足实时检出的要求。但是在设计的过程中发现,使用另一幅图像后,识别效果始终没有那么理想。需要做一定的设置后才能识别出相应的字符。

在车牌字符分割的预处理中,用到了对分割出的字符车牌进行均值滤波,膨胀或腐蚀的处理。这在对于有杂点的车牌是很有用的,因为这样可以把字符与字符之间的杂色点去除,只有白色的字符和黑色的背景存在,这样有利于的字符分割进行。

字符识别过程使用的是模板匹配的方法,利用两幅图片相减的方法,找到相减后值最小的,即为相似程度最大的。模板的制作很重要,必须要用精确的模板,否则就不能正确的识别。

对于识别错误情况的分析可知,主要原因:一是牌照自身的污渍等影响了图象的质量;二是牌照字符的分割失败导致的识别错误;再就是部分字符的形状相似性,比如,B 和8;A 和4 等字符识别结果可能发生混淆的情况。

总之,尽管目前牌照字符的识别率还不理想,但是只要在分割出的字符的大小、位置的归一化,以及尝试提取分类识别能力更好的特征值和设计分类器等环节上再完善,进一步提高识别率是完全可行的。

谢 词

在毕业论文结束,毕业设计完成之际,首先向在这半年中给予我帮助的毕业设计指导老师王庚兰老师致以深深的谢意。王庚兰老师在教学任务繁忙的情况下,抽出时间帮助纠正我在设计当中出现的问题,并耐心地为我的论文作校正。她对我的支持,不仅是技术上的,还有心理上的鼓励和督促,她的指导和建议使我受益非浅,没有她的帮助和指导,就不会有我今天的成果。

感谢我的父母在我做毕业设计这段期间给予我很大的精神支持。

最后向关心和支持我学习的所有领导、同学和朋友们表示真挚的谢意!感谢他们对我的关心、关注和支持!

参考文献

[1] 冈萨雷斯.数字图像处理(第二版).电子工业出版社,2007.8

[2] 胡小锋、赵辉.VC++/MATLAB图像处理与识别使用案例精选. 人民邮电出版社,2004.9

[3] 郁梅等,基于视觉的车辆牌照检测, 计算机应用研究,1999(5),P65~67

[4] 叶晨洲,廖金周,一种基于纹理的牌照图象二值化方法, 1999(6),P28~29

[5] 朱学芳等,一种自适应细化方法,模式识别与人工智能,Vol.10,No.2,1997(6),P140~145

[6] 杨万山等,基于BP 神经网络的工程图纸图形符号的识别, Vol.16,No.2,2000

[7] 袁志伟,潘晓露. 车辆牌照定位的算法研究[J].昆明理工大学学报,2001,26(2): 56~60

[8] 刘阳,伊铁源等. 数字图象处理应用于车辆牌照的识别. 辽宁大学学报.2004,65~68

[9] 许志影、李晋平.MATLAB 极其在图像处理中的应用. 计算机与现代化,2004(4)

[10] 崔江、王友仁. 车牌自动识别方法中的关键技术研究. 计算机测量与控制,2003.11(4)

[11] 宋建才. 汽车牌照识别技术研究[J].工业控制计算机,2004,44~45.

[12] 韩勇强、李世祥. 汽车牌照子图像的定位算法[M].微型电脑运用,1999.60~65.

[13] 梁玮、罗剑锋、贾云得. 一种复杂背景下的多车牌图像分割与识别方法[D]. 2003.

[14] 张 引,潘云鹤,面向车辆牌照字符识别的预处理算法,计算机应用研究,1999(7),P85~87

[15] 叶晨洲等, 车辆牌照字符识别系统, 计算机系统应用,1999(5),P10~13

[16] 李宏升等,利用牌照识别技术的停车场安全防盗系统,计算机系统应用,1999(5),P14~16


© 2024 实用范文网 | 联系我们: webmaster# 6400.net.cn