赞
踩
之前学习了一个GitHub开源的框架,GitHub地址为:
https://github.com/liuruoze/EasyPR
希望通过此篇博客详细阐述如何一步步实现车牌的识别过程。
车牌识别分成了两个部分,首先是车牌的定位,然后则是车牌的文字识别。
Plate Detect过程中包含了三个部分,“Plate location”,“SVM train”,”Plate judge”。其中最重要的是“Plate location”部分。
有人提出了这样的疑问:
EasyPR在处理百度图片时的识别率不高。确实如此,由于工业与生活应用目的不同,拍摄的车牌的大小,角度,色泽,清晰度不一样。而对图像处理技术而言,一些算法对于图像的形式以及结构都有一定的要求或者假设。因此在一个场景下适应的算法并不适用其他场景。目前EasyPR所有的功能都是基于交通抓拍场景的图片制作的,因此也就导致了其无法处理生活场景中这些车牌照片。
因此对于不同的场景,算法要做不同的适配。对于“Plate Location”过程无法处理生活照片的定位,我们可以对这一部分进行适配改造,但是后面的字符识别过程是相同的,整体架构不变。
在EasyPR中,“Plate Locate”过程被封装成了一个“CPlateLocate” 类,通过“plate_locate.h”声明,在“plate_locate.cpp”中实现。
CPlateLocate包含三个方法以及数个变量。方法提供了车牌定位的主要功能,变量则提供了可定制的参数,有些参数对于车牌定位的效果有非常明显的影响,例如高斯模糊半径、Sobel算子的水平与垂直方向权值、闭操作的矩形宽度。
CPlateLocate中最核心的方法是plateLocate方法。
//! 车牌定位
int plateLocate(Mat, vector<Mat>& );
方法有两个参数,第一个参数代表输入的源图像,第二个参数是输出数组,代表所有检索到的车牌图块。返回值为int型,0代表成功,其他代表失败。plateLocate内部是如何实现的,让我们再深入下看看。
如果我们的车牌没有大的旋转或变形,那么其中必然包括很多垂直边缘(这些垂直边缘往往缘由车牌中的字符),如果能够找到一个包含很多垂直边缘的矩形块,那么有很大的可能性它就是车牌。
识别流程如下:
1、对原始图像高斯模糊,这步的作用是平滑图像,去除干扰的噪声。
2、对灰度图像进行Sobel运算,得到图像的一阶水平方向导数。其实是提取出了图像的边缘信息。
3、对图像使用闭操作,可以看到车牌闭操作后被连接成一个矩形的区域。
4、求出上面图像的所有轮廓。对所有的轮廓要进行筛选。
5、对所有轮廓求最小外接矩形,然后验证,不满足条件的被淘汰。验证一般是按照外接矩形的长宽比例范围设置一定的阈值。
6、角度判断,我们要把倾斜角度大于阈值(如正负30度)的矩形舍弃。余下的矩形进行微小的旋转,使其水平。
7、上面的是 候选
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。