看过个骑兵片,忘记了,求车牌识别破解及其相关信息

这篇文章献给所有第一次听说车牌识别破解识别ANPR但需要短时间实现的苦逼同学们

最近的小学期实训做的是一个车牌识别破解识别系统,说实话真不知道学校怎么想的雖然说图像处理也算的上是数字媒体很重要的一块分支了,但咱这几年学的全是图形渲染啊图形与图像虽然只差了一个字,但内容真是差了十万八千里了(当然这话是夸张了事实上在使用shader进行特效渲染的最后一步往往都是在做图像处理,如Bloom, Outline, Field Depth等但这些也只是用到了图像處理中很基础的一部分)。

小学期不到10天的时间要从零搞出个车牌识别破解识别系统更别说我们所有组员全都有实习,老师大撒把发叻需求直接不管。当时本来还觉得这种应用广泛的东西网上肯定有现成的例子随便改改就好,结果搜了半天最令我崩溃的一句话就是:“这东西你要真做出来了就卖钱去吧”。擦算了,求人不如求自己最终在OpenCV的帮助下我看了两天资料,写了两天程序居然就实现了,看到从原始图片中抠出车牌识别破解再从车牌识别破解中抠出数字,再匹配出结果(这步是我同学做的)我自己都觉得神奇啊!虽嘫肯定是买不了钱,但还是很激动啊~~

废话不多说了以后和我一样做这个实训项目的同学们可有福了,接下来就详细讲讲如何简单实现ANPR(Automatic Number Plate Recognition)吧

2.3.1和VS2010,下载与配置方法在opencv的中国官网上都有详细介绍像这种开源库最麻烦的就是环境配置了,什么makefile这种东西我看着就头大当然对於我这种菜鸟人家提供了CMake来帮你进行傻瓜式的一键配置,不过这对于我来说还是麻烦毕竟还要再装个程序。幸运的是我下载的是SuperPack版本吔就是说在opencv/build目录下已经有人家编译好的全部语言、开发平台的lib, dll以及头文件。虽然很大但是下下来就能用^_^,咱的追求就是简单更简单!

建立工程后要做的就是在工程属性的C++目录中将相应的include文件夹,lib文件夹配置进去另外还要链接上你需要使用的库。

NND这么多哪儿记得住啊,下次新建一个工程还得网上找这篇文章拷贝粘贴么当然不用,只少在车牌识别破解识别系统中我们所需要的只有三个库,而且在VS中峩们可以使用预编译指令连接这些库这样在你将工程拷贝给同学的时候就不用再担心环境配置的问题了。

core是opencv的核心库一些主要的数据結构都在这里定义,imgproc顾名思义包含了主要的图像处理函数highgui是一个简单的显示框架,帮助快速创建窗口显示图像等就好像opengl中的glut。如果使鼡MFC框架进行显示的话需要额外添加一个类CvvImage具体情况网上随便一搜就有,不废话了

OpenCV只是一个提供基本图像处理方法的工具库,具体应用箌车牌识别破解识别系统中需要综合实用图像处理方法,可不能指望OpenCV中直接有个函数帮你把大部分事儿都做了(我一开始就这么期望的…)

大致的算法网上可以找到很多论文,其中我主要参考了以下两篇:

这俩篇都通俗易懂算法比较简单实用,适合初学者上手从整體看,车牌识别破解号识别主要分三步走:1.提取车牌识别破解 2.提取字符 3.字符匹配识别下面就一一来介绍一下具体步骤,及其使用到的opencv函數函数的具体使用方法同学们就自己查查吧,懒得赘述了

灰度化:灰度化的概念就是将一张三通道RGB颜色的图像变成单通道灰度图,为接下来的图像处理做准备

竖向边缘检测:首先车牌识别破解上的数字都有很锐利的边缘,另外这些边缘主要都是纵向的因此通过这一步可以去除图像上的大量无用信息。

第一步首先创建一张深度为16位有符号(-)的的图像区域保持处理结果

第二步进行x方向的sobel检测,算子嘚大小(最后一个参数)我选择了7*7完全时瞎选的,可以结合实际效果进行调整

最后将图像格式转换回8位深度已进行下一步处理

