Android平台下基于OpenCV的车牌号识别技术

2021-07-16 07:10张军平徐衍胜
兰州交通大学学报 2021年3期
关键词:污损车牌字符

张军平,徐衍胜

(1. 兰州交通大学 研究院,兰州 730070;2. 山西军跃迈科信息安全技术有限公司,太原 030006)

随着我国社会的迅猛发展,城市交通事业发展也随之步入快节奏,车辆监控和车辆自动识别成为焦点问题.其中车牌识别技术作为智能交通中最重要的部分之一,一直是国内外学者们研究计算机视觉的热门问题.各种道路卡口、停车场出入等场所都已应用了车牌识别技术,为城市交通智能化提供全方位信息化支撑[1-2].近年来,国内外对复杂环境下的车牌识别技术的研究成为热点,BP神经网络、卷积神经网络等深度学习算法在其中的应用取得了较好的识别效果[3-4].随着移动应用的不断推广,在手机上实现车牌识别已成为一个重要的应用方向,许多学者进行了相关研究[5-6].但是,基于手机拍摄的图片,尤其是在运动过程中拍摄的图片,具有拍摄易抖动、角度易偏差的特点,当前的各项车牌识别技术应用在手机上,尤其是手机与车辆相对运动的场景中,其效率或准确率达不到实用要求.基于此背景,本文在手机最常用的操作系统Android平台下,提出一种基于OpenCV的车牌号自动识别方法.

1 基本思路

本文的设计基于以下两个约束条件:1) 基于Android平台;2) 手机与车辆处于相对运动状态:手机可在运动过程中进行拍摄、识别,目标车辆同时也可处于运动状态.

为实现Android平台下的图像识别,采用OpenCV(open source computer vision library)作为图像处理工具.OpenCV是一个基于BSD许可的开源机器视觉和机器学习库,其包含的OpenCV for Android可利用JAVA接口将OpenCV视觉库添加到Android的开发工具中,实现在移动端的图像处理功能[6].

实现方法分两步:首先利用OpenCV for Android实现单一车牌图像的识别;然后在此基础上增加连续拍摄、自动筛选功能,以适用于移动应用.其流程如图1所示.

图1 车牌图像识别流程图Fig.1 Flow chart of license plate image recognition

2 车牌图像特征分析

我国机动车辆号牌,由汉字、英文字母以及数字构成.其中,第一个字符为汉字,是各个省、直辖市、自治区、行政区的简称,其余的字符为英文字母或数字[6-7].由于汉字的复杂性,我国的车牌比国外要复杂得多.因此,本文中只针对我国国内的车牌进行识别设计.车牌图像一般具有以下特征:

1) 车牌一般为矩形,位于车身底部,其周围没有明显的、与其相似的矩形区域.

2) 车牌的字符大小相同,个数基本固定,并且字符之间的间隔相同.

3) 字符与背景色反差较大.根据车型的不同,车牌具有多种颜色组合,如蓝底白字、黄底黑字、黑底白字,以及近年来新能源车辆的白底绿字等,其颜色反差均十分明显.

3 车牌图像识别过程

根据车牌图像的特征,其识别过程可分为5个步骤:图像获取、图像预处理、车牌定位、字符分割和字符识别.

3.1 图像获取

利用OpenCV for Android的CvCameraViewListener2接口可从手机摄像机获取图像.需自定义一个Activity,并实现CvCameraViewListener2接口.在方法onCameraFrame(CvCameraViewFrameinputFrame)中,其参数inputFrame即为当前图像帧.利用inputFrame.rgba可得到初始图像,如图2所示.

图2 初始图像Fig.2 Initial image

3.2 图像预处理

图像预处理是对输入的初始图像进行处理,用以去除图像的噪声,并体现其边缘特征.其过程分为2步:灰度化和边缘检测.

1) 灰度化

OpenCV for Android提供了cvtColor函数,可实现色彩空间的转换.采用CV_RGB2GRAY参数,可以将输入的初始图像转换为灰度图像.其转换公式为:Y=0.299R+0.587G+0.114B.其中:Y是灰度值;R、G、B分别为初始图像红、绿、蓝通道的颜色值,其值范围全部为0~255.转换为灰度图像以后,还需要进行平滑和高斯滤波处理,以消除噪声,可采用cvSmooth函数来实现.灰度化结果如图3所示.

