本帖最后由 jinyi7016 于 2022-1-18 11:04 编辑
` 本帖最后由 jinyi7016 于 2018-1-27 23:10 编辑
写在前面: 经过这两个月的学习使用,初入图像处理的门径。也对C6655有了很深的了解。C6655的性能真的是很强大的,把之前的有关FFT的电能质量的项目移植了一部分过来,计算速度那真是扛扛的。但是成本真的也是扛扛的啊。小利润产品项目还真是用不起的。但不管怎么说,自己也算了有了高端DSP的开发经验了嘛。 试用过程中也遇到了些许问题,最大的就是XDS200 仿真器的问题了,总结起来就是盗版系统很害人。 闲话说罢,开始今天的正题。
摘要
基于现在市场上已存在的车牌识别系统的原理,利用创龙TMS320C665x开发板进行车牌识别的理论验证,通过对车辆的完整图片进行处理,确定车牌在图片中的位置并将车牌进行剪裁、提取,通过对比标准字符的特征点,识别车牌上的汉字与字符,并将识别结果通过以太网上传到上位机。
目录
一、广场调研
二、算法实现-定位
三、算法实现-识别
四、结果上传
五、测试说明
六、总结
正文
一、市场调研
首先对现在市场上的车牌识别系统进行了了解,也大体明白了这个系统的工作流程。如下。由于摄像头安装的位置是固定的,所以车牌在图像中所在的位置是有一定的范围的,这要根据实际的环境时行配置,其实并不需要对整个图像进行处理的。
可以看到一些已经成熟的方案中,对于这一部分的使用。从车辆触发感应线圈到进入摄像头的范围,按可能的车速,摄像头的反应时间,可以确定到车牌所在的大概位置。如下这个系统,下面两个摄像头,车牌所在的区域也就是中下部分所以在识别时,就要截取这一部分就可以了,有的软件还可以让用户自己设置有效区域。
从如下要求中可以看出,车牌水平区域的大小要在100像素以上的。
二、算法实现-定位
那么,基于创龙TMS320C665x 开发板的车牌识别,主要就包括如下几个部分:1 、图像处理的基础理论,这里就选用了bmp 文件格式,而对于其他的文件格式也都是触类旁通的。2 、ti图像处理库的的使用3 、其他图像处理算法的实现4 、网络通讯的实现 所以整个试用过程也是按这个顺序一步步进行的。整个程序的运行流程为:
由上面的了解,车牌的有效区域是在图像中的某一固定范围内的,所以在处理图像时,是不必将整幅图都进行处理的,只要将有车牌的部分剪裁出来进行处理就足够了。这样也可以加快图像中车牌的识别速度。现假设车牌所在的区域为图像中心的320*320的区域内。
那么,这里将摄像头的图像先进行剪裁,取出车牌可能存所的区域。剪裁方法可以参考之前的帖子:https://bbs.elecfans.com/forum.php?mod=viewthread&tid=582493&extra=
按帖子(https://bbs.elecfans.com/jishu_581374_1_1.html)对图像进行颜色过滤,去掉非蓝色部分并滤波,这里使用的是HVS 颜色空间,当然也可以使用其他的HSL 等等,目的都是一样的,去掉除车牌外的背景。
结果:
- IMG_thr_gt2max_8(Image, out, bmpHeight, bmpWidth, value);//将大于threshold=50的设置为255
- IMG_thr_le2min_8(out, Image, bmpHeight, bmpWidth, value);//将小于threshold=150的设置为0
复制代码
在X与Y方向上进行投影,确定车牌的位置。
- for(i=0;i<320;i++)
- H[i]=0;
- for(i=0;i<320;i++)
- W[i]=0;
- for(i=0;i<320;i++){
- for(j=0;j<320;j++){
- if(inImg.imgBuf[i*320+j]==255)
- W[i]++;
- }
- }
- for(i=0;i<320;i++){
- for(j=0;j<320;j++){
- if(inImg.imgBuf[i+j*320]==255)
- H[i]++;
- }
- }
复制代码
所以在投影上就可以判断出车牌的位置。在X与Y方向上的投影为:
Y:
X:
车牌的长宽是有一定的比例的,它的长宽比如下图所示:
可以按到车牌的大小为140:440=7:22 而字符的大小比例为45:90=1:2 将车牌从原图中截取出来。
对截取出的车牌进行处理,进行灰度化处理。
转换成二值化图像,进一步进行识别。
车牌截取出来,可以看到车牌上还有很多干扰,最大的就是铆钉了,那么为是提高识别率,就要去掉铆钉。 铆钉存在于车牌的最上面与最下面,一般与车牌的字符并没有在同一水平线上,中间还是有一定的间距的。通过逐行扫描,判断每一行颜色的跳变次数,可以判断出铆钉的位置,并将铆钉部分的颜色去除。这里将跳次数小于7的行认为是铆钉所在的行,将该行的像素全部清除。 如下是去除铆钉后的车牌图像。在CCS中查看图像,是反的,现在知道为什么在创龙的例程中,在读取了图像后要翻转了,不过这样也不影响后面的操作。
三、算法实现-识别 车牌上每个字符的大小也是有比例的,它们在车牌上的位置也是有比例的,可参考上面的车牌的尺寸图。 对最后的车牌在X轴上进行投影,中间的空隙就是空白的地方,像素点数据不为0的即是字符所在的区域,通过这样,可以分别截取出单独的字符。
车牌在X轴上的投影:
根据在X轴上的投影,分别截取出单个字符为:
可以看到字符的上下都有很宽的边界,这是由于去除了铆钉,图像的高度与字符的高度不一样,所以要再次对y轴进行剪裁。这里使用了CCS的Image工具了,不再生成bmp文件,所以不必再4字节对齐了。 最后用于字符识别的车牌图像:
再次使用上面的方法进行字符分割得到的结果就没有边界了,而是图像中是刚刚好的完整字符。 在这里就列出一个吧,其他的与前面的基本上都是类似的。 如下这个“京”字,是去除了无意义边界后的结果。
识别字符前,要对车牌上的字符进行一定的了解。 国家规定中,车牌上的英文与数字字符有如下几个:
车牌上的汉字有如下几个:
从上面得知,车牌中是没有字母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开发板具有强大的性能的同时,又兼顾了接口与功能的丰富。提高了用户的使用体验。开发板功能标注清晰,布局合理,是二次开发的不错选择。
问题与建议:
试用过程中也有几个问题,都在问题帖子了,关于 XDS200发烫的问题,创龙可以按我帖子的方法进行验证一下,看是不是个例。 ★最后声明一下:本人是图像处理的新手,以此次试用刚开始学习入门的,算法中有什么不对的地方或效率不高缺乏优化的欢迎指正批评。
★由于其他试用者也是有车牌识别的项目,为了防止抄袭,现将权限提高,待试用结束后,恢复。管理员可以进行验证。
结果 ,代码 已交由创龙,由创龙维护,不再维护些部分。
图片头文件:
工程源文件:
`
|