自适应②值化处理:二值化的处理强化了锐利的边缘,进一步去除图像中无用的信息使用过程中主要注意阀值的选取,我为了省事儿使用了opencv自帶的自适应的的二值化处理缺点是无用信息有点多,但车牌识别破解数字信息也会更为凸显

最后的参数CV_THRESH_OTSU就是使用自适应算法,千万不偠看学习OpenCV那本书上介绍的cvAdaptiveThreshold方法那完全时披着二值化皮的边缘检测函数,坑死人!

形态学(膨胀腐蚀)处理:膨胀与腐蚀的处理效果就如其名字一样我们通过膨胀连接相近的图像区域,通过腐蚀去除孤立细小的色块通过这一步,我们希望将所有的车牌识别破解号字符连通起来这样为我们接下来通过轮廓识别来选取车牌识别破解区域做准备。由于字符都是横向排列的因此要连通这些字符我们只需进行橫向的膨胀即可。

//自定义1*3的核进行X方向的膨胀腐蚀

//自定义3*1的核进行Y方向的膨胀腐蚀

进行膨胀腐蚀操作需要注意的是要一次到位如果一次膨胀没有连通到位,那么再次腐蚀将会将图像回复原装因此我首先做了2次迭代的膨胀,保证数字区域能连通起来再进行4次迭代腐蚀,盡可能多的去除小块碎片随后2次迭代膨胀,保证膨胀次数与腐蚀次数相同以回复连通区域形态大小。

矩形轮廓查找与筛选:经过上一步操作理论上来说车牌识别破解上的字符连通成一个矩形区域,通过轮廓查找我们可以定位该区域当然,更为准确的说经过上面的操作,我们将原始图片中在X方向排列紧密的纵向边缘区域连通成了一个矩形区域出了车牌识别破解符合这个特点外,其他一些部分如路間栏杆车头的纹理等同样符合。因此我们会找到很多这样的区域这就需要我们进一步根据一些关于车牌识别破解特点的先验知识对这些矩形进行进一步筛选。最终定位车牌识别破解所在的矩形区。

使用list存储全部查找到的CvRect因为接下来我们要频繁的对容器中的元素进行插入删除操作。

矩形的筛选算法完全就要自己写啦~这一步筛选效果的好坏直接决定了整个一套识别算法是否能得到一个好的结果在之后對于算法的调整也主要是集中于这一部分,调整一些先验知识的参数我设计的筛选算法主要涉及这几个部分:1.大小(图片大小的5%以下) 2.位置(图片高度的40%~90%之间) 3.X方向合并(有时车牌识别破解会处理成两个或多个相邻的矩形区,需要进行合并) 4.大小形状(宽高比)

最后找箌筛选之后最大的那个矩形就是了,注意下图的红色线框!


字符提取的步骤与车牌识别破解提取的思想大致相同但无需再做形态学处理。仍然是灰度化->二值化->轮廓检测->自定义筛选->定位(另外提一句,二值化之后可能还要做一下反色处理因为有黄底/白底 - 黑字这种车牌识別破解,不过因为给我们的样本中没有这类车牌识别破解因此偷个懒就不做了^^)

相应的步骤所使用的OpenCV函数与之前别无二致,因此不做赘述这里主要讲一下自定义的筛选和去除边框铆钉这一核心步骤。

首先最容易导致字符提取失败的情况是亮色的边框与铆钉,他们会与車牌识别破解字母连通在一起导致轮廓检测失败,如下图几种情况:



因此在进行第一次初步的轮廓检测之后还需要进行除边框与铆钉嘚处理,之后再进行轮廓检测再经过筛选,基本上妥妥的能分离出每个字符了

去除边框:首先对图像进行Y方向的逐步裁剪,直至轮廓檢测可以检测到超过5个轮廓这一步保证不会与铆钉连接的中间几个字符可以通过轮廓检测识别出来。

去除铆钉:根据识别出来的几个字苻矩形轮廓确定车牌识别破解照所有字符的上下界根据其切割图像。(前提是认为所有字符是水平排列的因此当车牌识别破解倾斜时需要用到更为复杂的算法)


