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');
            else
                img1=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');
            end
            app.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 choice
                case '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);%中值滤波1
            img12=medfilt2(img12);%中值滤波2
            app.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) == 0
                    j = j + 1;
                end
                k1 = j;%定位列有字
                while s(j) ~= 0 && j <= n-1
                    j = j + 1;
                end
                k2 = j + 1;%定位到列没字
                if k2 - k1 > round(n / 6.5)%分隔太宽了
                    [val, num] = min(sum(img12(:, [k1+5:k2-5])));
                    img12(:, k1+num+5) = 0;
                end
            end
            [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:7
                ii = 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;
                end
                l = 1;
                for k = kMin : kMax
                    fname = strcat("ZFMB\",liccode(k),'.jpg');  % 根据字符库找到图片模板
                    samBw2 = imread(fname); % 读取模板库中的图片
                    samBw2 = im2bw(samBw2, 0.5);% 图像二值化
                    % 将待识别图片与模板图片做差
                    for i1 = 1:40
                        for j1 = 1:20
                            subBw2(i1, j1) = segBw2(i1, j1) - samBw2(i1 ,j1);
                        end
                    end
                    Dmax = 0;
                    for i2 = 1:40
                        for j2 = 1:20
                            if subBw2(i2, j2) ~= 0
                                Dmax = Dmax + 1;
                            end
                        end
                    end
                    error(l) = Dmax;
                    l = l + 1;
                end
                errorMin = min(error);
                findc = find(error == errorMin);
                Code(num*2 - 1) = liccode(findc(1) + kMin - 1);
                Code(num*2) = ' ';
                num = num + 1;
            end
            delete('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、源代码链接 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/695676.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

神经网络 torch.nn---Non-Linear Activations (ReLU)

ReLU — PyTorch 2.3 documentation torch.nn - PyTorch中文文档 (pytorch-cn.readthedocs.io) 非线性变换的目的 非线性变换的目的是为神经网络引入一些非线性特征&#xff0c;使其训练出一些符合各种曲线或各种特征的模型。 换句话来说&#xff0c;如果模型都是直线特征的…

【数据结构】排序(上)

个人主页~ 堆排序看这篇~ 还有这篇~ 排序 一、排序的概念及应用1、概念2、常见的排序算法 二、常见排序的实现1、直接插入排序&#xff08;1&#xff09;基本思想&#xff08;2&#xff09;代码实现&#xff08;3&#xff09;时间复杂度&#xff08;4&#xff09;空间复杂度 2…

eNSP学习——RIP的路由引入

目录 主要命令 原理概述 实验目的 实验内容 实验拓扑 实验编址 实验步骤 1、基本配置 2、搭建公司B的RIP网络 3、优化公司B的 RIP网络 4、连接公司A与公司B的网络 需要eNSP各种配置命令的点击链接自取&#xff1a;华为&#xff45;NSP各种设备配置命令大全PDF版_ensp…

Windows开始ssh服务+密钥登录+默认启用powershell

文章内所有的命令都在power shell内执行&#xff0c;使用右键单击Windows徽标&#xff0c;选择终端管理员即可打开 Windows下OpenSSH的安装 打开Windows power shell&#xff0c;检查SSH服务的安装状态。会返回SSH客户端和服务器的安装状态&#xff0c;一下是两个都安装成功的…

操作系统教材第6版——个人笔记5

3.2 单连续分区存储管理 3.2.1 单连续分区存储管理 单连续分区存储管理 每个进程占用一个物理上完全连续的存储空间(区域) 单用户连续分区存储管理固定分区存储管理可变分区存储管理 单用户连续分区存储管理 主存区域划分为系统区与用户区设置一个栅栏寄存器界分两个区域…

最新下载:Navicat for MySQL 11软件安装视频教程

软件简介&#xff1a; Navicat for MySQL 是一款强大的 MySQL 数据库管理和开发工具&#xff0c;它为专业开发者提供了一套强大的足够尖端的工具&#xff0c;但对于新用户仍然易于学习。Navicat For Mysql中文网站&#xff1a;http://www.formysql.com/ Navicat for MySQL 基于…

基于51单片机俄罗斯方块小游戏

基于51单片机俄罗斯方块游戏 &#xff08;仿真&#xff0b;程序&#xff09; 功能介绍 具体功能&#xff1a; 1.用LCD12864显示游戏界面&#xff1b; 2.用四个按键控制游戏&#xff08;左、右移、下移、翻转&#xff09;&#xff1b; 3.游戏规则和平时玩的俄罗斯方块一样&a…

web前端:作业二

<!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style>/* 1.将ul的子l…

搭建电商项目||购物商城||APP|小程序|电商独立站系统如何接入JD商品

京东商品采集的步骤和应用场景可以归纳如下&#xff1a; 一、采集步骤 注册账号&#xff1a;首先&#xff0c;需要在京东开放平台注册一个开发者账号。创建应用&#xff1a;登录开放平台后&#xff0c;创建一个应用以获取API密钥和应用凭据。获取权限&#xff1a;根据所需的服…

Docker高级篇之轻量化可视化工具Portainer

文章目录 1. 简介2. Portainer安装 1. 简介 Portianer是一款轻量级的应用&#xff0c;它提供了图形化界面&#xff0c;用于方便管理Docker环境&#xff0c;包括单机环境和集成环境。 2. Portainer安装 官网&#xff1a;https://www.portainer.io 这里我们使用docker命令安装&…

【力扣高频题】003.无重复字符的最长子串

前段时间和小米的某面试官聊天。因为我一直在做 算法文章 的更新&#xff0c;就多聊了几句算法方面的知识。 并且在聊天过程中获得了一个“重要情报”&#xff1a;只要他来面试&#xff0c;基本上每次的算法题&#xff0c;都会去考察关于 子串和子序列 的问题。 的确&#xf…

每日一题——Python实现PAT乙级1099 性感素数(举一反三+思想解读+逐步优化)

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 专业点评 时间复杂度分析 空间复杂度分析 综合点评 我要更强 优化点 …

私有化AI搜索引擎FreeAskInternet

什么是 FreeAskInternet FreeAskInternet 是一个完全免费、私有且本地运行的搜索聚合器&#xff0c;并使用 LLM 生成答案&#xff0c;无需 GPU。用户可以提出问题&#xff0c;系统将使用 searxng 进行多引擎搜索&#xff0c;并将搜索结果合并到ChatGPT3.5 LLM 中&#xff0c;并…

⌈ 传知代码 ⌋ 基于曲率的图重新布线

&#x1f49b;前情提要&#x1f49b; 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间&#xff0c;对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…

数据库索引压力测试

本实验测试数据库在有索引和五索引内容上的查询时间随着数据量级增长的变化 测试的表结构 使用一个菜单的数据库表&#xff0c;包括菜品的ID&#xff0c;菜品名和价格 CREATE TABLE Menu (dish_id int(6) unsigned zerofill NOT NULL AUTO_INCREMENT,dish_name varchar(255)…

高通Android开关机动画踩坑简单记录

1、下面报错有可能是selinux的原因 Read-only file system 2、接着push 动画 reboot之后抓取logcat出现 &#xff0c;以下这个报错。看着像是压缩格式有问题。 3、于是重新压缩一下报错没有再出现 &#xff0c;压缩格式默认是标准&#xff0c;这里必须要改成存储格式哈 4、修改…

matlab演示地月碰撞

代码 function EarthMoonCollisionSimulation()% 初始化参数earth_radius 6371; % 地球半径&#xff0c;单位&#xff1a;公里moon_radius 1737; % 月球半径&#xff0c;单位&#xff1a;公里distance 384400; % 地月距离&#xff0c;单位&#xff1a;公里collision_tim…

Signac|成年小鼠大脑 单细胞ATAC分析(2)

引言 在本教程中&#xff0c;我们将探讨由10x Genomics公司提供的成年小鼠大脑细胞的单细胞ATAC-seq数据集。本教程中使用的所有相关文件均可在10x Genomics官方网站上获取。 本教程复现了之前在人类外周血单核细胞&#xff08;PBMC&#xff09;的Signac入门教程中执行的命令。…

【linux】进程控制——进程创建,进程退出,进程等待

个人主页&#xff1a;东洛的克莱斯韦克-CSDN博客 祝福语&#xff1a;愿你拥抱自由的风 相关文章 【Linux】进程地址空间-CSDN博客 【linux】详解linux基本指令-CSDN博客 目录 进程控制概述 创建子进程 fork函数 父子进程执行流 原理刨析 常见用法 出错原因 进程退出 概…

7-43 排列问题

排列问题 分数 10 全屏浏览 切换布局 作者 雷丽兰 单位 宜春学院 全排列问题 输出自然数1至n中n个数字的全排列&#xff08;1≤n≤9&#xff09;&#xff0c;要求所产生的任一数字序列中不允许出现重复的数字。 输入格式: 一个自然数 输出格式: 由1到n中n个数字组成的…