如果不考虑做单片机或者硬件方面的题目,那么可以做有关数字图像处理方向的。车牌识别是一个比较老的题目,而且很多关于图像处理的相关教材或者实验书上都会有车牌识别的工程案例。那么如果想要继续做车牌识别的话,可以从改进原有识别率不高的字符识别算法入手,也可以将原有常用的车牌识别系统做一个GUI界面,加上第一次识别时间记录和第二次识别时间记录作为模拟车辆的入库和出库时间,以时间差值可以作为车辆的停车费用的计算依据。经过改良优化后的车牌识别系统就又可以作为全新的毕业设计题目了。

在入手这个题目以前可以先学一学MATLAB中GUI相关的知识,可以以图三作为GUI设计参考,加上车牌识别系统,加上时间处理模块就基本完成了整个设计。因此主要的部分还是车牌识别系统,有能力的同学可以选择一个最佳的车牌识别方案,本系统所采用的识别字符方案使用的是模板对比,是一个比较传统的做法,实现起来简单是他的优点,但是识别的效率比较低,可以满足基本识别要求了。

图一图二所示为车牌字符的模板作为匹配用。

微信:18840806605

图一:车牌汉字字符模板

微信:18840806605

图二:车牌英文及数字字符模板

图三所示为车辆入库的界面,会呈现取得的带车辆车牌的车牌,经过车牌定位切割后获得车牌图像,经车牌字符识别后获得车辆号牌字符,当识别成功后显示此时的入库时间。

微信:18840806605

图三:系统车辆入库界面

那么当系统无法获取的车牌信息时,会提示检测车牌失败的信息,且无法获得入库时间信息。

微信:18840806605

图五:车辆车牌过远识别失败

微信:18840806605

图六:车辆车牌识别成功

字符识别算法允许车牌在一定的倾斜角范围内都能识别成功。

微信:18840806605

图七:车牌在一定倾角范围内识别也可以成功

出库时,首先要求是车辆为库内车辆,若车辆不是库内车辆则无法出库,也不符合车辆出入库系统的基本逻辑。当车辆车牌识别成功且车辆为库内车辆时,则显示出库时间,并计算车辆出库时间与车辆入库时间的时间差以得到车辆在库内的停车费用。

微信:18840806605

图七:可自定义计费规则

那么当车辆没有入库信息时,若要出库则弹出如图八所示对话框。

图八:车辆未在库内提示

车牌定位代码:

