毕业设计:车牌识别
编辑时间:2013年1月8日
毕业设计师下学期开始,不过课题已经选定了。这里写个引子,同时也记录下自己的做的过程。
我最近去图书馆去查资料,准备借书,同时顺手翻了下那些计算机图形学的书,都写满公式,什么矩阵运算,傅里叶变换,很深奥的数学,感觉像是研究生的教材。如果一页页的去看,2个月估计什么都做不出来。这个寒假先大致看看吧。
在图书馆借的书:
- 《Visual C++数字图像模式识别技术及工程实践 》,张宏林,人民邮电出版社
这本书看着不错,有可以直接上手的C++算法代码。前面部分讲解原理理论,后面部分分别是联机字符识别,脱机字符识别,在线签名、离线签名鉴定,车牌识别技术,印章识别技术,图像的纹理分析方法实例讲解,多附有关键算法代码。当然也有光盘,我没借。
编辑时间;2013.01.15
大学最后一个寒假了,深感责任重大,玩游戏都有负罪感。我应该好好利用家里的宽带,在优酷上找到电子科大的网络教学视频,并且去MIT的公开课OCW上找到不少好书。在这过程中,一方面感受到在天朝真好,米国几十美元的书在国内电子书版本唾手可得,另一方面,国外有免费的教学视频都被伟大的祖国屏蔽了。
这里是些资源:
- OCW的Computer Graphics课程:http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-837-computer-graphics-fall-2003/index.htm
- C#语言的图像处理入门:http://www.tmorley.net/begintut01
- 在StakeFlow.com上的一个F&Q:http://stackoverflow.com/questions/7432277/how-do-i-get-started-with-image-processing
- 国外大学的Image Processing课程PPT:http://ia700307.us.archive.org/7/items/Lectures_on_Image_Processing/
资源1中,是计算机图形学的内容,是本科授课的内容,一时半会看不完,并且和图像处理相差有点远。资源2中,是用C#语言做的图像二值化和取阀值处理什么的,适合想编程的同学(里面有完成的工程代码压缩包)。资源3中,热心程序员们给了很多的链接。其中有一个资料很丰富,就是资料4,这个才是图像处理,图像处理和计算机图形学差别还真不小。
同时,作为图形系统的重要组成部分,硬件系统也是必须要了解的。这里有GPU的相关信息:
- 综述GPU发展-百度文库: http://wenku.baidu.com/view/184652ff941ea76e58fa04c2.html
- 《Intel Larrabee GPU 体系结构初览》:http://www.hpctech.com/2009/0718/9.html
- 这是资源1的原文(英文):http://arstechnica.com/gadgets/2008/07/intels-larrabee-gpu-based-on-secret-pentagon-tech-sorta/
资源1差不多是GPU的入门介绍吧。资源2虽然题目是Intel的一个GPU介绍,但是里面涉及的内容和知识相当丰富,也相当专业,有时间可了解了解术语和定义。当然文章结尾还附有参考文献,英文好的同学也可以翻译下供大家分享。
编辑时间:2013.01.18
在网上下载到《数字图像编程入门》,一个很旧的pdf,不过写的很浅显。都是基本的vc操作。昨天和今天做了两天的VC++编程,居然才搞定一个win32加载位图的程序,主要学习了windows系统中位图文件的数据结构和win32编程的一些技巧。为了巩固知识,同时也能帮助网友,我将这两天的学习成果写成了博客,点这进入。
编辑时间:2013.01.19
接着又想着如何加载文本文件,于是有了这个。可能有点里跑题了。
编辑时间:2013.01.25
最近堕落了,玩游戏吃喜酒去了。。。
编辑时间:2013.01.29 更新时间:2013.02.06
最近发现OpenCV也可以进行图像的识别,并且已经相当的成熟,鉴于软件开发中不能重复造轮子的重要思想,可以直接使用OpenCV开源库来进行进一步的开发,不然再重走别人老路,这是浪费生命的行为。鉴于毕业设计时间比较紧张,当然是有开源用开源了。
一直在看从百度文库下载的《基于OpenCV的车牌系统研究》,希望能赶在开学前实现能识别车牌的功能。文章中思路详细,但是只提及到函数层面,没有具体完整代码。
- OpenCV的中文网站:http://www.opencv.org.cn/index.php/%E9%A6%96%E9%A1%B5
- Sobel算子及开源库中cvSobel函数的使用:http://blog.sina.com.cn/s/blog_67818619010118pu.html
- 《学习OpenCV》
- opencv的图像二值化、阈值获取、直方图、轮廓提取 :http://blog.csdn.net/ycc892009/article/details/6516899【含源码】
博客2通俗易懂的说明了边缘检测中使用的各种算法的由来和逐步的改进,并且还附有一个短代码例子。
资源3是个书,不过网上有PDF,可以参考,当然有时间要仔细阅读。
编辑时间:2013.02.06
自己下载安装了OpenCV1.0,目前最新版本是(2.x),但是VC6只支持OpenCV1.0。目前就只会简单的把彩色变灰色(3通道变单通道)。在OpenCV的中文网站中介绍很详细,我也就不写出来了。只要能正确安装OpenCV的同学就能写出来。(大概10行代码)
在看各种算法过程中,意识到学习图像识别,需要的更多的是通信方面的知识,什么卷积,什么高频低通滤波器之类的。有些知识需要从通信的书里面补一补,不过现在在家没书,只能回校去图书馆看上一看了。
编辑时间:2013.03.06
最近要找工作,由于是春季招聘,公司不是很多,所以特别卖命的四处跑,过几天还要去川大应聘。这个星期导师分别吩咐了每个人该借哪方面的书,怎么做。我特意问了下能不能直接用OpenCV开源库,老师一时半会没听清,最后说可以,但是要自己写要写些算法出来。老师的大概意思就是:先做出简单的,这个可以慢慢来,不过最后说每周二上午都要过去找他。唉,真是麻烦那。
导师指定了一本书:《数字图像处理与分析》,张弘著,机工社的,说是他带研究生的教材。然后我到图书馆又找一本挺不错的,是《数字图像处理——编程框架、理论分析、实例应用和源码实现》,孙兴华、郭丽编著。大概翻了下,作者把自己的博士期间的研究成果——基于内容的图像检索系统直接作为本书的编程框架,然后从介绍编程框架开始,以编程框架的接口扩展结束,中间串联这从易到难的数字图像处理功能,几何变换、图像分割,复杂的有图像压缩编码、图像底层特征提取,还有更复杂的光流分析、兴趣点提取、基于内容的图像检索。关键是书上就有源代码。
其实,寒假结束的时候就做到一定程度了。大概结果是这样:
图1 源图像
图2 大律法取阀值后二值化
图3 反色
很明显,车牌处理的并不好,中间的数字信息丢了,这会严重影响整个系统的效果。接着看书上说要“灰度拉伸”,就是增强对比度。我试了下,果然效果显著。
编辑时间:2013.4.15
转眼时间又过去了一个月,最近在公司里实习。
编辑时间:2013.04.25
最近老师开始要看成果了,结果还是做到边缘提取,车牌的提取做不出来了。一直在用OpenCV,但是OpenCV也就只能做到这里了。做出上面效果也就是10代码的事情,做了也没有什么实质性的成果。车牌区域的提取,其实方法很多,无非是:
- 边缘提取[Sobel],霍夫变换[Hough] 检测直线,判断长宽比
- 形态学操作[膨胀,收缩] 找到矩形,判断长宽比
- 直接扫描每行,检测灰度跳变 找到跳变>某值的行则为车牌所在行
- 纹理分析 根据颜色来弄[不懂]
因为我搜到的多是采用方法1做的,结果我自己动手做,Hough变换太坑爹了。车牌稍微倾斜一点就检测不出来了。本来,其实,我想着按照上图左下的那张效果,采用形态学应该比较好,但是想老师汇报后,老师直接否决了:不要用那个形态学,你又不会用,就用车牌的特征去做。我也知道有特征啊,关键是怎么提取出来呢?又去搜索一遍,发现方法3最靠谱,也简单,目前正在搞。
另附2个小知识:
文章重点:Windows系统中一行像素所占的字节数为4的倍数,因此不是4的倍数时要补充为4的倍数,这样在寻址每一个像素的时候,像素的地址为 pImage+i*lineByte+j ;而循环控制语句for(j=0; j<width; j++)中仍用width,不用lineByte,因为补充的数据不是原图像数据,我们不需要处理
2. IplImage为imageData为何是char *而不是unsigned char *?
【在这里吐槽一下,一些电子软件期刊上的文章坑爹弱智到极致,我都不明白这么水的文章还有人发表。明显文章的配图就是随便截的小图,说明也是空无一物。】
编辑时间:2013.07.23
好吧,今天已经是七月多了。忙了很久的毕设也早就结束了,伴随着毕设,大学生涯也全都落下帷幕。最后一个月,忙着各种卖书,整理东西,刚参加完毕业典礼,就匆匆坐上火车回家了。所以现在才有时间结束这个随笔。
先说说我的最终结果吧,车牌定位相对后面的字符识别简单多了。这是我后来才发现的,可惜时间都已经耗费的差不多了。导师开始也没有提醒这一点,后来发现了才开始一直催。没办法了啊,我就直接把要演示的图片做成了模板,自己和自己比对,算是蒙混过关了吧。说实话,这个汉字的识别真是太难了。我没有用神经网络,直接模板匹配的。
总结整个过程:
1. 车牌定位就用最简单的水平投影分析,简单高效(图很大的时候效果也很好)。不过还要进一步细化,去除车牌的边框。这个我也用投影分析(水平的,垂直的都用)。
2. 车牌字符识别,还真是难。基本没有做出来。参考(基本是拷贝)了一本书上面的代码。
相关代码和演示PPT及毕设论文下载。
其中论文主要参考:
[1] 姚蕾. 车牌识别系统的软件设计与实现. 上海交通大学硕士学位论文. 2009.12