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

2019-07-22 14:36发布

本帖最后由 FCCdsp 于 2016-5-19 22:54 编辑

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


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

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

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





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






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





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






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






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





对图像进行颜 {MOD}过滤,去掉非蓝 {MOD}部分并滤波,这里使用的是HVS颜 {MOD}空间,当然也可以使用其他的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将车牌从原图中截取出来。








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








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








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








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








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























































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









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









友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。