function platerect = platelocation(I)
%carparkenter第113行调用
%carparkout第105行调用
%这个函数 定位车牌,
%I 原始图像
%platerect 返回的车牌区域 platerect = [];
grayI=rgb2gray(I); %灰度图像
[height,width] = size(grayI);%新的图像尺寸% SobelI = double(grayI);
hx = [-1 0 1;-2 0 2;-1 0 1];
gradx=filter2(hx,grayI,'same');
%hx为滤波器.grayI为要滤波的数据,这里将hx放在grayI上,一个一个移动进行模板滤波,'sama'表示从左上角开始;
gradx=abs(gradx); %计算图像的sobel水平梯度
%abs()计算的是数值的绝对值和复数的幅值
% figure
% imshow(gradx,[]);
% title('图像的sobel水平梯度');hy = hx';
grady=filter2(hy,grayI,'same');
grady=abs(grady); %计算图像的sobel垂直梯度
% figure
% imshow(grady,[]);
% title('图像的sobel垂直梯度');grad = gradx + 0.3*grady;
grad = uint8(mat2gray(grad)*255);
%函数mat2gray()可以把任意任意类型图像矩阵转换为取值范围为[0,1]的归一化double类数组
%uint8的范围是0-255
% figure
% imshow(grad)
% title('综合边缘检测');level =graythresh(grad);
edgeI = im2bw(grad,level);
%函数graythresh使用最大类间方差法找到图片的一个合适的阈值
%再利用im2bw(将灰度图像转换为二值图像)函数,将找到的阈值输入,就可以把原图变为一个二值图
% figure
% imshow(edgeI)
% title('边缘二值化');% I2=edge(I1,'sobel',0.1,'vertical');%水平方向sobel滤波
se=[1;1;1];
bwfilterIedge=imerode(edgeI,se); %腐蚀,删除杂点砸线
%imerode函数其中edgeI是待处理的图像,se是结构元素对象
se=strel('rectangle',[4,18]);
%创建一个宽4长18的矩形
bwfilterIedge=imclose(edgeI,se); %闭操作,其实就是先膨胀再腐蚀,使车牌区域连接起来
% figure
% imshow(bwfilterIedge)
% title('边缘检测形态学处理') %颜色检测
[h,s,v] = rgb2hsv(I);
%H参数表示色彩信息,即所处的光谱颜色的位置。
%该参数用一角度量来表示,红、绿、蓝分别相隔120度。互补色分别相差180度。
%纯度S为一比例值,范围从0到1,它表示成所选颜色的纯度和该颜色最大的纯度之间的比率。
%S=0时,只有灰度。 V表示色彩的明亮程度,范围从0到1。有一点要注意:它和光强度之间并没有直接的联系
h = h.*180;
blueI = zeros(height,width);%白色检测结果
%生成0矩阵
for i = 1:heightfor j = 1:widthif (h(i,j) >= 100 && h(i,j) <= 124 && s(i,j) >= 0.25 &&  v(i,j) >= 0.3 ) %蓝色blueI(i,j) = 1;endend
end
blueI = logical(blueI);
%logical(x)将把x中的非0的值 变成1,把所有的数值0值变成逻辑0 。
% figure
% imshow(blueI)
% title('蓝色检测')
se=strel('rectangle',[10,15]);
bwfilterIcolor=imclose(blueI,se); %闭操作,其实就是先膨胀再腐蚀,使车牌区域连接起来
% figure
% imshow(bwfilterIcolor)
% title('蓝色检测形态学处理') %边缘 &&颜色结合
bwfilterI = bwfilterIedge & bwfilterIcolor;
% figure
% imshow(bwfilterI)
% title('边缘&&颜色检测结合') [L,num] = bwlabel(bwfilterI,8);%计算连通区域
%  [L,num] = bwlabel(BW,n)这里num返回的就是BW中连通区域的个数,n为4连通或8连通,num为连通区域个数
STATS = regionprops(L,'BoundingBox','Centroid','Orientation');%取得每个连通区域的特性
%regionprops即用来度量图像区域属性的函数
fitstas = [];%适合的检测目标
for i=1:numsta = STATS(i);if (sta.Orientation < -30 || sta.Orientation > 30)%判断角度不能太大%'Orientation':是标量,与区域具有相同标准二阶中心矩的椭圆的长轴与x轴的交角(度)。%本属性只支持二维标注矩阵。continueend
%     disp(sta.MajorAxisLength)
%     disp(sta.MinorAxisLength)if checkplatesize(sta.BoundingBox(4),sta.BoundingBox(3)) == 1%调用checkplatesize函数%BoundingBox:是1行ndims(L)*2列的向量,即包含相应区域的最小矩形。%BoundingBox 形式为 [ul_corner, width],%这里 ul_corner 以 [x y z ...] 的坐标形式给出边界盒子的左上角、%boxwidth 以 [x_width y_width ...] 形式指出边界盒子沿着每个维数方向的长度fitstas = [fitstas;sta] ;end
end% figure
% imshow(I)
% for i=1:length(fitstas)
%     sta = fitstas(i);
%      rectangle('Position',sta.BoundingBox,'EdgeColor','r','LineWidth',2);%检测的矩形框,蓝色
% end
% title('可疑车牌检测')%选择一个最合适的出来
beststa = selectbest(fitstas,bwfilterI);%选出的最佳
%调用selectbest函数
bdetect = 0;
% figure
% imshow(I)
if isempty(beststa)bdetect = 0;
%     title('没检测出车牌')
elsebdetect = 1;
%    rectangle('Position',beststa.BoundingBox,'EdgeColor','r','LineWidth',2);%检测的矩形框,蓝色
%    title('最终车牌检测')
endif bdetect == 1platerect = beststa.BoundingBox;%车牌区域
%       plateI = imcrop(I,beststa.BoundingBox);%截取出来
% %      [pathstr, name, ext] = fileparts(strfullname);
% %      imwrite(plateI,[name,'.bmp'])
%     figure
%     imshow(plateI)
%     title('最终剪切后的车牌')
end

字符切割代码:

function [charimglist,bwplateimg] = charcut(plateI)
%carparkerenter第127行调用
%carparkout第121行调用
%这个函数对车牌,进行分割
%plateI 是传入的车牌图片
%charimglist 存放着分割出的7个字符
%bwplateimg 车牌区域二值化等预处理后的图grayplateI = rgb2gray(plateI);%转为灰度图像
grayplateI= imadjust(grayplateI,stretchlim(grayplateI));
%灰度变换,图像增强对比度
% figure
% imshow(grayplateI)
% title('车牌灰度图像')
th = graythresh(grayplateI);
%graythresh这个函数中,是使用最大类间方差法找到图片的一个合适的阈值
d = im2bw(grayplateI,th);
%利用im2bw(将灰度图像转换为二值图像)函数,将找到的阈值输入,就可以把原图变为一个二值图
minarea = round(size(d,1)*size(d,2)*0.001);
%r=size(A,1)该语句返回的时矩阵A的行数, c=size(A,2) 该语句返回的时矩阵A的列数。
%round函数是一个四舍五入的函数
d=bwareaopen(d,minarea); %删除面积过小的区域
%删除二值图像d中面积小于minarea的对象,默认情况下使用8邻域
%调用qiege.m
d = qiege(d);
% figure
% imshow(d)
% title('车牌二值图像')theta=60:120;
% bw 表示需要变换的图像,theta 表示变换的角度
% 返回值 r 表示的列中包含了对应于 theta中每一个角度的 Radon 变换,(每个角度下每个线历经的白点数)
% 向量 xp 包含相应的沿 x轴的坐标
[r,xp]=radon(d,theta);
[value,index] = max(r(:));%找出白点最多的
[y,x]=ind2sub(size(r),index); %这个对应的偏移和角度
%ind2sub把数组或者矩阵的线性索引转化为相应的下标
x = theta(1)+x-1;d=imrotate(d,90-x); % 旋转图像
% figure
% imshow(d)
% title('旋转后的车牌二值图像') % 去除上下边框
% STEP 1  黑白跳变小于阈值则被视为背景
% 上面 2/5
[m,n] = size(d);
y1=13;  % y1: 跳变阈值
for i=1:round(m/5*2) count=0;jump=0;temp=0; for j=1:n %这一次的点是temp,上一次的点是jump,然后比较是否跳变了。if d(i,j)==1 temp=1; else temp=0; end if temp==jump count=count; else count=count+1; %跳变加1end jump=temp; %保存这一次的值 end if count<y1 %如果跳变很小,那么要去除d(i,:)=0; end
end
% 下面 2/5
for i=3*round(m/5):m count=0;jump=0;temp=0; for j=1:n %这一次的点是temp,上一次的点是jump,然后比较是否跳变了。if d(i,j)==1 temp=1; else temp=0; end if temp==jump count=count; else count=count+1;  %跳变加1end jump=temp; end if count<y1 %如果跳变很小,那么要去除d(i,:)=0; end
end minarea = round(size(d,1)*size(d,2)*0.001);
d=bwareaopen(d,minarea); %删除面积过小的区域
d = qiege(d);bwplateimg = d;
% figure
% imshow(d)
% title('去除上下边界后')%寻找连通区域
[L,num] = bwlabel(d,8);%计算连通区域
%返回一个和d大小相同的L矩阵,包含了标记了d中每个连通区域的类别标签,8连通
STATS = regionprops(L,'BoundingBox');%取得每个连通区域的特性%存放字符矩形
vecRects = [];
for i=1:numsta = STATS(i);height = sta.BoundingBox(4);%BoundingBox中的四个参数[x,y,width,height]width = sta.BoundingBox(3);charAspect= width/height;%宽高比hratio = height/size(d,1);%和车牌的高度比例if (charAspect>0.05 && charAspect<0.85 && hratio>0.5)rect = sta.BoundingBox;vecRects = [vecRects;rect];%存储起来endendxs = vecRects(:,1);%每个矩形的左x
[sortxs,sortindex] = sort(xs);%从小到大排序,也就是从左到右吧
%sortx值,sortindex索引
vecRects = vecRects(sortindex,:);%矩形重新排序
vecnum = size(vecRects,1);%矩形个数,n=1行尺寸,n=2列尺寸specIndex = getspecificindex(vecRects,size(d,2));%寻找城市字符位置
%调用getspecificindex函数
rectSpe = vecRects(specIndex,:);%城市字符位置
chineserect = GetChineseRect(rectSpe);%汉字字符位置
%调用GetChineseRect函数
%重新构建下字符矩形位置
resultvecRects = chineserect;
for i = specIndex:vecnum %从城市字符后面找6个出来r = vecRects(i,:);resultvecRects = [resultvecRects;r];%存到resultvecRects内if size(resultvecRects,1) >= 7 %最多总共7个矩形breakend
end% %遍历显示切割出的每个字符
% figure
% charnum = size(resultvecRects,1);
% for i=1:charnum
%     charimg = imcrop(d,resultvecRects(i,:));
%     subplot(1,charnum,i);
%     imshow(charimg)
%     strtitle = sprintf('%d',i);
%     title(strtitle)
% end
% set(gcf,'name','字符分割结果')charnum = size(resultvecRects,1);
charimglist = {};
for i=1:charnumcharimg = imcrop(d,resultvecRects(i,:));%imcrop是一个函数,在MATLAB中,该函数用于返回图像的一个裁剪区域charimglist = [charimglist,charimg];%字符存到数组内
%    strname = sprintf('%d.bmp',i);
%    imwrite(charimg,strname)
end

