车牌提取系统的设计与实现.doc_第1页
车牌提取系统的设计与实现.doc_第2页
车牌提取系统的设计与实现.doc_第3页
车牌提取系统的设计与实现.doc_第4页
车牌提取系统的设计与实现.doc_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

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

文档简介

车牌提取系统的设计与实现摘 要 汽车牌照自动识别系统是制约道路交通智能化的重要因素,包括车牌定位、字符分割和字符识别三个主要部分。本文首先确定车辆牌照在原始图像中的水平位置和垂直位置,从而定位车辆牌照,然后采用局部投影进行字符分割。在字符识别部分,提出了在无特征提取情况下基于支持向量机的车牌字符识别方法。实验结果表明,本文提出的方法具有良好的识别性能。随着公路逐渐普及,我国的公路交通事业发展迅速,所以人工管理方式已经不能满着实际的需要,微电子、通信和计算机技术在交通领域的应用极大地提高了交通管理效率。汽车牌照的自动识别技术已经得到了广泛应用。 文章介绍了车牌提取系统使用的关键技术,设计原理,详细设计步骤和系统实现。关键词:车牌提取;图像识别;设计与实现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目 录摘 要1ABSTRACT2目 录31 相关技术介绍31.1 MFC(微软基本类库)31.2 GDI(图形设备接口)41.3 MFC开发软件52 设计原理52.1 系统流程52.2 总体设计步骤63 详细设计73.1 预处理及边缘提取73.1.1 图象的采集与转换73.1.2 边缘提取83.2.1 牌照区域的定位103.2.2 牌照区域的分割113.2.3车牌进一步处理113.3 字符的分割与归一化123.3.1 字符分割133.3.2 字符归一化133.4 字符的识别134 关键代码154.1 图像灰度化154.2 灰度均衡化184.3 边缘检测204.4 预处理234.5定位车牌254.6 分割车牌325 设计结果及分析33参考文献341 相关技术介绍1.1 MFC(微软基本类库)MFC是WinAPI与C+的结合,API,即微软提供的Windows OS(操作系统)下应用程序的编程语言接口,是一种软件编程的规范,但不是一种程序开发语言本身,可以允许用户使用各种各样的第三方(如我是一方,微软是一方,Borland就是第三方)的编程语言来进行对WindowsOS下应用程序的开发,使这些被开发出来的应用程序能在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) G= (2) 图3.2 原图 图3.3 灰度图3.1.2 边缘提取 边缘是指图像局部亮度变化显著的部分,是图像风、纹理特征提取和形状特征提取等图像分析的重要基础。所以在此我们要对图像进行边缘检测。图象增强处理对图象牌照的可辩认度的改善和简化后续的牌照字符定位和分割的难度都是很有必要的。增强图象对比度度的方法有:灰度线性变换、图象平滑处理等。(1)灰度校正 由于牌照图象在拍摄时受到种种条件的限制和干扰,图象的灰度值往往与实际景物不完全匹配,这将直接影响到图象的后续处理。如果造成这种影响的原因主要是由于被摄物体的远近不同,使得图象中央区域和边缘区域的灰度失衡,或是由于摄像头在扫描时各点的灵敏度有较大的差异而产生图象灰度失真,或是由于曝光不足而使得图像的灰度变化范围很窄。这时就可以采用灰度校正的方法来处理,增强灰度的变化范围、丰富灰度层次,以达到增强图象的对比度和分辨率。我们发现车辆牌照图象的灰度取值范围大多局限在r=(50,200)之间,而且总体上灰度偏低,图象较暗。 (2)平滑处理对于受噪声干扰严重的图象,由于噪声点多在频域中映射为高频分量,因此可以在通过低通滤波器来滤除噪声,但实际中为了简化算法也可以直接在空域中用求邻域平均值的方法莱削弱噪声的影响,这种方法称为图象平滑处理。例如,某一象素点的邻域S 有两种表示方法:8邻域和4邻域分别对应的邻域平均值为 其中,M 为邻域中除中心象素点f(i,j) 之外包括的其它象素总数,对于4邻域M=4,8 邻域M=8。然而,邻域平均值的平滑处理会使得图象灰度急剧变化的地方,尤其是物体边缘区域和字符轮廓等部分产生模糊作用。为了克服这种平均化引起的图象模糊现象,我们给中心点象素值与其邻域平均值的差值设置一固定的阈值,只有大于该阈值的点才能替换为邻域平均值,而差值不大于阈值时,仍保留原来的值,从而减少由于平均化引起的图象模糊。 图像中车辆牌照是具有比较显著特征的一块图象区域,这此特征表现在:近似水平的矩形区域;其中字符串都是按水平方向排列的;在整体图象中的位置较为固定。正是由于牌照图象的这些特点,再经过适当的图象变换,它在整幅中可以明显地呈现出其边缘。边缘提取是较经典的算法,此处边缘的提取采用的是Roberts算子。图3.4 robert算子边缘检测由上图可以归纳起来以下方面:原始图像清晰度比较高,从而简化了预处理,结合实验过程,得出不是每一种图像处理之初都适合滤波和边界增强。本次汽车车牌的识别,为了保存更多的有用信息。 3.2 牌照的定位和分割牌照的定位和分割是牌照识别系统的关键技术之一,其主要目的是在经图象预处理后的原始灰度图象中确定牌照的具体位置,并将包含牌照字符的一块子图象从整个图象中分割出来,供字符识别子系统识别之用,分割的准确与否直接关系到整个牌照字符识别系统的识别率。由于牌照图象在原始图象中是很有特征的一个子区域,确切说是水平度较高的横向近似的长方形,它在原始图象中的相对位置比较集中,而且其灰度值与周边区域有明显的不同,因而在其边缘形成了灰度突变的边界,这样就便于通过边缘检测来对图象进行分割。对图像进行腐蚀去除杂质通过计算寻找X和Y方向车牌的区域完成车牌定位对分割出的车牌做进一步处理 图3.5 牌照定位于分割流程图3.2.1 牌照区域的定位 牌照图象经过了以上的处理后,牌照区域已经十分明显,而且其边缘得到了勾勒和加强。此时可进一步确定牌照在整幅图象中的准确位置。这里选用的是数学形态学的方法,其基本思想是用具有一定形态的机构元素去量度和提取图像中的对应形状以达到对图像分析和识别的目的。数学形态学的应用可以简化图像数据,保持它们基本的形态特征,并除去不相干的结构。在本程序中用到了膨胀和闭合这两个基本运算,最后还用了bwareaopen来去除对象中不相干的小对象。3.2.2 牌照区域的分割 对车牌的分割可以有很多种方法,本程序是利用车牌的彩色信息的彩色分割方法。根据车牌底色等有关的先验知识,采用彩色像素点统计的方法分割出合理的车牌区域,确定车牌底色蓝色RGB对应的各自灰度范围,然后行方向统计在此颜色范围内的像素点数量,设定合理的 阈值,确定车牌在行方向的合理区域。然后,在分割出的行区域内,统计列方向蓝色像素点的数量,最终确定完整的车牌区域。图3.6 行方向区域和最终定位出来的车牌3.2.3车牌进一步处理经过上述方法分割出来的车牌图像中存在目标物体、背景还有噪声,要想从图像中直接提取出目标物体,最常用的方法就是设定一个阈值T,用T将图像的数据分成两部分:大于T的像素群和小于T的像素群,即对图像二值化。均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素。再用模板中的全体像素的平均值来代替原来像素值。图3.7 裁剪出来的车牌的进一步处理过程图3.3 字符的分割与归一化m,n=size(d),逐排检查有没有白色像素点,设置1=jn-1,若图像两边s(j)=0,则切割,去除图像两边多余的部分切割去图像上下多余的部分根据图像的大小,设置一阈值,检测图像的X轴,若宽度等于这一阈值则切割,分离出七个字符归一化切割出来的字符图像的大小为40*20,与模板中字符图像的大小相匹配 图3.8 字符分割与归一化流程图3.3.1 字符分割在汽车牌照自动识别过程中,字符分割有承前启后的作用。它在前期牌照定位的基础上进行字符的分割,然后再利用分割的结果进行字符识别。字符识别的算法很多,因为车牌字符间间隔较大,不会出现字符粘连情况,所以此处采用的方法为寻找连续有文字的块,若长度大于某阈值,则认为该块有两个字符组成,需要分割。 图3.9 分割出来的七个字符图像3.3.2 字符归一化 一般分割出来的字符要进行进一步的处理,以满足下一步字符识别的需要。但是对于车牌的识别,并不需要太多的处理就已经可以达到正确识别的目的。在此只进行了归一化处理,然后进行后期处理。图3.10 归一化处理后的七个字符图像3.4 字符的识别字符的识别目前用于车牌字符识别(OCR)中的算法主要有基于模板匹配的OCR算法以及基于人工神经网络的OCR算法。基于模板匹配的OCR的基本过程是:首先对待识别字符进行二值化并将其尺寸大小缩放为字符数据库中模板的大小,然后与所有的模板进行匹配,最后选最佳匹配作为结果。模板匹配的主要特点是实现简单,当字符较规整时对字符图像的缺损、污迹干扰适应力强且识别率相当高。综合模板匹配的这些优点我们将其用为车牌字符识别的主要方法。模板匹配是图象识别方法中最具代表性的基本方法之一,它是将从待识别的图象或图象区域f(i,j)中提取的若干特征量与模板T(i,j)相应的特征量逐个进行比较,计算它们之间规格化的互相关量,其中互相关量最大的一个就表示期间相似程度最高,可将图象归于相应的类。也可以计算图象与模板特征量之间的距离,用最小距离法判定所属类。然而,通常情况下用于匹配的图象各自的成像条件存在差异,产生较大的噪声干扰,或图象经预处理和规格化处理后,使得图象的灰度或像素点的位置发生改变。在实际设计模板的时候,是根据各区域形状固有的特点,突出各类似区域之间的差别,并将容易由处理过程引起的噪声和位移等因素都考虑进去,按照一些基于图象不变特性所设计的特征量来构建模板,就可以避免上述问题。建立自动识别的代码表读取分割出来的字符第一个字符与模板中的汉字模板进行匹配第二个字符与模板中的字母模板进行匹配待识别字符与模板字符相减,值越小相似度越大,找到最小的一个即为匹配的最好的识别完成,输出此模板对应值后5个字符与模板中的字母与数字模板进行匹配图3.11 字符识别流程图 此处采用相减的方法来求得字符与模板中哪一个字符最相似,然后找到相似度最大的输出。汽车牌照的字符一般有七个,大部分车牌第一位是汉字,通常代表车辆所属省份,紧接其后的为字母与数字。车牌字符识别与一般文字识别在于它的字符数有限,汉字共约50多个,大写英文字母26个,数字10个。为了实验方便,结合本次设计所选汽车牌照的特点,只建立了4个数字26个字母与10个数字的模板。其他模板设计的方法与此相同。 首先取字符模板,接着依次取待识别字符与模板进行匹配,将其与模板字符相减,得到的0越多那么就越匹配。把每一幅相减后的图的0值个数保存,即为识别出来的结果。图3.12 识别结果4 关键代码4.1 图像灰度化关键代码:* 函数名称:* ConvertToGrayScale()* 参数:* LPSTR lpDIB- 指向源DIB图像指针* * 返回值:* BOOL- 成功返回TRUE,否则返回FALSE。* 说明:* 该函数将24位真彩色图转换成256级灰度图*/BOOL WINAPI ConvertToGrayScale(LPSTR lpDIB) 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 *)&lpDIBsizeof(BITMAPINFOHEADER); /INFOHEADER后为调色板 if(:DIBNumColors(lpDIB) = 256) /256色位图不作任何处理return TRUE; if(:DIBNumColors(lpDIB) != 256) /非256色位图将它灰度化lLineBytes = WIDTHBYTES(lWidth*8*3);/真彩色一个象素为3个字节lpdest= new BYTElHeight*lWidth;lpDIBBits = (LPSTR)lpDIB + sizeof(BITMAPINFOHEADER);/指向DIB象素for(i = 0;i lHeight; i+)for(j = 0;j biBitCount = 8;/设置灰度调色板for(i = 0;i 256;i+)lpRGBquadi.rgbRed = (unsigned char)i;lpRGBquadi.rgbGreen = (unsigned char)i;lpRGBquadi.rgbBlue = (unsigned char)i;lpRGBquadi.rgbReserved = 0;lpNewDIBBits= :FindDIBBits(lpDIB); /找到DIB图像象素起始位置lLineBytes=WIDTHBYTES(lWidth * 8);/修改灰度值for(i = 0;i lHeight; i+)for(j = 0;j GetHDIB();/ 找到DIB图像象素起始位置lpDIBBits = :FindDIBBits(lpDIB);/ 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的直方图均衡,其它的可以类推)if (:DIBNumColors(lpDIB) != 256)/ 提示用户MessageBox(目前只支持256色位图的直方图均衡!, 系统提示 , MB_ICONINFORMATION | MB_OK);/ 解除锁定:GlobalUnlock(HGLOBAL) pDoc-GetHDIB();/ 返回return;/ 更改光标形状BeginWaitCursor();/ 调用InteEqualize()函数进行直方图均衡InteEqualize(lpDIBBits, :DIBWidth(lpDIB), :DIBHeight(lpDIB);/ 设置脏标记pDoc-SetModifiedFlag(TRUE);/ 更新视图pDoc-UpdateAllViews(NULL);/ 解除锁定:GlobalUnlock(HGLOBAL) pDoc-GetHDIB();/ 恢复光标EndWaitCursor();效果图如4.2所示。4.2 灰度均衡化效果图4.3 边缘检测 /Robert边缘检测运算/ 获取文档CPlateLocateDoc* pDoc = GetDocument();/ 指向DIB的指针LPSTRlpDIB;/ 指向DIB象素指针LPSTR lpDIBBits;/ 锁定DIBlpDIB = (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() / 粘贴图像/ 创建新DIBHDIB 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* iLeft,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的象素点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;topLeft1000;struct bottomRightCorner int pzBottom;int pzRight;bottomRight1000;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 100;i+)topLefti.pzTop = 0;topLefti.pzLeft = 0;for(i = 0;i 100;i+)bottomRighti.pzBottom = 0;bottomRighti.pzRight = 0; /计算左上角的位置,可能有多个,保存在topLeft数组中for(i = 30;i lHeight - 30;i+)/考虑到车牌的大小,在边缘一定范围内可以不考虑linePixelCount = 0;for(j = 30;j lWidth - 30 ;j+)linePixelCount = 0;for(pixelCount = j;pixelCount MoveTo(j,i); /pDC-LineTo(j,i);/*if(linePixelCount = lineRequired)pDC-MoveTo(j,i);pDC-LineTo(j,i);*/if(linePixelCount = lineRequired)linePixelCount = 0;for(pixelCount = i;pixelCount MoveTo(j,i); /pDC-LineTo(j,i);if(linePixelCount = lineRequired)findTL = true;if(findTL)findTL = false;linePixelCount = 0;topLefttlCount.pzTop = i;topLefttlCount.pzLeft = j;pDC-MoveTo(j,i);pDC-LineTo(j,i);tlCount+; CPen newGreenPen(PS_SOLID,2,RGB(0,255,0);pDC-SelectObject(newGreenPen);/计算右下角的位置,可能有多个,保存在bottomRight数组中linePixelCount = 0;/重新初始化计数器for(i = 10;i lHeight - 10;i+)/考虑到车牌的大小,在边缘一定范围内可以不考虑linePixelCount = 0;for(j = 20;j lWidth - 20;j+)linePixelCount = 0;for(pixelCount = j;pixelCount = lineRequired)linePixelCount = 0;for(pixelCount = i;pixelCount (i - lineLimited);pixelCount-)lpSrc=(unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - pixelCount) + lineRequired + j; pixel=(unsigned char)(*lpSrc); if(pixel = 255) linePixelCount+;if(linePixelCount = lineRequired)findBR = true;if(findBR)findBR = false;l

温馨提示

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

评论

0/150

提交评论