• 收藏
  • 加入书签
添加成功
收藏成功
分享

基于opencv的车牌识别

陈睿敏
  
美文新篇
2022年36期
东南大学成贤学院 江苏

摘要:随着时代的发展,购买私家车的人越来越多,交通状况也变得越来越差。为了解决交通问题,车牌的作用非同小可,为了区分这些车牌,车牌的识别系统就才成为了最关键的存在。本文完成的主要工作为:预处理,车牌图像定位及用HyperLPR函数进行车牌识别。

关键词:预处理;车牌定位;车牌识别

一、研究背景

随着社会经济的飞速发展,交通问题频出。交通部门开发了车辆识别系统来解决这些问题。因为车牌识别系统非常重要,所以说本文对车牌识别进行了研究。

二、车牌图像预处理

在图像收集模块收集到的车牌图像大都是在不同场景拍摄的,故图片质量差距较大,若对其进行后续的操作,很容易造成定位不准确或裁剪后的车牌图片不清晰,所以说对车牌进行预处理操作是很有必要的。预处理流程包括灰度化,中值滤波,二值化,形态学处理。

2.1 灰度化

用户用摄像机抓拍到的车辆图像一般为彩色图像,包含着很多像素点信息,在处理时会降低系统的识别速度,使运行速度变慢,从而影响到车牌分割[1]。但若将其转化为灰度图像,像素点就会没有颜色信息,只有亮度信息,所以运行时加载的速度会更快。灰度化处理分为线性变换与分段变换。分段变换主要是改变原始图像改变参数数值,而线性变换的常见处理方法有人眼对颜色的敏感度进行设定权值(f=0.11B+0.59G+0.3R)。

同样,应先将HSV转化为RGB,再利用公式求解,公式是Y=0.11B+0.59G+0.3R。程序运用的函数是rgb2gray函数,因为用这种方法的灰度化结果时最有效的灰度后的图像。

2.2 边缘检测

边缘检测是车牌图像分割中的重要一环,也是分析图片的第一步。作为图像的重要特征,它对于车牌图像检测来说不可或缺。

在普通的一阶导数中,Roberts算子利用局部差分的方式来查找边缘。它使用的是四个算子,在边缘检测时,将像素点的灰度值和对应模板中的数字相乘后相加,其缺点是运用的像素点很少,若用这种算子处理噪声很大的图像,其结果会差不少,图像的边缘定位精确度不高。

Canny算子因其较强的信噪比和较高的处理精度而被大范围使用[2]。它主要是通过在局部范围内查找没有经过处理的图像梯度的最大值,这种梯度能减少噪声和检测结果中的冲突。主要步骤是首先需要进行中值模糊滤波,然后利用一阶偏导的有限差分得到梯度幅值并运算,再对梯度进行非极大值抑制,最后用双阈值发检测和连接边缘。

2.3 中值滤波

车牌图像滤波是将图像进行处理后,将非重要信息变得模糊。再经过滤波操作后,滤波后的图像进行后续操作会比没有进行滤波操作的图像效果更显著。

中值滤波就是将n个数字进行从小到大排列

当n为奇数时,数列的中值就是X[(n+1)/2],当n为偶数时,数列的中值就是{X(n/2)+X[(n+1)/2]}/2

2.4 二值化

二值化可以使用黑标和白标来标记车牌图像中大于和小于阈值的像素。步骤为:阈值判定可以利用公式,其中局部特征如窗口像素的平均值E,差平方P和方根值Q等,参数方程是:T=a*E+b*P+c*Q,其中a,b,c 都是自由参数。

本文对车牌处理时,利用了cvThreshold 函数对图像二值化,其中参数依次有输入图像、输出图像、阈值、最大值和运算方法。

2.5 形态学操作

形态学指的就是数学形态学,在对图像进行定位时,为了能更容易地查找其所在地矩形区域,需要用到形态学算子,比较基础的就是膨胀和腐蚀操作。

膨胀运算是将像素点连接起来,从而消除空隙,腐蚀运算的目的是为了去掉物体地边缘,将小于结构元素的部分消除,缩减领域最终去除小的噪声[3]。

图像平滑的运算一般包括开运算和闭运算。开运算是将物体的外边缘更加平滑,同时使窄的断口完全过滤掉,它在数学上是先腐蚀后膨胀的结。

闭运算也是平滑操作的一种,但它是将图像先膨胀再腐蚀,它是将狭窄的缺口连接起来形成一种长的弯口,去除细小的洞并补全边缘不连接的部分。

三、车牌图像定位

要想快速地在一副图像中将车牌分割出来并识别出车牌号码,就需要进行车牌定位,首先将车牌基于hsv的颜色定位技术提取其中的蓝色部分,然后用findcounters函数画出车牌轮廓。

3.1 基于HSV的车牌蓝色信息提取

HSV模型是基于颜色信息的一种圆锥模型,H是反应颜色种类的角度,其中红色是0度、绿色是120度,S代表颜色的饱和度,取值范围是0-255,V代表亮度,取值范围0-255,值越大亮度越高,同样也与被测物体的发光强度有关。

要实现HSV提取蓝色车牌,需要选定SV的值,然后不断调整H值来观察颜色的变换,最后判定蓝色区域的大小。首先,要对图像进行RGB到HSV的转换,函数程序为hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)。

然后设置蓝色的阈值,它可以根据该阈值,在掩膜中,原图像的像素值在这段像素之间会被设置成255,函数程序为:

low_hsv= np.array([100,80,80])

high_hsv= np.array([124,255,255])

然后生产掩膜,再对掩膜进行一系列形态学操作程序如下:mask=cv2.inRange(hsv,yellow_lower,yellow_upper),之后保留留下来的蓝色部分。

3.2 画出车牌轮廓

根据findcontours画出轮廓,首先传入一个轮廓图像:

For(x,y,w,h)in img;

在传入的图像中,返回其中xy是左上角点的宽和高,w和h是矩形边框的宽度和高度,然后画出车牌轮廓:cv2.rectangle(img,(x,y),(x+w, y+h),(0,255,0),2)。

四、车牌识别

在进行车牌定位后,需要对车牌内的字符进行识别,本文调用了opencv库中的HyperLPR库进行车牌识别。其步骤首先先将定位后的车牌区域中的灰度图颜色通道[0,255]转化为浮点类型[0,1]。利用这个模型加载出模型文件并将输出后的文件输入到recognizeOne函数中,再进行OCR识别。之后基于GRU的序列模型从OCR模型中修改网络模型model_sec_rec。最终识别出车牌内的字符。再定义一个函数,该函数可以在图像上写出图像、文本内容、像素位置、文本颜色和大小,并显示出来。

实验结果表明测试的30张图片中能完成识别的有29张,可见此方法可以轻松识别车牌中的字符。

参考文献:

[1] 张莉莉,武艳. 基于matlab车牌识别系统的识别与仿真[D]. 洛阳师范学院,2018.

[2] Canny, J. A Computational Approach to Edge Detection[C]. IEEE Trans. Pattern Analysis and Machine Intelligence, 1986, 8: 679-714.

[3]王洽锋. 基于matlab车牌识别系统研究[D]. 商丘师范学院,2017.

作者简介:陈睿敏,研究方向:opencv的车牌图像分割。

*本文暂不支持打印功能

monitor