基于VC++实现的支持视频和图片的车牌定位与识别系统

Naiiive

发布日期: 2018-10-05 23:57:03 浏览量: 993
评分:
star star star star star star star star star star
*转载请注明来自write-bug.com

1 引言

在建设平安城市的进程中,安全是政府日常管理工作中的重要任务。随着城市报警和监控系统的建设,对于监控数据的分析也日显重要。

目前需要对重点街道或路口采集的视频数据进行分析,主要包括两点:

  • 对于视频中过往机动车辆的机动车牌提取出来,生成截屏图片;

  • 对提取的图片中机动车牌号码进行提取,并输出文件进行记录。

通过系统的自动分析提取,可以对街道或路口的车辆流量进行统计,一方面解决了从海量数据中人工分析的困难,另一方面通过机动车辆的统计,对城市道路建设以及交通管理都具有重要指导意义。

1.1 编写目的

该文档是基于视频文件的车辆分析系统的设计说明书,主要是向开发人员介绍系统软件的详细设计。

1.2 背景

为了对街道或路口的车辆流量进行统计,以及解决从海量数据中人工分析的困难,开发此车辆分析系统。

2 需求分析

2.1 功能性需求分析

视频文件转换为有车牌号码框的图片集合,将现有的视频文件按每帧进行分析,识别出存在车牌号码框的帧,并且将视频的该帧转换为图片,在图片中将识别出的车牌框使用明显的色彩框进行标注。约束条件:

  • 视频文件支持MPEG格式,导出的图片集合为BMP格式
  • 车牌支持蓝牌、黄牌

  • 导出图片车牌号码框标识,从视频文件所转换的图片中,将识别到的车牌号码用色

车牌号码文字识别,对图片中的车牌号码识别形成车牌号码列表,并保存号码列表到文件。约束条件:

  • 图片为BMP格式

  • 车牌支持蓝牌,黄牌

  • 车牌号码支持中国车牌格式,例如:苏AXXXXX

车流量统计,通过对视频的车牌框识别与生成图片的号码文字识别,对号码进行去重处理,并计算该视频中的车流量。约束条件:

  • 在车流量计算中,同一个车牌号码只计算为1个流量单位。

2.1 非功能性需求分析

  • 系统内存消耗控制在1GB以内

  • 系统可以在Windows XP操作系统上运行

  • 支持清晰度为CIF(352*288)、4CIF(705*576)的视频文件

3 系统总体设计

3.1 软件界面

3.2 系统流程图

3.3 系统详细说明

3.3.1 图像处理

图像处理包括灰度化,灰度均匀化,Robert算法轮廓提取,中值滤波,自适应二值化,图像的腐蚀和膨胀。

  • 图像灰度化函数:cvThreshold()。
  • 灰度均匀化函数:cvEqualizeHist()。
  • Robert算法是自己写的,函数名为:RobertDIB()。
  • 中值滤波函数是自己写的,这里用的是3*3的大小滤波。函数名为:myMedianFilter()。
  • 自适应二值化函数为:cvThreshold(),其中参数为:CV_THRESH_BINARY| CV_THRESH_OTSU,实现自适应。
  • 图像的膨胀与腐蚀虽然是使用的opencv封装的cvDilate函数,和cvErode函数,但是膨胀与腐蚀的结构元素和处理次数都是根据实际情况设定的。

3.3.2 车牌定位

车牌定位主要是在前面对图像的处理后,车牌区域已经基本处于一块白色的区域,然后用CvMemStorage类创造出一块内存空间,再用cvFindContours()方法提取所有连通区域的所有轮廓保存到这个内存中。再对每一个轮廓进行筛选。这里进行筛选的方法是,根据轮廓用cvBoundingRect()方法得到每个轮廓的矩形区域,这里因为车辆的远近导致大小不一,所以给车牌的大小设定范围,这里我设定的范围是,宽度比高度大18个像素点,宽度在50像素和25像素之间,高度在25像素和5像素之间,宽度与高度的比值取值可以是2或者3或者4。筛选条件的代码为:

  1. area_Rect->width-area_Rect->height>=18 &&
  2. area_Rect->width<=40 &&
  3. area_Rect->width>25 &&
  4. area_Rect->height<25 &&
  5. area_Rect->height>5 &&
  6. (area_Rect->width/area_Rect->height==2 ||
  7. area_Rect->width/area_Rect->height==3 ||
  8. area_Rect->width/area_Rect->height==4)