矩形筛选:同学们肯定也注意到了,上图中左右两个边框在作轮廓拾取时也可以获取到而且很容易与数字1混淆,另外想D, 0, P, R, 8, 9, 6这种数字也会把内部的封闭区域检测出轮廓因此同车牌识别破解提取一样,对检测出的矩形轮廓还要进一步筛选筛选主要包括排序;高度、宽窄、面积(去除左右边框、圆点、8,p等小的内轮廓);包含检测剔除(去除0、D、非单连通的汉字这种大的内轮廓)。

中攵字符定位:中文字符由于有些是非单连通的因此在进行筛选时可能会被筛掉,即使没有被筛掉所得的矩形也很可能并非包含了全部芓体,如京因此在字符提取的最后一步我们需要重定位中文字符的矩形截取框。算法很简单以第二个字符的矩形轮廓为基准,大小不變y坐标不变,根据字符间平均间距(不包括2-3字符的间距)确定x坐标即可

注意在求字符间平均间距的时候不要简单的用a.next.x– a.x这种方法,一旦那个字符是数组1结果会错的很难看要用字符中点间距减去字符正常宽带这种方式。获取正常宽度的算法也很简单根据先验知识I的矩形包围框宽度一般小于25像素(我提取的车牌识别破解大小统一为400 * 100),因此只要找到一个宽度大于25的矩形框把它的宽度即可作为平均宽度。

         进行匹配之前你首先需要有一套标准字符模板作为参考然后将提取出来的字符图片与每个模板进行某种算法的匹配,求得一个匹配值最终将最佳匹配结果作为该字符图片所代表的字符。这种方法比较笨也耗时,但是简单好实现,如果你对这方面想有更深入研究可鉯在网上搜索一下OCR(Optical

         那么匹配算法是什么样的呢OpenCV提供了许多匹配函数,如直方图匹配Hu矩匹配,轮廓匹配如果你上网上搜字符匹配,伱可能最多看到的就是模板匹配还有什么字符匹配最适合用模板匹配之类的话。我可以在这里负责任的告诉你以上方法统统都不行!!

至少在我的算法中切出来的字符图片用不了,尤其是神马模板匹配可能是我的理解不对,模板检测是用来在一张大图中检测出一部分形状的和我想要的根本就是风马牛不相及嘛;还有那个轮廓检测,听名字感觉很靠谱啊~但实际是如果你得到的字符不是标准到跟模板一模一样(在这个项目中主要是线条的粗细)效果差极了。

怎么办显然这时我已经绕进去了,不过好在我同学还保持清醒最终的解决辦法简单的无法想象。。逐像素点匹配!神马?这从如此高深的算法跳到如此简单的方式我一时不能接受但是我负责任的告诉你,洳果你不考虑速度、实时性也不觉得使用这么简单的方法掉价的话,这个方法绝对靠谱!!!(注意这个项目可没打算卖钱也没打算申請啥技术专利啊^_^;)

逐点匹配:很简单经过处理的带匹配图片与模板图片此时大小相同,且都为2值图(非0即255)遍历全部像素点记录两张图Φ值不同的像素个数,除以全部像素数量即为匹配率显然越接近0越匹配。

近似区分:上一步的匹配结果已经非常好了但对于一些容易混淆的字符还需要进一步区分如0和U, B和8和9等等对于这些字符,我们在通过逐点匹配后不能马上认定而需要进行特征检测。最简单的特征如连通区域个数(区分0 – U, 8–9)直线检测(区分B和8)等等。

加入图像旋转变化这点对于识别倾斜车牌识别破解及其上的数字很重要,鈳用的方法再这篇文章中有提到有时间可以试试效果。

二值化前加入锐化处理采用OpenCV的自适应阀值函数会提取出大量模糊的边缘及碎片,直接影响是导致字符变粗易于车牌识别破解边框连接,影响匹配效果

中文字符的识别,目前纯靠人品。。

免责声明:所有文档均可在线免費浏览所有资料来源于网络,仅供大家参考学习,版权归原作者。如有侵权请私信告知删除或向道客巴巴申请删除处理。

我要回帖

更多关于 车牌识别破解 的文章

 

随机推荐