图3 灰度图Fig.3 Gray image

2) 边缘检测

车牌图像为矩形,而且其区域颜色反差较大,反应在灰度图上则是其灰度值跳变较大.因此,可以通过边缘检测来凸显其特征.常见的经典边缘检测算法有Roberts算子、Sobel算子、Log算子、Canny算子、Laplacian算子以及Prewitt算子等[8-9].这些算法都利用了边缘处灰度值的变化跳变来进行检测.其中,Canny算子分为高斯滤波、梯度值计算、非极大值抑制、滞后边界跟踪等过程,具有不易受噪声干扰、能够检测真正的弱边缘的特性,比较适用于车牌图像边缘检测的场景.OpenCV for Android中提供了Canny函数来实现Canny算子边缘检测[10].Canny函数通过两个重要参数threshold1和threshold2来设置双阈值,以实现滞后边界跟踪:threshold1为低阈值,用于控制边缘连接,其值可取图像灰度值的平均值,以达自适应的目的;threshold2为高阈值,用于控制强边缘,其值可取图像最大灰度值的70%.图像的最大灰度值可通过CV_IMAGE_ELEM函数遍历获取.图4为边缘检测的结果,可以看到,图像轮廓比较清晰,噪声较少,特别是车牌部分,可以较为完整地凸显出来.

图4 边缘检测结果Fig.4 Edge detection results

3.3 车牌定位

车牌定位是从边缘检测结果图中找到车牌的位置,并将其从初始图像中切割出来,作为字符分割和识别的输入.在常用的定位方法中,有颜色定位法[11]和纹理定位法等.

颜色定位法是根据车牌颜色的特征,如蓝底白字、黑底白字、黄底黑字等,通过判断颜色的变化来定位.这种方法在车辆所处环境如光照、背景较为复杂时,准确率较低.

纹理定位法是指通过判断纹理来定位:首先对输入的二值图像进行垂直方向投影,从左至右扫描,记录每个扫描点灰度值为255的像素点个数,通过此数据的跳变数来判断是否为车牌.我国的车牌号码一般由7~8个字符组成,所以在车牌图像中,跳变数至少为14个.可认为跳变数超过一定阈值(如10)则为车牌图像.但是纹理定位法受阈值选取的影响较大.阈值选取较小,容易造成误判;阈值选取较大,容易造成漏判,找不到车牌位置.

本文采用了形态定位法,分两步进行:形态学处理和定位.

1) 形态学处理

形态学处理主要是通过图像的闭运算和开运算来完成.图像的闭运算是先膨胀后腐蚀的过程,可以连接邻近物体,平滑边界,还可以填充物体内的细小空洞;图像的开运算是先腐蚀后膨胀的过程,可以在较纤细的部位分离物体,消除噪声和细小的物体,还可以平滑较大物体的边界.

在边缘检测结果的基础上,先做开运算,可以填平小孔,对边缘内部进行填充,结果如图5所示;然后再连续做两次闭运算,消除图像中的小噪点,结果如图6所示.OpenCV for Android提供了形态学变换函数morphologyEx,通过不同的参数选择,可以完成开运算和闭运算处理[10].处理后的结果如图5~6所示.

图5 开运算的结果Fig.5 Results of open operations

图6 两次闭运算后的结果Fig.6 Results after two closed operations

2) 定位

对车牌的精确定位可分为2步:位置提取与筛选.

步骤1:位置提取.在形态学处理完成后,从可视化角度,图像被明确划分为多个白色区域.这些区域包含了车牌的位置.OpenCV for Android提供了findContours函数,可以在图6的基础上,完成白色区域的位置提取[11].

步骤2:筛选.采用基于颜色空间筛选的思想来区分是否为车牌[12].先用上一步提取的位置将原图分割出来,并利用cvtColorb函数将其图像区域转化成HSV(hue,saturation,value)颜色空间;然后,对比各个区域颜色范围的满足情况,最符合蓝色颜色区间的区域便是车牌所在区域,如图7所示.

图7 定位后的车牌图像Fig.7 License plate image after positioning

