32、matlab:基于模板匹配的车牌识别

2024-06-10 12:20

本文主要是介绍32、matlab:基于模板匹配的车牌识别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、准备工作

1)准备材料

车牌字符模板和测试的实验车牌

2)车牌字符模板

数字、字母和省份缩写

3)测试车牌

四张测试车牌 

2、车牌识别实现(已将其嵌入matlab)

1)打开APP

找到APP

找到我的APP双击点开 

 

2)界面介绍

包括:按钮、视图界面和文本框等功能组件

按钮

包含打开图片、清楚图片、退出APP、关于APP、图片预处理、车牌定位、车牌定位处理、文字分割和识别结果

视图界面

初始车牌、预处理车牌、车牌定位和识别结果等

 

3、导入车牌、清除车牌、退出和关于APP按钮功能效果

导入车牌

代码实现

            [filename,pathname]=uigetfile({'*.*';'*.png';'*.jpg';'*.bmp'});%获取图片路径if isequal(filename,0)||isequal(pathname,0)%打开失败提示errordlg('图片为空','错误');app.Lamp_1.Color=('1.00,0.00,0.00');elseimg1=strcat(pathname,filename);%打开并显示图片img1=imread(img1);app.P1=img1;imshow(img1,'Parent',app.UIAxes_1);app.Lamp_1.Color=('0.00,1.00,0.00');app.Lamp_2.Color=('0.00,1.00,0.00');app.Lamp_3.Color=('0.00,1.00,0.00');app.Lamp_4.Color=('0.00,1.00,0.00');app.Lamp_5.Color=('0.00,1.00,0.00');app.Lamp_6.Color=('0.00,1.00,0.00');endapp.EditField_2.Value=('等待预处理');app.EditField_3.Value=('等待定位');

工程效果 

清除车牌

代码实现

im=imread("纯白.png");%清除显示区imshow(im,'Parent',app.UIAxes_1);imshow(im,'Parent',app.UIAxes_2);imshow(im,'Parent',app.UIAxes_3);imshow(im,'Parent',app.UIAxes_4);imshow(im,'Parent',app.UIAxes_5);imshow(im,'Parent',app.UIAxes_6);imshow(im,'Parent',app.UIAxes_7);imshow(im,'Parent',app.UIAxes_8);imshow(im,'Parent',app.UIAxes_9);imshow(im,'Parent',app.UIAxes_10);imshow(im,'Parent',app.UIAxes_11);app.Lamp_1.Color=('1.00,0.00,0.00');app.Lamp_2.Color=('0.00,1.00,0.00');app.Lamp_3.Color=('0.00,1.00,0.00');app.Lamp_4.Color=('0.00,1.00,0.00');app.Lamp_5.Color=('0.00,1.00,0.00');app.Lamp_6.Color=('0.00,1.00,0.00');app.EditField_2.Value='waiting';app.EditField_3.Value='waiting';app.EditField_1.Value='waiting';

工程效果 

 

退出按钮

代码实现

     choice=questdlg('确定关闭吗?','关闭','YES','NO','NO');%是否关闭程序switch choicecase 'YES'delete('1.jpg','2.jpg','3.jpg','4.jpg','5.jpg','6.jpg','7.jpg');delete(app.UIFigure);return;case 'NO'return;end

工程效果 

 

关于APP

代码实现

 msgbox("这是一个车牌自动识别App","对话框",'help');%软件介绍对话框

工程效果 

 

 4、车牌识别过程

图片预处理

代码实现

img2=rgb2gray(app.P1);%灰度处理app.P2=img2;imshow(img2,'Parent',app.UIAxes_2);img3= edge(app.P2, 'roberts', 0.15,'both');%边缘处理app.P3=img3;imshow(img3,'Parent',app.UIAxes_2);app.EditField_2.Value=('完成预处理');app.Lamp_2.Color=('1.00,0.00,0.00');

工程效果 

车牌定位

