EasyPR--中文开源车牌识别系统 开发详解(2)车牌定位

  这篇文章是一个系列中的第三篇。前两篇的地址贴下:介绍详解1。我撰写这系列文章的目的是:1、普及车牌识别中相关的技术与知识点;2、帮助开发者了解EasyPR的实现细节;3、增进沟通。

  EasyPR的项目地址在这:GitHub。要想运行EasyPR的程序,首先必须配置好openCV,具体可以参照这篇文章

  在前两篇文章中,我们已经初步了解了EasyPR的大概内容,在本篇内容中我们开始深入EasyRP的程序细节。了解EasyPR是如何一步一步实现一个车牌的识别过程的。根据EasyPR的结构,我们把它分为六个部分,前三个部分统称为“Plate Detect”过程。主要目的是在一副图片中发现仅包含车牌的图块,以此提高整体识别的准确率与速度。这个过程非常重要,如果这步失败了,后面的字符识别过程就别想了。而“Plate Detect”过程中的三个部分又分别称之为“Plate Locate” ,“SVM train”,“Plate judge”,其中最重要的部分是第一步“Plate Locate”过程。本篇文章中就是主要介绍“Plate Locate”过程,并且回答以下三个问题:

  1.此过程的作用是什么,为什么重要?

  2.此过程是如何实现车牌定位这个功能的?

  3.此过程中的细节是什么,如何进行调优?

1.“Plate Locate”的作用与重要性

  在说明“Plate Locate”的作用与重要性之前,请看下面这两幅图片。

   

图1 两幅包含车牌的不同形式图片

  左边的图片是作者训练的图片(作者大部分的训练与测试都是基于此类交通抓拍图片),右边的图片则是在百度图片中“车牌”获得(这个图片也可以称之为生活照片)。右边图片的问题是一个网友评论时问的。他说EasyPR在处理百度图片时的识别率不高。确实如此,由于工业与生活应用目的不同,拍摄的车牌的大小,角度,色泽,清晰度不一样。而对图像处理技术而言,一些算法对于图像的形式以及结构都有一定的要求或者假设。因此在一个场景下适应的算法并不适用其他场景。目前EasyPR所有的功能都是基于交通抓拍场景的图片制作的,因此也就导致了其无法处理生活场景中这些车牌照片。

  那么是否可以用一致的“Plate Locate”过程中去处理它?答案是也许可以,但是很难,而且最后即便处理成功,效率也许也不尽如人意。我的推荐是:对于不同的场景要做不同的适配。尽管“Plate Locate”过程无法处理生活照片的定位,但是在后面的字符识别过程中两者是通用的。可以对EasyPR的“Plate Locate”做改造,同时仍然使用整体架构,这样或许可以处理。

  有一点事实值得了解到是,在生产环境中,你所面对的图片形式是固定的,例如左边的图片。你可以根据特定的图片形式来调优你的车牌程序,使你的程序对这类图片足够健壮,效率也够高。在上线以后,也有很好的效果。但当图片形式调整时,就必须要调整你的算法了。在“Plate Locate”过程中,有一些参数可以调整。如果通过调整这些参数就可以使程序良好工作,那最好不过。当这些参数也不能够满足需求时,就需要完全修改EasyPR的实现代码,因此需要开发者了解EasyPR是如何实现plateLocate这一过程的。

  在EasyPR中,“Plate Locate”过程被封装成了一个“CPlateLocate”类,通过“plate_locate.h”声明,在“plate_locate.cpp”中实现。

  CPlateLocate包含三个方法以及数个变量。方法提供了车牌定位的主要功能,变量则提供了可定制的参数,有些参数对于车牌定位的效果有非常明显的影响,例如高斯模糊半径、Sobel算子的水平与垂直方向权值、闭操作的矩形宽度。CPlateLocate类的声明如下:

class CPlateLocate
{
public:
    CPlateLocate();

    //! 车牌定位
    int plateLocate(Mat, vector<Mat>& );

    //! 车牌的尺寸验证
    bool verifySizes(RotatedRect mr);

    //! 结果车牌显示
    Mat showResultMat(Mat src, Size rect_size, Point2f center);

    //! 设置与读取变量
    //...

protected:
    //! 高斯模糊所用变量
    int m_GaussianBlurSize;

    //! 连接操作所用变量
    int m_MorphSizeWidth;
    int m_MorphSizeHeight;

    //! verifySize所用变量
    float m_error;
    float m_aspect;
    int m_verifyMin;
    int m_verifyMax;

    //! 角度判断所用变量
    int m_angle;

    //! 是否开启调试模式,0关闭,非0开启
    int m_debug;
};

  注意,所有EasyPR中的类都声明在命名空间easypr内,这里没有列出。CPlateLocate中最核心的方法是plateLocate方法。它的声明如下:

    //! 车牌定位
    int plateLocate(Mat, vector<Mat>& );

  方法有两个参数,第一个参数代表输入的源图像,第二个参数是输出数组,代表所有检索到的车牌图块。返回值为int型,0代表成功,其他代表失败。plateLocate内部是如何实现的,让我们再深入下看看。