这样筛选之后,大区域的轮廓就被过滤掉了,但是还有和车牌特征相近的区域存在,比如车灯,车辆的牌子等等。于是,还需要进行下一步过滤。由于,车牌的自身特点是里面会有字符,每个字符之间有一定空隙。于是,我先灰度化,二值化这些被筛选过一次的区域,然后竖直膨胀20次(为了让竖直方向全是白色),最后从左到右的计算0变1,1变0的次数,大于12次(相当于6个字符)的时候就当做是车牌区域。

3.3.3 车牌识别

车牌识别部分我用的是SVM算法+HOG特征提取的方式。先把车牌里的字符进行分割,这里分割的方式和定位车牌的时候很像。提取出每个矩形轮廓基本就是字符区域。然后用另外一个工程制作SVM分类器进行识别,制作过程分为:训练集的收集,通过训练得到分类器,这里的分类器数据我保存在HOG_SVM_DATA.xml文件中,然后主工程文件中只需要调用里面的数据生成cvSvm分类器,最后再将分割出来的每一个字符去进行识别,最后将车牌号输出到主界面的编辑框和外部文件中。

4 代码结构

代码结构很简单,选择输入的视频文件之后,就设置定时器消息函数,定时为0.5s/帧。主要的代码都在MFCShowVideoTestDlg.cpp文件的onTimer()方法中,其中需要的一些函数还放在PlateLocateMethod.cpp文件中。

5 主要的算法和思路

在图像处理部分用到的中值滤波算法和Robert边缘检测算法都已经很成熟,这里不作介绍。主要的算法在于字符识别阶段用到SVM算法,生成分类器,生成分类器的工程名:plateTest。

这里面用到一个比较特殊的方式,就是先在外部hb.txt文档中写好训练集每一幅图片的路径,下一行则是类别。

然后在程序中按照文件的基数偶数行分别提取出图片和类别加入训练。使用svm.train()训练,最后通过svm.save(“D://HOG_SVM_DATA.xml” )保存到D盘中。

在主工程中Findchar()函数用于识别字符,首先创建CvSVM类型的一个分类器,然后加载D盘下HOG_SVM_DATA.xml文件中的数据,代码为:svm.load(“D:/HOG_SVM_DATA.xml”)。

然后创建HOGDescriptor对象,并且用这个对象里面的compute()方法进行Hog特征计算,其中创建vector类型的动态数组用于存放结果,然后把结果归总到CvMat类型的一块空间中,再通过svm.predict()检测出最后的结果。

这里需要说明的是,最后结果是一个整型的值。因为字母我也是经过一并放入其中。所以最后的结果需要进行判断其值,如果是值在65以上的就是字符,需要进行强制转换。

6 总结

由于我是一个人参赛,而且时间仓促,给我造成了很大的困难。没有时间去完善代码,和完善其功能,只实现了主体功能。并且因为SVM算法的训练集也没有时间去收集,本应该还有非样本集的,也没有时间去收集,导致了识别率严重偏低。由于识别率太低,没有办法进行去重处理,所以没办法实现流量统计。还有就是

采用SVM算法太耗时,算法的处理不应该放在主线程,代码的结构还没有时间做最后的改进,即使效果不如意,但是

方法和思路应该是正确的,只是时间和人员不够,完善好了效果应该还行。

上传的附件 cloud_download 基于VC++实现的车牌定位与识别系统.7z ( 3.63mb, 64次下载 )
error_outline 下载需要4点积分

keyboard_arrow_left上一篇 : 基于mtcnn与facenet实现人脸登录系统 基于Android实现的锁屏软件APP : 下一篇keyboard_arrow_right



Naiiive
2018-10-06 00:01:58
视频文件转换为有车牌号码框的图片集合,将现有的视频文件按每帧进行分析,识别出存在车牌号码框的帧,并且将视频的该帧转换为图片,在图片中将识别出的车牌框使用明显的色彩框进行标注

发送私信

我在一个迷惘的故事里,看着自己的人生演绎着百态

11
文章数
14
评论数
最近文章
eject