项目二.docx
《项目二.docx》由会员分享,可在线阅读,更多相关《项目二.docx(13页珍藏版)》请在冰点文库上搜索。
项目二
题目二:
DSP在数字识别中的应用
-----车牌识别系统
(一)项目简介
(1)项目背景:
车牌识别(VehicleLicensePlateRecognition,VLPR)是现代智能交通系统中的重要组成部分之一,应用十分广泛。
它以数字图像处理、模式识别、计算机视觉等技术为基础,对摄像机所拍摄的车辆图像或者视频序列进行分析,得到每一辆汽车唯一的车牌号码,从而完成识别过程。
随着公路交通事业的迅速发展,人工管理方式已经不能满足实际的需要,微电子、通信和计算机技术在交通领域的应用极大地提高了交通管理效率。
汽车牌照的自动识别技术已经得到了广泛应用。
通过一些后续处理手段可以实现停车场收费管理,交通流量控制指标测量,车辆定位,汽车防盗,高速公路超速自动化监管等等功能。
对于维护交通安全和城市治安,防止交通堵塞,实现交通自动化管理有着现实的意义。
(2)项目设计基础:
DSP编程基础、数字信号处理知识、图像处理知识
(3)项目设计基本流程:
车牌识别基本的流程大致为:
将采集后的图像二值化,边缘提取,然后依次经过车牌定位、字符分割、字符识别等步骤。
(二)具体步骤及原理
(1)打开图像文件,读入车牌图像:
将之前准备好的图像luojie.bmp,在DSPCCS软件平台下,编程把图读取
到DSP的SDRAM中。
其中关键C语句为:
fi=fopen("E:
\\luojie.bmp","rb");
fread((char*)id,sizeof(char),54,fi);
for(i=0;i<16;i++)
{
fread((char*)id,sizeof(char),64,fi);
}
for(i=0;i{
fread((char*)id,sizeof(char),128,fi);
for(j=0;j{
y[i][j]=id[j];
}
}
fclose(fi);
(2)二值化:
对读入的图像进行二值化处理,
原理:
包括目标物体、背景还有噪声,要想从多值的数字图像中直接提取出目标物体,最常用的方法就是设定一个阈值T,用T将图像的数据分成两部分:
大于T的像素群和小于T的像素群。
这是研究灰度变换的最特殊的方法,称为图像的二值化(BINARIZATION)。
图像的二值化,就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的只有黑和白的视觉效果。
本项目二值化的关键C语句为:
i=0;
for(i=0;i{
for(j=0;j{
y[i][j]=255*((y[i][j])/200);
}
}
(3)投影:
利用投影法把二值化结果分别向水平和垂直方向投影,在x轴上显示每列白点像素和,y轴上显示每行白点像素和。
这样可以确定每个字符的上下左右边沿。
关键C语句包括:
//水平投影
for(i=0;i{
for(j=0;j{
if(y[i][j]>=200)
p[i]++;
}
}
//垂直投影
for(i=0;i{
for(j=0;j{
if(y[j][i]==255)
{p[i]++;}
}
}
(4)定位:
对目标位置进行定位,确定每个字符的上下左右边沿,选择合适的阈值定位出数字位置,并输出目标位置。
关键C语句包括:
//分别寻找七位符号的上边坐标存入边沿存入变量up,down中
m=IMAGE_HEIGTH/2;
temp=p[m];
for(i=m+1;i{
if(temp>p[i])
{
temp=p[i];
down=i;
}
if(temp==0)
{down=i;
break;
}
}
temp=p[m];
for(i=m-1;i>=0;i--)
{
if(temp>p[i])
{
temp=p[i];
up=i;
}
if(temp==0)
{
up=i;
break;
}
}
//分别寻找七位符号的左边坐标存入数组p1[]中,右边坐标存入p2[]中;
for(i=0;i{
if(p[i]>0)
{
if(flag==0)
{
p1[num]=i-1;
flag=1;
}
}
else
{
if(flag==1)
{
p2[num]=i;
flag=0;
num++;
}
}
if((flag==1)&&(i==IMAGE_WIDTH-1))
{
p1[num]=0;
p2[num]=0;
num++;
break;
}
}
//根据已得的每个字符的上下边沿坐标,左右边沿坐标画方框,标出文字;
for(i=0;i<7;i++)
{
for(k=up;k{
y[k][p1[i]]=255;
y[k][p2[i]]=255;
}
}
for(i=0;i<7;i++)
{
for(j=p1[i];j{
y[up][j]=255;
y[down][j]=255;
}
}
}
(三)项目结果
车牌图形如图
(1):
图
(1)车牌
利用DSP编译、调试、参数设置等过程如图
(2)、(3);
图
(2)编译、调试过程
图(3)参数设置
最后结果如图(4)、图(5):
图(4)最后结果
图(5)车牌图像的到识别
(四)结论
此次课程设计所用程序对图像规格要求较高,具有一定的局限性,应用范围也有限,有待提高,在此基础之上,以后我们还能够对程序进行修改,扩大适用范围。
这次课程设计是对之前所学相关知识的一次系统性的总结与应用,通过本次课程设计,我复习了数字信号处理的基本概念、基本理论和基本方法;掌握图像处理的常用算法、数字信号处理在数字识别中的应用及数字识别使用的基本算法;熟练了DSP的使用,掌握DSP的程序设计方法;学会用DSP对数字图像进行分析和处理。
大大提高了我的动手能力。
虽然这个设计做的并非对所以车牌都合适,但是在设计过程中所学到的学习方法是我最大收获和财富,相信定会使我受益终身。
(五)参考文献
[1]冈萨雷斯.数字图像处理(第二版).电子工业出版社,2007.8
[2]叶晨洲等,车辆牌照字符识别系统,计算机系统应用,1999(5),P10~13
[3]胡小锋、赵辉.VC++/MATLAB图像处理与识别使用案例精选.人民邮电出版社,2004.9
附:
完整程序:
#include"math.h"
#include"stdio.h"
#defineIMAGE_WIDTH128
#defineIMAGE_HEIGTH32
voidmain()
{FILE*fi;
inti,j,k;
inty[IMAGE_HEIGTH][IMAGE_WIDTH];
intp[128]={0},p1[128]={0},p2[128]={0},m,temp,up,down,num=0,
flag=0;
unsignedcharid[128];
//读入图像
fi=fopen("E:
\\lu.bmp","rb");
fread((char*)id,sizeof(char),54,fi);
for(i=0;i<16;i++)
{
fread((char*)id,sizeof(char),64,fi);
}
for(i=0;i{
fread((char*)id,sizeof(char),128,fi);
for(j=0;j{
y[i][j]=id[j];
}
}
fclose(fi);
//二值化
i=0;
for(i=0;i{
for(j=0;j{
y[i][j]=255*((y[i][j])/200);
}
}
//水平投影每行白点数相加
for(i=0;i{
for(j=0;j{
if(y[i][j]>=200)
p[i]++;
}
}
//从中间向上下边沿遍历,寻找上下边沿存入变量up,down中
m=IMAGE_HEIGTH/2;
temp=p[m];
for(i=m+1;i{
if(temp>p[i])
{
temp=p[i];
down=i;
}
if(temp==0)
{down=i;
break;
}
}
temp=p[m];
for(i=m-1;i>=0;i--)
{
if(temp>p[i])
{
temp=p[i];
up=i;
}
if(temp==0)
{
up=i;
break;
}
}
//垂直投影,每列白点数之和存入数组p[]中
for(i=0;i{
for(j=0;j{
if(y[j][i]==255)
{p[i]++;}
}
}
//车牌是七位符号组成的,分别寻找七位符号的左边坐标存入数组p1[]中,右边坐标存入p2[]中;
for(i=0;i{
if(p[i]>0)
{
if(flag==0)
{
p1[num]=i-1;
flag=1;
}
}
else
{
if(flag==1)
{
p2[num]=i;
flag=0;
num++;
}
}
if((flag==1)&&(i==IMAGE_WIDTH-1))
{
p1[num]=0;
p2[num]=0;
num++;
break;
}
}
//根据已得的每个字符的上下边沿坐标,左右边沿坐标画方框;
for(i=0;i<7;i++)
{
for(k=up;k{
y[k][p1[i]]=255;
y[k][p2[i]]=255;
}
}
for(i=0;i<7;i++)
{
for(j=p1[i];j{
y[up][j]=255;
y[down][j]=255;
}
}
}