2.“Plate Locate”的实现过程

  plateLocate过程基本参考了taotao1233的博客的处理流程,但略有不同。

  plateLocate的总体识别思路是:如果我们的车牌没有大的旋转或变形,那么其中必然包括很多垂直边缘(这些垂直边缘往往缘由车牌中的字符),如果能够找到一个包含很多垂直边缘的矩形块,那么有很大的可能性它就是车牌。

  依照这个思路我们可以设计一个车牌定位的流程。设计好后,再根据实际效果进行调优。下面的流程是经过多次调整与尝试后得出的,包含了数月来作者针对测试图片集的一个最佳过程(这个流程并不一定适用所有情况)。plateLocate的实现代码在这里不贴了,Git上有所有源码。plateLocate主要处理流程图如下:

图2 plateLocate流程图

  下面会一步一步参照上面的流程图,给出每个步骤的中间临时图片。这些图片可以在1.01版的CPlateLocate中设置如下代码开启调试模式。

    CPlateLocate plate;
    plate.setDebug(1);

  临时图片会生成在tmp文件夹下。对多个车牌图片处理的结果仅会保留最后一个车牌图片的临时图片。

  1、原始图片。

  2、经过高斯模糊后的图片。经过这步处理,可以看出图像变的模糊了。这步的作用是为接下来的Sobel算子去除干扰的噪声。

  3、将图像进行灰度化。这个步骤是一个分水岭,意味着后面的所有操作都不能基于色彩信息了。此步骤是利是弊,后面再做分析。

  4、对图像进行Sobel运算,得到的是图像的一阶水平方向导数。这步过后,车牌被明显的区分出来。

  5、对图像进行二值化。将灰度图像(每个像素点有256个取值可能)转化为二值图像(每个像素点仅有1和0两个取值可能)。

  6、使用闭操作。对图像进行闭操作以后,可以看到车牌区域被连接成一个矩形装的区域。

  7、求轮廓。求出图中所有的轮廓。这个算法会把全图的轮廓都计算出来,因此要进行筛选。

  8、筛选。对轮廓求最小外接矩形,然后验证,不满足条件的淘汰。经过这步,仅仅只有六个黄色边框的矩形通过了筛选。

  8、角度判断与旋转。把倾斜角度大于阈值(如正负30度)的矩形舍弃。左边第一、二、四个矩形被舍弃了。余下的矩形进行微小的旋转,使其水平。

    

  10、统一尺寸。上步得到的图块尺寸是不一样的。为了进入机器学习模型,需要统一尺寸。统一尺寸的标准宽度是136,长度是36。这个标准是对千个测试车牌平均后得出的通用值。下图为最终的三个候选”车牌“图块。

    

  这些“车牌”有两个作用:一、积累下来作为支持向量机(SVM)模型的训练集,以此训练出一个车牌判断模型;二、在实际的车牌检测过程中,将这些候选“车牌”交由训练好的车牌判断模型进行判断。如果车牌判断模型认为这是车牌的话就进入下一步即字符识别过程,如果不是,则舍弃。

3.“Plate Locate”的深入讨论与调优策略

  好了,说了这么多,读者想必对整个“Plate Locate”过程已经有了一个完整的认识。那么让我们一步步审核一下处理流程中的每一个步骤。回答下面三个问题:这个步骤的作用是什么?省略这步或者替换这步可不可以?这个步骤中是否有参数可以调优的?通过这几个问题可以帮助我们更好的理解车牌定位功能,并且便于自己做修改、定制。

  由于篇幅关系,下面的深入讨论放在下期。

版权说明:

  本文中的所有文字,图片,代码的版权都是属于作者和博客园共同所有。欢迎转载,但是务必注明作者与引用来源。任何未经允许的剽窃以及爬虫抓取都属于侵权,作者和博客园保留所有权利。

参考文献:

  1.http://my.phirobot.com/blog/2014-02-opencv_configuration_in_vs.html

  2.http://blog.csdn.net/jinshengtao/article/details/17883075

  3.http://www.ruanyifeng.com/blog/2012/11/gaussian_blur.html

  4.http://blog.csdn.net/xiaowei_cqu/article/details/7829481

时间: 2024-08-21 13:39:42

EasyPR--中文开源车牌识别系统 开发详解(2)车牌定位的相关文章

(转载) 车牌识别EasyPR--开发详解

车牌识别EasyPR--开发详解 http://blog.csdn.net/liuuze5/article/details/46290455 源码GitHub:https://github.com/liuruoze/EasyPR

够拾惠商城系统开发详解

够拾惠商城系统开发app,够拾惠商城系统定制开发@136.1013.1824 杨小姐 在消费者主权时代,一切以消费者为主,企业生产什么由消费者决定,一切产品与服务围绕着消费者的偏好来运转,消费者的需求就是生产的目的.由此引发了一种新的体验经济的盛行,体验产品与服务也越来越多,先体验后埋单,这是新经济的新趋势. 够拾惠商城是由"惠州万商汇电子商务有限公司"重金投资研发推出的新型电子商务平台和营销模式. 够拾惠商城把普通消费者日常在商家(授权的联盟商家)的正常消费额通过本平台再赠送回去,通