代码实现

            se=[1,1,1]';%腐蚀处理img4 = imerode(app.P3,se);app.P4=img4;imshow(img4,'Parent',app.UIAxes_3);se1=strel('rectangle',[30,30]);%图像平滑img5=imclose(app.P4, se1);app.P5=img5;imshow(img5,'Parent',app.UIAxes_3);img6= bwareaopen(app.P5, 2200);%移除对象app.P6=img6;imshow(img6,'Parent',app.UIAxes_3);app.EditField_3.Value='完成车牌定位';[img_Y1, img_Y2, img_X1, img_X2]=cj(app.P6);img8 =app.P1(img_Y1:img_Y2,img_X1:img_X2,:);%原图裁剪app.P7=img8;imshow(img8,'Parent',app.UIAxes_3);app.EditField_3.Value='完成裁剪处理';app.Lamp_3.Color=('1.00,0.00,0.00');

 工程效果

定位图处理

代码实现

img9=rgb2gray(app.P7);%灰度app.P8=img9;imshow(img9,'Parent',app.UIAxes_4);img10=histeq(app.P8);%直方图均衡化app.P9=img10;imshow(img10,'Parent',app.UIAxes_4);img11=im2bw(app.P9,0.76);%二值化app.P10=img11;imshow(img11,'Parent',app.UIAxes_4);img12=medfilt2(app.P10);%中值滤波1img12=medfilt2(img12);%中值滤波2app.P11=img12;imshow(img12,'Parent',app.UIAxes_4);img12=fgt(img12);%裁剪app.P12=img12;imshow(img12,'Parent',app.UIAxes_4);app.Lamp_4.Color=('1.00,0.00,0.00');

工程效果 

 

文字分割

代码实现

img12=app.P12;[m,n] = size(img12);s = sum(img12);j = 1;k1 = 1;k2 = 1;while j ~= n%列定位while s(j) == 0j = j + 1;endk1 = j;%定位列有字while s(j) ~= 0 && j <= n-1j = j + 1;endk2 = j + 1;%定位到列没字if k2 - k1 > round(n / 6.5)%分隔太宽了[val, num] = min(sum(img12(:, [k1+5:k2-5])));img12(:, k1+num+5) = 0;endend[word1,img12]=fgzf(img12);%获取字符[word2,img12]=fgzf(img12);[word3,img12]=fgzf(img12);[word4,img12]=fgzf(img12);[word5,img12]=fgzf(img12);[word6,img12]=fgzf(img12);[word7,img12]=fgzf(img12);word1=imresize(word1,[40 20]);%定大小word2=imresize(word2,[40 20]);word3=imresize(word3,[40 20]);word4=imresize(word4,[40 20]);word5=imresize(word5,[40 20]);word6=imresize(word6,[40 20]);word7=imresize(word7,[40 20]);imshow(word1,'Parent',app.UIAxes_5);imshow(word2,'Parent',app.UIAxes_6);imshow(word3,'Parent',app.UIAxes_7);imshow(word4,'Parent',app.UIAxes_8);imshow(word5,'Parent',app.UIAxes_9);imshow(word6,'Parent',app.UIAxes_10);imshow(word7,'Parent',app.UIAxes_11);imwrite(word1,'1.jpg');%存储下来imwrite(word2,'2.jpg');imwrite(word3,'3.jpg');imwrite(word4,'4.jpg');imwrite(word5,'5.jpg');imwrite(word6,'6.jpg');imwrite(word7,'7.jpg');app.Lamp_5.Color=('1.00,0.00,0.00');

工程效果

 

识别结果

代码实现

