打印

【创龙TMS320C665x开发板试用】应用:车牌识别

[复制链接]
1225|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
FCCdsp|  楼主 | 2016-5-19 22:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 FCCdsp 于 2016-5-19 22:54 编辑

经过这两个月的学习使用,初入图像处理的门径。也对C6655有了很深的了解。C6655的性能真的是很强大的,把之前的有关FFT的电能质量的项目移植了一部分过来,计算速度那真是扛扛的。但是成本真的也是扛扛的啊。小利润产品项目还真是用不起的。但不管怎么说,自己也算了有了高端DSP的开发经验了嘛。
试用过程中也遇到了些许问题,最大的就是XDS200仿真器的问题了,总结起来就是盗版系统很害人。
闲话说罢,开始今天的正题。


基于创龙TMS320C665x开发板的车牌识别
摘要      
基于现在市场上已存在的车牌识别系统的原理,利用创龙TMS320C665x开发板进行车牌识别的理论验证,通过对车辆的完整图片进行处理,确定车牌在图片中的位置并将车牌进行剪裁、提取,通过对比标准字符的特征点,识别车牌上的汉字与字符,并将识别结果通过以太网上传到上位机。

目录
一、广场调研
二、算法实现-定位
三、算法实现-识别
四、结果上传
五、测试说明
六、总结

正文
一、市场调研
首先对现在市场上的车牌识别系统进行了了解,也大体明白了这个系统的工作流程。如下。由于摄像头安装的位置是固定的,所以车牌在图像中所在的位置是有一定的范围的,这要根据实际的环境时行配置,其实并不需要对整个图像进行处理的。





可以看到一些已经成熟的方案中,对于这一部分的使用。从车辆触发感应线圈到进入摄像头的范围,按可能的车速,摄像头的反应时间,可以确定到车牌所在的大概位置。如下这个系统,下面两个摄像头,车牌所在的区域也就是中下部分所以在识别时,就要截取这一部分就可以了,有的软件还可以让用户自己设置有效区域。






从如下要求中可以看出,车牌水平区域的大小要在100像素以上的。






二、算法实现-定位
那么,基于创龙TMS320C665x开发板的车牌识别,主要就包括如下几个部分:1、图像处理的基础理论,这里就选用了bmp文件格式,而对于其他的文件格式也都是触类旁通的。2TI图像处理库的的使用3、其他图像处理算法的实现4、网络通讯的实现 所以整个试用过程也是按这个顺序一步步进行的。整个程序的运行流程为:







由上面的了解,车牌的有效区域是在图像中的某一固定范围内的,所以在处理图像时,是不必将整幅图都进行处理的,只要将有车牌的部分剪裁出来进行处理就足够了。这样也可以加快图像中车牌的识别速度。现假设车牌所在的区域为图像中心的320*320的区域内。






那么,这里将摄像头的图像先进行剪裁,取出车牌可能存所的区域。





对图像进行颜色过滤,去掉非蓝色部分并滤波,这里使用的是HVS颜色空间,当然也可以使用其他的HSL等等,目的都是一样的,去掉除车牌外的背景。
结果:








再进行处理后的结果如下图。 这里二值化改为使用了TI的优化库imglib中的两个阀值设置函数,库函数调用如下:

  • IMG_thr_gt2max_8(Image, out, bmpHeight, bmpWidth, value);//将大于threshold=50的设置为255
  • IMG_thr_le2min_8(out, Image, bmpHeight, bmpWidth, value);//将小于threshold=150的设置为0


复制代码









XY方向上进行投影,确定车牌的位置。

  •         for(i=0;i<320;i++)
  •                 H=0;
  •         for(i=0;i<320;i++)
  •                 W=0;
  •         for(i=0;i<320;i++){
  •                 for(j=0;j<320;j++){
  •                         if(inImg.imgBuf[i*320+j]==255)
  •                                 W++;
  •                 }
  •         }
  •         for(i=0;i<320;i++){
  •                 for(j=0;j<320;j++){
  •                         if(inImg.imgBuf[i+j*320]==255)
  •                                 H++;
  •                 }
  •         }


复制代码

所以在投影上就可以判断出车牌的位置。在XY方向上的投影为:

Y








X









车牌的长宽是有一定的比例的,它的长宽比如下图所示:









可以按到车牌的大小为140440=722
而字符的大小比例为4590=12
将车牌从原图中截取出来。









对截取出的车牌进行处理,进行灰度化处理。









转换成二值化图像,进一步进行识别。









车牌截取出来,可以看到车牌上还有很多干扰,最大的就是铆钉了,那么为是提高识别率,就要去掉铆钉。
铆钉存在于车牌的最上面与最下面,一般与车牌的字符并没有在同一水平线上,中间还是有一定的间距的。通过逐行扫描,判断每一行颜色的跳变次数,可以判断出铆钉的位置,并将铆钉部分的颜色去除。这里将跳次数小于7的行认为是铆钉所在的行,将该行的像素全部清除。
如下是去除铆钉后的车牌图像。在CCS中查看图像,是反的,现在知道为什么在创龙的例程中,在读取了图像后要翻转了,不过这样也不影响后面的操作。









三、算法实现-识别
车牌上每个字符的大小也是有比例的,它们在车牌上的位置也是有比例的,可参考上面的车牌的尺寸图。
对最后的车牌在X轴上进行投影,中间的空隙就是空白的地方,像素点数据不为0的即是字符所在的区域,通过这样,可以分别截取出单独的字符。

车牌在X轴上的投影:









根据在X轴上的投影,分别截取出单个字符为:
























