字符识别代码:

function [platenum] = charrec(charimglist)
%carparkenter第134行调用
%carparkout第128行调用
% charimglist 7个字符图列表
% platenum 识别的车牌 load ('../train/chinesechar.mat') %汉字识别
load ('../train/char.mat')%字母识别
load ('../train/charnum.mat') %字母数字识别platenum = '';%车牌号码%第一个字
word1 = charimglist{1};
xx = getwordfeature(word1);
%调用getwordfeature()函数
samplenum = size(chinesetraindata,2);%样本的个数
xx = repmat(xx,[1,samplenum]);%平铺开samplenum列
err = chinesetraindata-xx;%相减,以便看误差最小的
tmp = sum(abs(err));
[minvalue,minindex] = min(tmp);%找出误差最小的那个
index = chinesetrainlabels(minindex);%最小的那个对应的类别character = chinesecharnames{index};%找出对应的字符
% platenum(1) = character;%存入platenum中
platenum = sprintf('%s%s',platenum,character);%第二个字
word2 = charimglist{2};
xx = getwordfeature(word2);
samplenum = size(chartraindata,2);%样本的个数
xx = repmat(xx,[1,samplenum]);%平铺开samplenum列
err = chartraindata-xx;%相减,以便看误差最小的
tmp = sum(abs(err));
[minvalue,minindex] = min(tmp);%找出误差最小的那个
index = chartrainlabels(minindex);%最小的那个对应的类别character = charnames{index};%找出对应的字符
% platenum(2) = character;%存入platenum中
platenum = sprintf('%s%s',platenum,character);%34567用字母数字分类器
for i=3:7word = charimglist{i};xx = getwordfeature(word);samplenum = size(charnumtraindata,2);%样本的个数xx = repmat(xx,[1,samplenum]);%平铺开samplenum列err = charnumtraindata-xx;%相减,以便看误差最小的tmp = sum(abs(err));[minvalue,minindex] = min(tmp);%找出误差最小的那个index = charnumtrainlabels(minindex);%最小的那个对应的类别character = charnumnames{index};%找出对应的字符
%     platenum(i) = character;%存入platenum中platenum = sprintf('%s%s',platenum,character);end