斑布生活家系统开发详解模式设计

斑布生活家系统开发(李想.185.6504.8478)根据化石研究,史前时代的始祖鸟被认为是最早的飞行鸟类,它在许多方面已显现鸟的一些雏形,例如全身长有羽毛和翅膀.具有明显的叉骨等.这些证据表明,鸟类的飞行能力应该是伴随着一系列亲缘动物的进化发展而逐渐形成的.气囊的收缩和扩张跟翼的动作协调.两翼举起,气囊扩张,外界空气一部分进入肺里进行气体交换.另外大部分空气迅速地经过肺直接进入气囊,未进行气体交换,气囊就把大量含氧多的空气暂时贮存起来.两翼下垂,气囊收缩,气囊里的空气经过肺再一次进行气体交换,

微领地小蜜app模式系统开发详解

如今企业竞争的最高境界, 不再是产品的竞争.人才的竞争.营销的竞争-- 而是一种商业模式(即赢利模式)的竞争. 微领地小蜜软件,微领地小蜜系统,小蜜APP,微领地小蜜平台,微领地小蜜开发公司,微领地小蜜服务模式,微领地小蜜商圈.O2O.C2B.B2C.F2C.B2B.C2N.C2C等微商城.App.手机网页.PC商城.小程序,微商管理系统.一物一码.防伪防窜.扫码红包.质量追溯.分销.全返.分红.拼团.互联网+直播+定制服务·系统开发提供中心. 回首过去,创新与发展裹带着机遇和挑战,微领地小蜜在

起点联盟模式系统开发详解

创惠起点联盟系统开发(苏念.188.1414.7927)起点联盟系统开发.起点联盟模式开发.创惠起点联盟平台开发.创惠起点联盟开发.创惠起点联盟制度开发,"公益营销",一个在百度上可以搜索出大约39万条结果的概念,其实却是一个中国特色与新时代媒体环境下的特殊产物.这样的结论令人费解却又经得起推敲.公益属于社会责任,营销却是商业手段,这二者是怎样结合到一起的?它的平衡点在哪里?公益营销能够为企业带来什么正面影响,而与此同时又令企业面临哪些风险?公益项目需要企业的资金支持,而企业从中获得社

善心汇系统开发详解——商业+公益怎么实现共赢?

善心汇系统开发 联系 苏念 188.1414.7927 善心汇平台开发 善心汇模式开发 善心汇制度开发 "实际上,公益与商业是相结合的,在国外,很重视社会企业,公益组织都有自己的实体,但是在国内,由于国内人们的公益意识刚刚蒙起,大家对公益的意识和理解不够深刻,所以把公益局限在了商业之外,但是从去年年底开始,已经有很多公益组织开始建立实体,做'社会企业',社会企业的存在就代表了,公益与商业是相互结合的,有很多人看不惯公益中有商业运作,但是实际上,一个成功的公益组织是离不开商业运作的. 社会企业不是

欢乐茶园游戏系统开发详解

欢乐茶园游戏系统开发(苏念 188.1414.7927) 欢乐茶园游戏开发 欢乐茶园种植开发 欢乐茶园app开发 互联网和大数据的发展,是一个从人找信息,到信息找人的过程.先是人找信息,人找人,信息找信息,现在是信息找人的这样一个时代.信息找人的时代,就是说一方面我们回到了一种最初的,广播模式是信息找人,我们听收音机,我们看电视,它是信息推给我们的,但是有一个缺陷,不知道我们是谁,后来互联网反其道而行,提供搜索引擎技术,让我知道如何找到我所需要的信息,所以搜索引擎是一个很关键的技术. 1   商

一文鸡游戏系统开发详解!

一文鸡游戏系统开发 (苏念.188.1414.7927) 一文鸡模式开发 一文鸡游戏开发 一文鸡制度开发 一文鸡复利拆分系统开发 一文鸡怎么开发 开发一文鸡游戏 一文鸡理财游戏开发 一文鸡app开发,CNNIC发布的<2016年第39次中国互联网络发展状况统计报告>显示,截至2016年12月,我国农村网民占比为27.4%,规模为2.01亿,较2015年底增加526万人,增幅为2.7%,仍然比较缓慢.目前,农村人口是非网民的主要组成部分.截至2016年12月,我国非网民规模为6.42亿,其中城镇

美容预约系统开发详解源码模式设计

美容预约系统开发(李想.185.6504.8478)美容一词可以从两个角度来理解.首选是"容"这个字,其次是"美"."容"包括脸.仪态.和修饰三层意思."美"则具有形容词和动词的两层含义.形容词表明的是美容的结果和目的是美丽的好看的:动词则表明的是美容的过程,即美化和改变的意思.预约系统是一种通过微信公众号或者app平台来实现一键预约服务的系统,常见的有游泳馆一键预约,美容一键预约,健身一键预约,按摩一键预约,诊所一键预约,试