可以看到字符的上下都有很宽的边界,这是由于去除了铆钉,图像的高度与字符的高度不一样,所以要再次对y轴进行剪裁。这里使用了CCSImage工具了,不再生成bmp文件,所以不必再4字节对齐了。
最后用于字符识别的车牌图像:










再次使用上面的方法进行字符分割得到的结果就没有边界了,而是图像中是刚刚好的完整字符。
在这里就列出一个吧,其他的与前面的基本上都是类似的。
如下这个“京”字,是去除了无意义边界后的结果。










相关帖子

沙发
FCCdsp|  楼主 | 2016-5-19 22:55 | 只看该作者
识别字符前,要对车牌上的字符进行一定的了解。

国家规定中,车牌上的英文与数字字符有如下几个:
























车牌上的汉字有如下几个:

















从上面得知,车牌中是没有字母I与字母O的,因为它们与数字1与数字0相似。那么下一步就是要识别这些字符了。这里使用特征点对比的方法。事先确定每个字符的特征点。通过特征对比的方法来确定字符。根据特征,将字符进行分类。由上面的标准字符与汉字的图像可以得到每一个字符的图像如下图。












从标准的字符图像中选择一些特征点作为判断的依据。再与所识别出的字符的特征点进行一一的比对,特征点与标准字符的图像吻合了,就是识别出的字符了。如字符“A”:

  








在图像上选择9个特征点,也就是取“米”字各个顶点处的坐标为中心,再扩展成“十”字范围的最多5个像素点,这些像素点中有任意一个像素存在0xff的像素,则些特征点为1,否则为0。这种方法是很容易分出“2”与“Z”的,因为“Z”最上面是一条横线,而“2”则是弧线,对于第7与第9特征点,在“2”上都是0,而在“Z”上都是1。类似的还有“8”与“B”,就是对第1、4、7特征点的对比了。但是若是用投影法,则要分辨出,图像要很清晰,有时图像在某些条件下的清晰度不够。这样获得每个字符的标准特征点的集合。如下是这个集合的一部分:












待分割出字符图像后,再提取分割图像的特征点,与标准图像对比。而对于汉字的识别,就要选取更多的特征点了。9个点只能识别出一部分汉字,取点方法也有很多,例如下范围内的再次“米“字取点等等。这里就不再赘述了。还有一种方法就是按笔画来识别,检测图像中字符的笔画的斜率。这里,先使用特征点的方法进行识别。

如下是对数字的识别结果
:  









对字母的识别结果:
















对汉字的识别结果

:  










四、结果上传




识别到了车牌上的字符,那么下一步就是通过网络将识别出的车牌上传到电脑中。

这里使用TI提供的SYSBIOS系统,通过NDK网络库进行传输。

开发板作为 TCP的Client,PC作为Server,端口号为8000.

















五、测试说明




1、
由于没有监控摄像头,车牌的视频图像转换成了一个数据块,存储在头文件中。算法从数据块中读取数据,作为车牌的输入图像。

2、
▲因库文件比较多、比较大,且创龙的库文件都是统一的,所以在测试程序编译前,要在工程中添加创龙的库文件,重新指定库文件的路径,这里使用了图像处理库、SYSBIOS库、platform库、Driver库,要安装NDK的支持包。添加、安装完成后,进行整个工程的重新编译会有几个警告,是定义了几个没有用的变量,可以忽略,最终会生成out文件。当然可以参考之前的帖子进行flash的烧写,这里使用仿真器进行仿真的方式进行的测试,比较方便。

3、
使用工具NetDebugTool新建一个server,并启动。在程序中指定更改此Server的IP地址。


4、
在CCS界面运行程序,可以看到在Console中有算法的进度提示,最后会启动Client,并连接PC上用NetDebugTool建的server,如上一节的图片所示。在数据发送区发送任意数据,将会返回识别的结果。






六、展望与总结

首先这个车牌识别只是对于图像处理的理论验证,距离真正的产品还有一段距离,这也是之后要做的工作。
1、算法优化,缩短识别时间。
2、类型增多。
除了蓝色车牌,还是黄颜色的、警用、港奥、教练、使馆、前后车牌等等。它们的颜色、大小、字符分配都是不同的,这项的工作量很大。
3、上位机设计与完善。



通过对创龙TMS320C6655开发板的试用,初入图像处理的门径。对于图像处理的流程、方法有了一定的了解。训练了自己在算法上的一些思维与思考。更是体会到了C6655的DSP强大的计算与数据处理能力。

创龙TMS320F6655开发板具有强大的性能的同时,又兼顾了接口与功能的丰富。提高了用户的使用体验。开发板功能标注清晰,布局合理,是二次开发的不错选择。

使用特权

评论回复
板凳
vivilzb1985| | 2016-5-20 21:33 | 只看该作者
基于现在市场上已存在的车牌识别系统的原理,利用创龙TMS320C665x开发板进行车牌识别的理论验证,通过对车辆的完整图片进行处理,确定车牌在图片中的位置并将车牌进行剪裁、提取,通过对比标准字符的特征点,识别车牌上的汉字与字符,并将识别结果通过以太网上传到上位机。

使用特权

评论回复
地板
_dzy| | 2016-6-6 17:23 | 只看该作者
好东西啊,谢谢分享

使用特权

评论回复
5
gygp| | 2016-6-6 21:48 | 只看该作者
楼主你的图片都看不清楚了。

使用特权

评论回复
6
gygp| | 2016-6-6 21:52 | 只看该作者
这个算法识别可以移植到其他处理器上吗

使用特权

评论回复
7
Sode| | 2016-6-19 15:02 | 只看该作者
现在这种车牌识别技术还是很实用的,就是看的不是太清楚

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

967

主题

1447

帖子

9

粉丝