liccode=char(['0':'9' 'A':'Z' '京辽鲁陕苏豫浙贵闽粤沪川藏鄂赣甘桂黑冀津吉蒙宁青琼晋皖湘新渝']);subBw2 = zeros(40, 20);num = 1;   % 车牌位数for i = 1:7ii = int2str(i);    % 将整型数据转换为字符串型数据word = imread([ii,'.jpg']); % 读取之前分割出的字符的图片segBw2 = imresize(word, [40,20], 'nearest');    % 调整图片的大小segBw2 = im2bw(segBw2, 0.5);    % 图像二值化if i == 1   % 字符第一位为汉字,定位汉字所在字段kMin = 37;kMax = 44;elseif i == 2   % 第二位为英文字母,定位字母所在字段kMin = 11;kMax = 36;elseif i >= 3   % 第三位开始就是数字了,定位数字所在字段kMin = 1;kMax = 36;endl = 1;for k = kMin : kMaxfname = strcat("ZFMB\",liccode(k),'.jpg');  % 根据字符库找到图片模板samBw2 = imread(fname); % 读取模板库中的图片samBw2 = im2bw(samBw2, 0.5);% 图像二值化% 将待识别图片与模板图片做差for i1 = 1:40for j1 = 1:20subBw2(i1, j1) = segBw2(i1, j1) - samBw2(i1 ,j1);endendDmax = 0;for i2 = 1:40for j2 = 1:20if subBw2(i2, j2) ~= 0Dmax = Dmax + 1;endendenderror(l) = Dmax;l = l + 1;enderrorMin = min(error);findc = find(error == errorMin);Code(num*2 - 1) = liccode(findc(1) + kMin - 1);Code(num*2) = ' ';num = num + 1;enddelete('1.jpg','2.jpg','3.jpg','4.jpg','5.jpg','6.jpg','7.jpg');app.EditField_1.Value=(Code);app.Lamp_6.Color=('1.00,0.00,0.00');

工程效果

 

5、车牌识别设计

前界面设计

程序界面 

6、源代码链接 

这篇关于32、matlab:基于模板匹配的车牌识别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1048153

相关文章

poj3468(线段树成段更新模板题)

题意:包括两个操作:1、将[a.b]上的数字加上v;2、查询区间[a,b]上的和 下面的介绍是下解题思路: 首先介绍  lazy-tag思想:用一个变量记录每一个线段树节点的变化值,当这部分线段的一致性被破坏我们就将这个变化值传递给子区间,大大增加了线段树的效率。 比如现在需要对[a,b]区间值进行加c操作,那么就从根节点[1,n]开始调用update函数进行操作,如果刚好执行到一个子节点,

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

uva 1342 欧拉定理(计算几何模板)

题意: 给几个点,把这几个点用直线连起来,求这些直线把平面分成了几个。 解析: 欧拉定理: 顶点数 + 面数 - 边数= 2。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#inc

uva 11178 计算集合模板题

题意: 求三角形行三个角三等分点射线交出的内三角形坐标。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <

poj 2104 and hdu 2665 划分树模板入门题

题意: 给一个数组n(1e5)个数,给一个范围(fr, to, k),求这个范围中第k大的数。 解析: 划分树入门。 bing神的模板。 坑爹的地方是把-l 看成了-1........ 一直re。 代码: poj 2104: #include <iostream>#include <cstdio>#include <cstdlib>#include <al

hdu 3065 AC自动机 匹配串编号以及出现次数

题意: 仍旧是天朝语题。 Input 第一行,一个整数N(1<=N<=1000),表示病毒特征码的个数。 接下来N行,每行表示一个病毒特征码,特征码字符串长度在1—50之间,并且只包含“英文大写字符”。任意两个病毒特征码,不会完全相同。 在这之后一行,表示“万恶之源”网站源码,源码字符串长度在2000000之内。字符串中字符都是ASCII码可见字符(不包括回车)。

最大流、 最小费用最大流终极版模板

最大流  const int inf = 1000000000 ;const int maxn = 20000 , maxm = 500000 ;struct Edge{int v , f ,next ;Edge(){}Edge(int _v , int _f , int _next):v(_v) ,f(_f),next(_next){}};int sourse , mee