智能限高杆提醒系统设计
2018-09-04陆超柯永斌
陆超,柯永斌
(淮阴工学院 电子信息工程学院,江苏 淮安 223001)
0 引言
在当前的社会中,限高杆的是为了限制车辆通行的高度,用来保护桥梁、隧道等交通设施,但是现实生活中所使用的限高杆技术往往都是刚性的,大多数的制成材料是用金属,因为汽车在行驶时具有很大的惯性,如果当一个驾驶员驾驶着汽车,而没有看到这个限高杆。很容易就会撞上去,这样会造成很严重的交通事故,若只设置有检测超高装置的话,两辆汽车同时经过,不能确定是哪个车辆。所以要加上车牌识别用于提醒具体的车辆[1]。为了解决限高杆的这一不足,本课题目的就是完成一个智能限高杆提醒系统设计。
1 研究目标及内容
本课题的研究目标是设计一款基于树莓派车牌识别的智能限高杆。它可以判断过来的车辆是否超过限定的高度,抓拍超过限定高度的车辆图片,并且从中提取车牌信息,然后给予警示。树莓派利用激光对准模块来进行对车辆是否超出限定高度,辅以摄像头来作为抓取车辆信息,通过python3.5和OpenCV,来对含有车牌信息的图片在本地进行车牌识别,通过串口发送给单片机。单片机在接收到发过来的车牌信息之后,将车牌信息显示在点阵屏上面,不断闪烁以警示超高司机注意安全[2]。
2 系统结构图
图1 硬件总体设计流程图Fig1 Hardware overall design flow chart
利用激光对射传感器经向检测,若车辆超过设定的高度,则树莓派利用摄像头进行抓拍,对抓拍到的照片进行提取载入,使用OpenCV这个开源的计算机视觉库来处理。得到车牌的相关信息,利用串口发给单片机,单片机接收到信息后通过无线模块发送给另一个节点单片机,然后在LCD屏显示该车辆的车牌信息。
图2 软件总体设计流程图Fig 2 Overall software design flow chart
所要求设计的系统能够利用树莓派拍摄的照片,进行数字图像处理和使用一些相关算法,快速地、准确地识别出车牌信息[3]。车牌识别的设计流程图如下:
图3 车牌识别设计Fig 3 License plate recognition design
对于图像的边缘检测,我采用了 Canny算子进行边缘检测。
Canny算子是一种检测性能较好,应用也比较广泛的一种边缘检测算子。它通过图像信号的函数的极大值来判定图像的边缘监测点。
对于Canny算子的边缘检测的步骤如下:
消除噪声。在Canny算子边缘检测之前,先要对原始数据和高斯模板进行卷积,将得到的图像与最初的图像比较又模糊,一般来说采用高斯平滑滤波器来镜像卷积降噪,下面是一个size = 5的高斯内核[4]:
计算图像的梯度幅度和它的方向。可以采用一阶差分来对图像灰度的梯度值求取近似。求得图像在x和y方向的频道书,用一堆卷积阵列分布作用于相应的水平核垂直方向。Canny算子使用的Sobel模板如下[5]:
从上面的式子可以求出卷积后的结果求出的近似梯度幅度为G:
图4 边缘检测变换图Fig 4 Transformation diagram of edge detection
3 系统软件设计
本系统是整个系统设计的核心部分,主要的控制环节,分析环节,处理环节都在本部分完成。下位机仅仅起到一个显示的作用。
3.1 系统功能
本系统主要分为4个部分,分别是车辆高度判断部分、图像采集部分,车牌识别部分、通信部分。
系统主要分为图像采集,预处理,车牌定位,字符分割以及最后的车牌识别部分[6]。首先利用摄像头进行图像的采集,然后对采集的图像进行一系列的处理,如灰度变换等等。接着进行车牌定位,确定车牌所在的图像区域。最后对含有车牌的矩形区域进行字符分割。将每个分割出来的字符进行模板匹配最后得到车牌信息,完成车牌识别这个流程。
图5 识别流程图Fig 5 Identification flowchart
3.2 系统初始化程序设计
为了能确保树莓派能够正常的运行程序,应该配置树莓派的GPIO引脚,串口,以及载入已经训练好的SVM模板。初始化流程如图6所示:
图6 统初始化流程图Fig 6 Series initialization flow chart
3.3 车辆高度判断设计
车辆高度判断是基于激光对射模块的,激光对射模块安装在固定的高度,若有超过高度的物体通过,则电平会发生变化,此时树莓派不断读取相应的GPIO管脚的电平值来判断。
当确定有车辆超过限定高度的时候,才执行摄像头,车牌识别等步骤。
3.4 车牌区域的定位
第一种的方法是基于图像的边缘来进行检测,也就是如上面所提到的例如Canny边缘处理算子,拉普拉斯算子等。第二种是基于车牌的颜色来进行判断的,车牌的长宽比是固定的所以可以确定车牌所在的区域。车牌定位的流程如图7所示:
图7 车牌定位流程图Fig 7 License plate location flow chart
3.5 车牌的倾斜度调整
因为含有车牌的图像如果倾斜的话,不利于图像的分割。所以它的角度必须被调整到能够分割出比较完整地字符为止,调整车牌的倾斜度可以令所有的字符基本上处于水平状态。这有利于对字符之间的分割,间接的提升了车牌识别的准确程度。经过对算法方面的不断调整,在于查找水平直方图波峰的分布,峰图越密,认为是水平方向,最大的波峰为车牌区域。那块区域的是字符的可能性越大。查找查找垂直直方图波峰,图像在水平像素位置附近,若字符两侧的像素的平均值有相当大的起伏,则它显示的图像存在倾斜,需要进行修正[7]。找到含有车牌的区域之后,要判断是否倾斜,如果倾斜的角度过大的话对接下来的字符分割以及字符识别会进行干扰,所以此时要进行角度校正。角度矫正的部分代码如下:
下面需要计算每个像素点的平均高度,图像的左半边的像素点,图片右半边的像素点,从这些数据中中找到图像的斜率,图像重建的斜率,包括一个新的图像输出到图像像素映射时间。使用hough来检测直线,从而检测出角度。最后再利用一些相关的旋转算法,将刚才旋转的车牌进行旋转。车牌的倾斜度调整后的效果如图8所示:
图8 调整后的效果图Fig 8 The adjusted effect diagram
3.6 车牌字符分割
车牌的字符主要进行单字符的分割,主要策略就是主要来检测像素的综合变化,字符的颜色与非字符区域的颜色完全不同,经过二值化之后的非字符区域就是黑色,像素的值比较低[8]。含有字符的区域白色点比较多,所以含有字符的列的像素和比较高。根据这个来进行字符分割。
具体分割的算法如下:
(1)认为水平方向,最大的波峰为车牌区域。
(2)查找垂直直方图波峰,去掉车牌上下边缘1个像素,避免白边影响阈值判断。
(3)U和0要求阈值偏小,否则U和0会被分成两半,车牌字符数应大于6,判断是否是左侧车牌边缘。组合分离汉字,去除车牌上的分隔点,可能是固定车牌的铆钉,判断最后一个数是否是车牌边缘,假设车牌边缘被认为是1。
车牌字符分割的示意图如9所示:
图9 字符分割示意图Fig 9 Character segmentation diagram
该步骤如下:首先要做的是判断车牌的字符数是否大于6,紧接着判断车牌左侧的边缘,接着分离出第一个汉字部分[9]。去掉车牌上的分隔点,将剩下的字符一个个分割,判断最后一个数是不是边缘,假设边缘为1,若这个1太细的话则把它当做是边缘来处理。
3.7 字符识别匹配
将上面含有字符图片所分割出来的字符串图片,对它做一个个的字符分割,将每个字符串送到已经训练好的模板里进行识别。需要对模板进行训练,将34省的缩写,以及0到9这十个数字和A-Z这26个字母进行训练。但是因为没有足够的样本,无法进行这一步的操作。
使用样本上的一些限制还有由于样本的不足,算法方面也有待完善。导致在车牌定位方面有些不准确,遇到环境复杂或者车牌占比很小识别不出来。在字符中样本的不足,在判断两个字符的情况下,会导致混淆,如0和O以及Z与2,还有就是8和B等等。这些都需要很大的样本来训练,以提高准确率。
4 警示部分的软件设计
警示系统使整个系统的限高警示部分,是主要的输出信息环节,展示环节。
4.1 系统功能
本系统主要分为两个部分,分别是串口通信部分,车牌信息显示部分。树莓派在往单片机发的时候,以GB2312的格式发送[10]。在GB2312格式中,每个中文字符占据两个字节,英文占据一个字节。将得到的车牌信息显示在户外点阵屏幕上面上面。
图10 车牌示警部分流程图FIig 10 Flow chart of license plate warning part
5 系统通信部分设计
通信协议以‘#’为起始帧,以‘%’为结束帧,防止数据在传输的过程中出现乱码或者错码,提高了系统的可靠性。车牌含有一个中文字符,七个英文或者数字,定义了一个9个字符的数组。协议的示意图如下:
图11 自定义协议图Fig11 Custom Protocol diagram
6 结论
本文详细的介绍了辨识部分的车牌识别本地化处理的过程,以及警示部分的处理。利用SVM支持向量机实现对字符的训练以及处理,最后还介绍了辨识部分与警示部分之间的通信协议.