DSP论坛
直播中

jinyi7016

12年用户 6608经验值
擅长:处理器/DSP
私信 关注

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

本帖最后由 jinyi7016 于 2022-1-18 11:04 编辑

` 本帖最后由 jinyi7016 于 2018-1-27 23:10 编辑

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


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

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

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


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


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

无标题.png


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

捕获.PNG


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

无标题.png


那么,这里将摄像头的图像先进行剪裁,取出车牌可能存所的区域。剪裁方法可以参考之前的帖子:https://bbs.elecfans.com/forum.php?mod=viewthread&tid=582493&extra=

无标题.png


按帖子(https://bbs.elecfans.com/jishu_581374_1_1.html)对图像进行颜色过滤,去掉非蓝色部分并滤波,这里使用的是HVS颜色空间,当然也可以使用其他的HSL等等,目的都是一样的,去掉除车牌外的背景。
结果:


无标题.png


按帖子https://bbs.elecfans.com/jishu_576785_1_1.htmlhttps://bbs.elecfans.com/jishu_575455_1_1.html中的算法,再进行处理后,的结果如下图。 这里二值化改为使用了TI的优化库imglib中的两个阀值设置函数,参考帖子:https://bbs.elecfans.com/forum.php?mod=viewthread&tid=582477&extra=库函数调用如下:

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

无标题.png

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

  1.         for(i=0;i<320;i++)
  2.                 H[i]=0;
  3.         for(i=0;i<320;i++)
  4.                 W[i]=0;
  5.         for(i=0;i<320;i++){
  6.                 for(j=0;j<320;j++){
  7.                         if(inImg.imgBuf[i*320+j]==255)
  8.                                 W[i]++;
  9.                 }

  10.         }
  11.         for(i=0;i<320;i++){
  12.                 for(j=0;j<320;j++){
  13.                         if(inImg.imgBuf[i+j*320]==255)
  14.                                 H[i]++;
  15.                 }

  16.         }

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

Y

无标题.png

X

无标题.png


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

无标题.png


可以按到车牌的大小为140440=722
而字符的大小比例为4590=12
将车牌从原图中截取出来。
无标题.png
对截取出的车牌进行处理,进行灰度化处理。
无标题.png
转换成二值化图像,进一步进行识别。
无标题.png

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


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

车牌在X轴上的投影:

无标题.png

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

无标题.png

无标题.png

无标题.png

无标题.png

无标题.png

无标题.png

无标题.png

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

无标题.png


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

无标题.png

识别字符前,要对车牌上的字符进行一定的了解。
国家规定中,车牌上的英文与数字字符有如下几个:
无标题.png
无标题.png

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




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

无标题.png


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

无标题.png


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

无标题.png


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

如下是对数字的识别结果
无标题.png


对字母的识别结果:

无标题.png


对汉字的识别结果

无标题.png


四、结果上传

识别到了车牌上的字符,那么下一步就是通过网络将识别出的车牌上传到电脑中。
这里使用TI提供的SYSBIOS系统,通过NDK网络库进行传输。
开发板作为 TCPClientPC作为Server,端口号为8000.
无标题.png

五、测试说明

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开发板具有强大的性能的同时,又兼顾了接口与功能的丰富。提高了用户的使用体验。开发板功能标注清晰,布局合理,是二次开发的不错选择。
问题与建议:
试用过程中也有几个问题,都在问题帖子了,关于XDS200发烫的问题,创龙可以按我帖子的方法进行验证一下,看是不是个例。
★最后声明一下:本人是图像处理的新手,以此次试用刚开始学习入门的,算法中有什么不对的地方或效率不高缺乏优化的欢迎指正批评。


★由于其他试用者也是有车牌识别的项目,为了防止抄袭,现将权限提高,待试用结束后,恢复。管理员可以进行验证。

结果代码已交由创龙,由创龙维护,不再维护些部分。

图片头文件:
sample.rar (815.44 KB)
(下载次数: 6, 2016-5-1 16:50 上传)

工程源文件:
MyC6655.rar (5.87 MB)
(下载次数: 10, 2016-5-1 16:59 上传)



` 无标题.png

