博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于matlab的蓝色车牌定位与识别---识别
阅读量:5058 次
发布时间:2019-06-12

本文共 3394 字,大约阅读时间需要 11 分钟。

   接着昨天的工作,把最后一部分识别讲完。

     关于字符识别这块,一种最省事的办法是匹配识别,将所得的字符和自己的标准字符库相减,计算所得结果,值最小的即为识别的结果。不过这种方法是在所得字符较为标准的情况,由于众多因素影响,切割出来的字符往往不是标准的,因此识别效果也不好。本次采用的BP神经网络方法,至于像其他的分类器方法,没有尝试,这里就不说了。

     利用神经网络的方法的思路也比较清晰,将已有的字符库输入到神经网络的输入口进行训练,然后用训练好的神经网络对待识别的字符继续识别,输出识别结果。matlab里面已经集成好神经网络,直接调用即可。

     这里说明一下,考虑到减小输入量,这里把输入的字符划分为八行四列,计算每块的总数,然后把这些数作为样本输入到神经网络。

        字符识别部分代码:

for i=1:136    ii=int2str(i);    fname=strcat('D:\1_2学习\图像处理\车牌识别\matlab_car_plate-recognization\char_result\character_test\cha&num\',ii,'.bmp');     image=imread(fname);     change_image=catch2chi2character(image);      P(:,i)=change_image; endT = [eye(34) eye(34) eye(34) eye(34)];alphabet = P;targets = T;[R,Q] = size(alphabet);[S2,Q] = size(targets);S1=20;%20 purelin  tansignet = newff(minmax(alphabet),[S1,S2],{ 'purelin' 'purelin' },'trainscg','learngdm');%trainscg  traingdx net.inputWeights{
1,1}.initFcn ='randnr';net.layerWeights{
2,1}.initFcn ='randnr';net.performFcn = 'sse'; net.trainParam.goal = 0.1; net.trainParam.show = 20; net.trainParam.epochs = 10000; net.trainParam.mc = 0.95; net.trainparam.lr=0.015;%0.01 %设置学习速率P = alphabet;T = targets;[net,tr] = train(net,P,T);%训练好的神经网络

  函数catch2chi2character:

function  lett=catch2chi2character(I1)%% 训练样本前期处理%  bw_7050=imresize(I1,[32 16],'nearest');%将图片统一划为50*25大小[m n]=size(I1);bw_7050=I1;% figure,imshow(I1);histrow=sum(bw_7050');  %计算水平投影histcol=sum(bw_7050);  %计算竖直投影 for i=1:m     if(histrow(i)>0)         row_x=i;         break;     end end for i=1:n     if(histcol(i)>0)         col_x=i;         break;     end end for i=n:-1:1     if(histcol(i)>0)         col_y=i;         break;     end end  for i=m:-1:1     if(histrow(i)>0)         row_y=i;         break;     end  end picture(:,:)=bw_7050(row_x:row_y,col_x:col_y); bw_7050=imresize(picture,[32 16],'nearest');%将图片统一划为50*25大小%  figure,imshow(bw_7050)for cnt=1:8%粗网格特征作为输入矢量    for cnt2=1:4        Atemp=sum(bw_7050((cnt*4-3:cnt*4),(cnt2*4-3:cnt2*4)));  %获取字符的统计特征        lett((cnt-1)*4+cnt2)=sum(Atemp);    endend  ma=max(max(lett));  mi=min(min(lett));  lett=(lett-mi)/(ma);   histrow=sum(bw_7050');  %计算水平投影histcol=sum(bw_7050);  %计算竖直投影 lett=lett';end

  字符识别:

for i=2:7    ii=int2str(i);    fname=strcat('D:\1_2学习\图像处理\车牌识别\matlab_car_plate-recognization\char_result\',ii,'.bmp');     image=imread(fname);      [size_x size_y]=size(image);       max_num=max(max(image));    min_num=min(min(image))-1;    for ix=1:size_x        for ij=1:size_y            if image(ix,ij)>min_num+(max_num-min_num)/10                image(ix,ij)=255;            else                  image(ix,ij)=0;            end        end    end %     I2 = bwmorph(image,'remove'); %提取边缘%      image_main = bwmorph(I2,'skel',Inf); %骨架化%   figure,imshow(image)     change_image=catch2chi2character(image);      Ptest(:,i-1)=change_image; end [a,b]=max(sim(net,Ptest));  disp(b);liccode=char(['A':'H' 'J':'N' 'P':'Z' '0':'9']);  %建立自动识别字符代码表   for i=1:6  str(i)=liccode(b(i)); end

     汉字识别和字符差不多,这里就不贴上去了。。

     总结一下:采用这种方式,基本上字符都可以识别出来。考虑到样本采集、数字处理过程中对字符的影响,像字符O和D,一定情况下无法识别。这也是程序所存在的问题,即没有对相似的字符进行区分。。汉字也存在这种情况,左右结构的也没有考虑。因此想做到完整还有好多工作要做。。

   这个是简单的GUI结果图:

                               

    总结一下:

        1.获取的车牌规格要统一,否则很难把握好车牌定位这块。

        2.切割字符关键在于让程序确定在车牌的位置,这样切割起来就比较方便了。不足的地方在于从定位到切割这块要耗费一点时间,感觉是自己程序太过复杂?不知道有没比较简单的思路没。

        3.字符识别想要做的好,工作还是比较多的。这次神经网络训练过程中参数设置很重要,土办法是去试,不知道有没有科学点的办法。。

        4.算是对这段时间来的一个总结,里面涉及到的内容还是很多的,多看看模式识别方面的知识。

        结束。。2015-5-11

 

转载于:https://www.cnblogs.com/zhanjxcom/p/4493600.html

你可能感兴趣的文章
html 简介
查看>>
python使用上下文对代码片段进行计时,非装饰器
查看>>
js中比较实用的函数用法
查看>>
深入理解CPP与C中bsearch函数的用法
查看>>
安装预览版镜像后无法检测到预览版更新的解决方案
查看>>
【bzoj5099】[POI2018]Pionek 双指针法
查看>>
别让安全问题拖慢了 DevOps!
查看>>
UML各种线的含义
查看>>
C#,二分法,BinarySearch()
查看>>
Cache-and-Collect Lifecycle Management in Ninject 2.0
查看>>
SQL Server查看表的约束
查看>>
枚举、字符串、值之间的转换
查看>>
2017"百度之星"程序设计大赛 - 初赛(B)度度熊的交易计划
查看>>
做个理财网站站长的策略
查看>>
为什么无线信号(RSSI)是负值
查看>>
Peaks BZOJ 3545 / Peaks加强版 BZOJ 3551
查看>>
log4j2发送消息至Kafka
查看>>
Oracle 中 start with 的用法 ---- 递归遍历符合条件的树节点
查看>>
JVM内存区域划分Eden Space,Survivor Space,Tenured Gen,Perm Gen
查看>>
import
查看>>