基于OpenCV的车牌识别系统之二 ——字符分割与识别

基于OpenCV的车牌识别系统之二——字符分割与识别

 

车牌定位完之后就是车牌的字符识别,字符识别又分为字符分割和字符识别。字符分割的步骤采用OpenCV中寻找外轮廓函数,并根据字符轮廓在车牌图像上分割出字符图像。字符识别采用三层神经网络。本程序中采用OCR最常见的特征提取方法:首先将每个字符归一化为20*20的字符,然后在每个字符中提取出一个1*440的特征向量,这440个特征中400为统计每行和每列的像素值个数并保存到新的数据组中,采用minMaxLoc得出数据组中最大的像素值,然后这个数据组中每个像素除此这个值。40为20行和20列统计的非零像素值得个数。这就是特征向量的结构解析。知道这个特征向量是怎么来的,这样就可以写自己ANN离线训练的数据集了。

 

本程序最初的方法也是采用的书上--《深入理解Opencv实用计算机视觉项目解析》的字符分割方法,首先得到一张车牌图片,然后根据最大类间法(Otsu)得到一张较好的车牌二值化图像,之后采用findCounters寻找最外围轮廓并计算其最小外接矩形的大小--这些轮廓所包围的区域全部最为粗选的字符备选区域。然后将这些备选区域依次送入字符验证函数(下面单独介绍字符函数),当统计的通过字符验证函数有且只有7个字符时,则进行下一步—在原图上裁剪出字符区域。得到字符区域之后采用直方图均质化等等预处理。然后依次对7个字符排序,最后在将每个字符归一为20*20的图像。字符识别使用ANN算法采用三层神经网络,输入层经元数是离线训练数据集的行数,隐含层的神经元个数是20,输出层的神经元是类别的种类数。然后依次对每个字符运用ANN.predict函数得出1*类别数的数据组(数据组中是记录这个字符跟每个类别的“相似度”),使用minMaxLoc函数才找出最大概率的类别。返回其位置。根据返回数据打印出字符。但是这个程序前提的是要能精准的找到车牌位置,但是实例中很难精准的找到车牌位置。其系统结构图如图下所示:

                                                     基于OpenCV的车牌识别系统之二 ——字符分割与识别_第1张图片

该系统在实际的实现的过程中存在有几个问题:

1.      车牌的二值化图像边框和柳钉没有清除干净会直接影响到后续的寻找轮廓。

2.      车牌的第一个字符,各种省份汉字(例如:粤,鄂字符)根本在20*20分辨率下的字符无法精确区分。

3.      车牌的第一个字符,例如川、沪等字时,字体容易分开,导致往往通不过验证函数。

 

那么怎么解决这些问题呢?

首先第一个问题比较容易解决,但解决的效果有待进一步加强。其想法是对车牌二值化图像行和列扫描。当行扫描时跳变小于某个阈值时,则认为这行数据中不包含字符信息,这行的像素直接置0。这样去除掉上、下边框和铆钉的影响。当扫描完行之后,直接在前端和末端抹掉两列(经验值)信息。这是为了去掉左右边框的影响。左图为含有边框噪声之图像,右图为消除边框噪声之后的图像,但是还有少量的噪点信息。

 基于OpenCV的车牌识别系统之二 ——字符分割与识别_第2张图片                                                                                                                    基于OpenCV的车牌识别系统之二 ——字符分割与识别_第3张图片

 

其次第二问题,这些车牌的首个汉字怎么解决,本程序是采用双ANN,将汉字分为一类,字母和数字为一类。分别使用神经网络模型,这样有效的提高了对汉字的识别率。作者在后期过程中对汉字字符处理的时,将其归一为40*40的分辨率,其效果也不是很理想。其原因是在原始图像中,字符的信息只有20*20像素,将其放大到40*40也是线性插值。如果想进一步提高汉字识别率,则需要更高的质量图像。

 

最后一个问题,由于作者C++语言水平能力有限所以这个问题也没有得到解决,但作者翻过几篇硕士论文筛选出两种方法:第一种办法是通过确定“特殊字符”来确定省份汉字的位置并直接进行截取。特殊字符是通过第二字符在车牌中大概位置(经验值),寻找其轮廓并画出凸包的外接矩形,根据“特殊字符”的外接矩阵进行窗口滑动。向前滑动一个间隙寻找到省份汉字。第二种方法是通过间隙阈值来确定两者为一个整体。这个两个办法,第一个方法过程虽然复杂且寻找得到的字符都会有点残缺,但此方法对二值化的图像质量要求不高且残缺的部分对字符识别影响较小。第二种方法对二值化后的图像质量要求较高,如果边缘没有处理好直接导致将第一个字符夹杂着大量的噪点信息,这样会在很大层度上影响到字符识别。针对以上问题我对原先的程序进行修改。这三张图片是我的实验结果截图:

 基于OpenCV的车牌识别系统之二 ——字符分割与识别_第4张图片   基于OpenCV的车牌识别系统之二 ——字符分割与识别_第5张图片基于OpenCV的车牌识别系统之二 ——字符分割与识别_第6张图片

 

PS:字符验证函数几乎是根据先验条件得到的,但是这里为什么不能用到先验条件呢?在我国的车牌上字符是比例是45/90,但这个比例是在图片正常的前提下。前面的文章将得到的车牌归一化为33*144,这样至多至少的已经将图片进行压缩或放大,且是不等比例的压缩或放大。这样字符比例已经不能作为的筛选条件。作者根据图像比例(实际的调试过程中的经验),设置字符的高度应在15-25个像素之间。本来想设置其字符宽度与高度之比,但是字符的宽度相差很大,例—字符为“1”时其宽度为3个像素值。故此这个验证函数的筛选条件还有待进一步的商榷。这个是值的改进的地方。调整期车牌的大小,具体根据摄像头定点拍摄时,车牌在图像中所占的像素个数来决定的。

代码:http://download.csdn.net/detail/chengchaopeng520/9808253

你可能感兴趣的:(基于OpenCV的车牌识别系统之二 ——字符分割与识别)