回帖(47)

电子微创意

2016-5-1 19:51:14
楼主进度真的很快啊
举报

jinyi7016

2016-5-1 20:10:51
引用: 电子微创意 发表于 2016-5-1 03:51
楼主进度真的很快啊

差不多两个月了啊。
举报

电子微创意

2016-5-1 21:00:00
引用: jinyi7016 发表于 2016-5-1 20:10
差不多两个月了啊。

但是对于新的平台新的领域来说已经非常快了
举报

大苏打十分

2016-5-2 18:02:38
由于没有权限,看不到你的程序,想问一下你是通过颜色来定位车牌的吗?有用到VLIB_erode_bin_square和VLIB_packMask32吗?
1 举报

大苏打十分

2016-5-2 18:07:25
可以加个qq好友交流一下吗?我刚好也在做这个,思路主要是边缘检测、闭运算和联通区域法把图像分割成几块联通区域,然后根据形状和联通区域大小来定位车牌位置,不过调用VLIB时出了点问题,想请教一下可以吗?
举报

jinyi7016

2016-5-3 09:52:20
引用: 大苏打十分 发表于 2016-5-2 02:07
可以加个qq好友交流一下吗?我刚好也在做这个,思路主要是边缘检测、闭运算和联通区域法把图像分割成几块联通区域,然后根据形状和联通区域大小来定位车牌位置,不过调用VLIB时出了点问题,想请教一下可以吗?

我也是新手啊。可以发个帖子大家一起探讨
举报

doomsday688

2016-5-3 13:45:42
引用: jinyi7016 发表于 2016-5-3 09:52
我也是新手啊。可以发个帖子大家一起探讨

主要是感觉发帖子效率太低了,之前一直没有看到网上有人做相关的东西,昨天碰巧看到你的帖子,感觉好强,我是基于官方那个例程的结构改的,用的c6678,然而发现改起来的难度有点大,大二没那么多时间做这个,能看一下你的项目是怎么搭的吗,看了你的帖子感觉你的结构要灵活很多,不像官方那个,想学习一下。。我邮箱2690880304@qq.com,能发一份看看吗,学自动化的做这个感觉有点心累
举报

doomsday688

2016-5-3 19:12:02
本帖最后由 doomsday688 于 2016-5-4 12:04 编辑
引用: jinyi7016 发表于 2016-5-3 09:52
我也是新手啊。可以发个帖子大家一起探讨

。。。。。。。。。。。。。。。。。。
举报

sunliang

2016-5-4 10:50:25
这个迈巴赫是你拍的么我去  一辈子的梦想啊
举报

michael_llh

2016-5-4 19:52:38
厉害厉害!!点赞!
举报

773865258

2016-5-4 22:34:56
大神                             
举报

武文奇

2016-5-5 10:04:54
markmarkmark
举报

dvd1478

2016-5-5 23:41:57
一直都搞不明白DDR 上是如果运行,想下载程序看看,却不能下载
举报

幻影刀侠

2016-5-6 07:09:54
niubility。。。。楼主大神啊。。。。。过来学习一下。。
举报

jinyi7016

2016-5-6 09:15:18
引用: 幻影刀侠 发表于 2016-5-5 15:09
niubility。。。。楼主大神啊。。。。。过来学习一下。。

不是大神,刚刚入门啊
举报

jinyi7016

2016-5-6 09:15:44
引用: dvd1478 发表于 2016-5-5 07:41
一直都搞不明白DDR 上是如果运行,想下载程序看看,却不能下载

为什么不能下载呢?
是仿真还是烧写的Flash的
举报

coolsky1023

2016-5-6 09:26:07
谢谢楼主分享,学习了
举报

chenwei6991627

2016-5-6 09:31:31
厉害,一直想看看相关的应用
举报

dvd1478

2016-5-6 12:58:09
引用: jinyi7016 发表于 2016-5-6 09:15
为什么不能下载呢?
是仿真还是烧写的Flash的

不能下载!正常的设置是如何的?
举报

更多回帖

×
20
完善资料,
赚取积分