基于MATLAB的汽车出入库计时计费系统相关推荐

  1. 基于matlab的汽车出入库计时计费系统的设计

    基于matlab的汽车出入库计时计费系统的设计 压缩包,直接可用 ID:34111641989264158纯粹july

  2. 基于MATLAB的汽车出入库计时计费车牌识别系统

    一.课题介绍 随着汽车数量的增加,城市交通状况日益受到人们的重视,如何进行有效的交通管理更是成为了人们关注的焦点.智能交通系统通过车辆检测装置对过往的车辆实施检测,提取有关交通数据,达到监控.管理和指 ...

  3. 汽车出入库的计时计费系统设计

    摘要 随着汽车的普及程度越来越高,人们对汽车的便捷停车管理提出了新的要求,既要求方便快捷,又要求精准计算停车费.传统的汽车入库计时计费不仅需要耗费大量的人工去计算,还易出现计算错误.因此,设计一款数字 ...

  4. MATLAB智慧车库计时计费系统GUI设计

    基于MATLAB的智慧停车场计时计费项目 一.课题介绍 随着汽车数量的增加,城市交通状况日益受到人们的重视,如何进行有效的交通管理更是成为了人们关注的焦点.智能交通系统通过车辆检测装置对过往的车辆实施 ...

  5. 【图像处理】基于matlab车辆出入库计时系统

    目录 基于matlab车辆出入库计时系统 基于matlab车辆出入库计时系统 MATLAB 中可以通过图像处理技术实现车辆的出入库计时系统,具体步骤如下: 读取视频或摄像头采集到的图像序列.可以使用 ...

  6. 基于MATLAB的多方法车牌识别识别系统【GUI,多方法,对比,语音播报,出入库,剩余车位】...

    一.课题介绍 该课题为基于MATLAB的多方法车牌识别识别系统,带有丰富的人机交互GUI界面.目前毕业设计选题中,传统的中规中矩的车牌识别不易得到高分,甚至过不了. 必须要在此基础上有所创新方得可以避 ...

  7. [点击快照]基于MATLAB的多方法车牌识别识别系统【GUI,多方法,论文,对比,语音播报,出入库,剩余车位】

    一.课题介绍*** 随着汽车数量的增加,城市交通状况日益受到人们的重视,如何进行有效的交通管理更是成为了人们关注的焦点.智能交通系统通过车辆检测装置对过往的车辆实施检测,提取有关交通数据,达到监控.管 ...

  8. 汽车平顺性与仿真分析matlab,基于matlab的汽车平顺性的建模与仿真.docx

    基于matlab的汽车平顺性的建模与仿真.docx (1)基于MATLAB的汽车平顺性的建模与仿真车辆工程专硕1601Z1604050李晨1数学建模过程11建立系统微分方程如下图所示,为车身与车轮二自 ...

  9. 汽车动力性仿真matlab程序,汽车理论课程设计:基于Matlab的汽车动力性的仿真

    汽车理论课程设计:基于Matlab的汽车动力性的仿真 2009 届届 汽车工程系汽车工程系 汽汽 车车 理理 论论 课课 程程 设设 计计 题题 目目 汽车动力性的仿真 学学 院院 机 电 工 程 学 ...

最新文章

  1. JavaScript 事件——“事件类型”中“复合事件”和“变动事件”的注意要点
  2. document.getElementById 学习总结
  3. UVa 11971 - Polygon(几何概型 + 问题转换)
  4. 实现UILabel渐变色效果
  5. 一些关于bootstrap,bagging,Adaboost,random forest, gradient boost的基本理解
  6. wxWidgets:wxWindowCreateEvent类用法
  7. Python/word.so: undefined symbol: _ZNK4Word7reverseEv
  8. strchr与strstr函数
  9. ES读写为何速度那么快(史上最全面总结)
  10. 配置eclipse,创建类/方法时自动生成作者、创建日期、方法功能等注释
  11. 【渝粤教育】国家开放大学2018年春季 0579-21T电路及磁路(2)(一) 参考试题
  12. Thrift IDL使用方式
  13. 新浪微博登陆页面html代码,仿新浪微博登陆邮箱提示效果的js代码
  14. 微信云控源码帮您快速复制营销
  15. c语言算个人所得税的源代码,C语言编写一个计算个人所得税的程序,要求输入收入金额,能够输...
  16. 如何制定一份测试工程师年度计划
  17. 拜访名寺古刹之圆通寺
  18. 谨慎解决:找不到指定的模块(Exception from HRESULT:0X8007007E)
  19. tensorflow 之tf.Session
  20. 程序员应该知道的10大编程格言

热门文章

  1. Kettle实战100篇 第19篇 转换核心对象Microsoft Excel输出组件
  2. 【瑞萨RA系列FSP库开发】初识寄存器
  3. nginx 死活403
  4. 一、UML类图图式样例
  5. 我写的一个以词搜图系统0.0.0版本
  6. 快速清理项目文件夹里的svn目录和文件
  7. pap认证过程_Ppp PAP认证配置实验教程
  8. Java使用位图+redis生成抖音号、淘淘号、B站UID号等分布式ID
  9. linux:计划任务:单一例行性和循环例行性周期任务
  10. 如何在Kubernetes平台上搭建云IDE Theia