3.4 字符分割

字符分割是将定位后的车牌图像,分割为各个独立的字符图像,每个图像中有且只有一个字符.其算法采用了垂直投影[13]、轮廓分析、字符尺寸判定等技术.首先将定位后的车牌图像进行二值化处理,将蓝色底变为黑色,白色前景变为白色;然后做垂直投影,并从左到右逐排检查有没有白色像素点.如果图像两边都没有白色像素点,则该区域的图像可以认为是一个独立字符,可以切割出来.在切割过程中,还需要考虑一些干扰因素,如图7中“豫U”后面的圆点.干扰可通过判断所切割图像的大小来识别:如果小于一个特定值,则认为是干扰因素.考虑到车牌最多为8个字符,此特定值可以取w/9,其中,w是图7所示的定位后车牌图像的宽度.

分割完成后,需要对图像进行归一化处理,全部缩放为宽为20像素、高为40像素的图片.

3.5 字符识别

字符识别是将分割后的图像识别为字符的过程,可采用模板匹配的方法实现[14-15].首先需建立一个模板库,模板库中需包括车牌用到的所有字符,包括汉字、数字和英文字母;然后通过将上一节分割完成并归一化的图片与模板库逐一匹配,找到最符合的模板,即可转换为对应的字符.

OpenCV for Android提供了模板匹配函数matchTemplat(),其思想是将模板图像在目标图像上滑动逐一对比,通过统计的基本方法进行匹配.该函数提供了TM_SQDIFF、TM_SQDIFF_NORME、TM_CCORR、TM_CCORR_NORMED、TM_CCOEFF、TM_CCOEFF_NORMED等6种匹配算法参数,分别对应平方差匹配、归一化平方差匹配、相关性匹配、归一化相关性匹配、相关性系数匹配、归一化相关性系数匹配[10].在字符识别中,可采用TM_CCOEFF_NORMED方法,即归一化相关性系数匹配.

4 识别结果自动筛选

利用matchTemplat函数,采用归一化相关性系数匹配法进行模板匹配,每个字符的匹配都会自动得出一个匹配度值.该值位于区间[0,1.0]之间.值越大,其匹配效果越好.通过车牌中每个字符的匹配度值可以计算得到车牌图像的匹配度值.以7个字符的车牌为例,在字符识别的过程中,车牌的7个字符会产生7个匹配度值.可取最小的一个当作本次图像识别的匹配度.

在实际应用过程中,可通过连续拍摄多张图像进行识别,通过判断识别结果的一致性以及匹配度,自动筛选出其中最可能的结果,作为最终结果.其过程如下:

1) 采用一定措施,保证在一定时间内取到的图像是同一个车牌.比如可在界面上通过人工操作来完成.

2) 在图像获取时,采用连续抓取图像的方式.对抓取的每张图片都完成上一节所述的图像识别过程,得到车牌号和匹配度值.

3) 判断识别结果的一致性.如果上一步得到的多个结果中,有60%以上的车牌号相同,则认为该结果一致性较好,此时符合一致性的车牌号即为识别结果.如果达不到60%以上的车牌号相同,则认为一致性较差.

4) 如是一致性较差,需要比较所有结果的匹配度.如果最大的匹配度大于0.7,则认为该结果为正确结果;如果最大的匹配度小于0.7,则认为本次没有识别出图像.

5 实验分析

5.1 实验环境

前文中所用的图片从互联网搜索得到,比较清晰,主要用于程序开发和调试过程.为验证上述方法在实际应用中的效果,在真实环境中进行了实测.手机选用当前略偏低的主流配置:红米Note4X,CPU为64位八核心骁龙625处理器,内存为4 GB,机身存储空间64 GB,后摄像头1 300万像素,操作系统为MIUI10,安卓版本为8.0.OpenCV for Android版本为3.4.11.

5.2 实验方法

共做两个实验,分别用于验证单一的车牌图像识别效果与结合自动筛选功能后的效果.两个实验的功能全部在同一个软件中实现,采用相同的样本.

实验样本数据分两组:

1) 在停车场采集静止车辆的数据:工作人员手持手机,距离目标车辆2~3 m,在正前方采集其车牌图像.

2) 在道路上采集运动车辆的数据:有一台采集车,工作人员手持手机,于车内向后拍摄采集车牌图像.采集车车速保持在40 km/h以内,距后方目标车辆20 m以内,目标车辆时速与采集车相近.

对每个样本车辆的数据采集方式为:首先关闭自动筛选功能,拍一张照片,识别得出车牌号,并记录,此为实验1;然后启用自动筛选功能,连续拍摄5 s视频,识别得出结果,并记录,此为实验2.

5.3 实验结果

5.3.1 实验1

未启用自动筛选功能,对每个车辆只采集一张图片进行识别,软件采用单线程处理方式,结果见表1.

表1 实验1结果统计Tab.1 Statistics of experiment 1

通过对识别错误的图片分析,发现引起识别错误的原因主要有以下4个方面:

1) 车牌污损:静止车辆样本,未能准确识别的21个样本中,9个污损比较严重;运动车辆样本,未能准确识别的44个样本中,2个样本污损比较严重.

2) 光线较差:静止车辆样本,未能准确识别的21个样本中,14个光照较差,其中2个样本同时具有污损现象且比较严重.

3) 拍照不清晰:运动车辆样本,未能准确识别的149个样本中,51个样本图像比较模糊,其中1个样本同时具有污损现象且比较严重.

4) 角度偏差较大:运动车辆样本,未能准确识别的149个样本中,98个样本由于拍摄角度问题,图像中的车牌号形状与矩形差别较大.

除去上述4种情况以外,车牌的识别率可达100%.

5.3.2 实验2

与实验1采用同样的样本,采用8线程并行处理,且启用了自动筛选功能,对每个车辆采集约5 s的数据,结果见表2.

表2 实验2结果统计Tab.2 Statistics of experiment 2

表2中,未识别指连续拍摄的图像中,最大匹配度小于0.7;识别错误指最大匹配度大于0.7,但识别结果与实际结果不同.

实验发现,没有识别错误的结果.对未能准确识别的35个样本进行逐一分析,发现其最大匹配度全部小于0.6,表明这些拍摄的图片与模板图片差别较大.对这些样本进行人工比对分析,发现:静止车辆样本中的9个未识别样本车牌污损严重;运动车辆样本中的26个未识别样本中,1个车牌污损严重,其余25个样本拍摄角度偏差较大.结果表明,车牌污损与角度偏差较大是未能准确识别的主要原因.

5.4 实验结果分析

从性能角度,由表1和表2可知,在单线程模式下,对每个样本图片的处理速度约132 ms左右.如果采用多线程处理方式,在主流手机八核CPU环境下,8线程并行处理,可将平均处理时间缩短至20 ms以内.完全可满足实时处理的需求.

从影响准确率的角度,实验1中由于光线较差引起静止车辆识别错误的12个样本,在实验2中已成功识别.对比两次实验结果,可知车牌污损和拍摄角度偏差较大是影响结果的主要问题,而光线较差和拍摄模糊的问题可以通过连续拍摄图像来解决.

从准确率角度,对于静止车辆,实验2比实验1的准确率提高2.2个百分点,达到98.3%;对于运行车辆,实验2比实验1提高的准确率提高了37.4个百分点,达到92.1%,基本可满足实用要求.实验结果表明自动筛选功能效果良好.

6 结论

在手机上实现移动过程中的车牌识别是未来智能交通与移动应用相结合的一个重要方向.本文基于OpenCV for Android,在手机上实现了对车牌的自动识别,并对单一的车牌图像识别与连续拍摄自动筛选进行了初步的研究.通过实验和分析发现,该方法的实时性好,准确率较高,但还有进一步提升的空间,需要继续改进.相信在不久将来,基于手机的车牌识别技术会有更大地发展.

猜你喜欢
污损车牌字符
基于视觉显著度的污损图像缺陷识别方法研究
车牌颜色里的秘密
论高级用字阶段汉字系统选择字符的几个原则
字符代表几
一种USB接口字符液晶控制器设计
图片轻松变身ASCⅡ艺术画
我国沿海港口的微观生物初期污损调查
污损土地如何修复
第一张车牌
一种侧向插装型车牌架