函数MouseDraw实现手写识别系统GUI界面的建立和鼠标手写的实现。(使用时保存为MouseDraw.m)

function MouseDraw(action)
% MouseDraw 本例展示如何以Handle Graphics来设定滑鼠事件
% (MouseDraw Events)的反应指令(Callbacks)
% 本程序在鼠标移动非常快时,不会造成画“断线”
% global不能传矩阵
global InitialX InitialY FigHandle hb2 hb3 hb4 count hb5 hb6 hb7
count='E:\im.jpg';
imSize = 50; if nargin == 0, action = 'start';
end
switch(action)
%%开启图形视窗
case 'start',
FigHandle = figure('WindowButtonDownFcn','MouseDraw down','DeleteFcn','save bpnet');
axis([1 imSize 1 imSize]); % 设定图轴范围%
set(gca,'Position',[.25 .20 .7 .7]);
axis off;
grid off;
box on; % 将图轴加上图框
title('手写体输入窗');
try evalin('base','load bpnet')
catchevalin('base','bpgdtrain');
end
% % fprintf('start');
%%设定滑鼠按钮被按下时的反应指令为「MouseDraw down」
% set(gcf, 'WindowButtonDownFcn', 'MouseDraw down');
hb1 = uicontrol('Parent', FigHandle, 'Units', 'Normalized', ...'Position', [.3 .01 .13 .07], 'String', '保存', ...'Callback',['exa=rgb2gray(frame2im(getframe(gca)));','imwrite(exa,''E:\im.jpg'')']);
hb2=uicontrol('Parent',FigHandle,'Style','popupmenu','Position',[50 50 50 30],...'String', {'26','24', '22', '20', '18', '16','14','12','10'});
hb3=uicontrol('Parent', FigHandle,'Style','text',...
'Position',[10 90 90 30],'String',[ 'CurrentX() ','CurrentY()']);
hb4=uicontrol('Parent',FigHandle,'Style','popupmenu','Position',[50 20 50 30],...'String',{'Red','Blue','Black','Yellow','Green'});uicontrol('Parent',FigHandle,'Position',[270 6 70 30],'String','训练','Callback',...['exa=rgb2gray(frame2im(getframe(gca)));','sample=reshape(recgnition(exa),25,1);','clc;',...'t=inputdlg(''数字类别'',''样品训练'');','t=str2num(t{1,1})/10;',...'bpnet.trainParam.lr=str2num(get(hb6,''String''));','bpnet.trainParam.goal=str2num(get(hb7,''String''));',...'[bpnet]=train(bpnet,sample,t);','save bpnet']);uicontrol('Parent',FigHandle,'Position',[360 6 70 30],'String','识别','Callback',...['exa=rgb2gray(frame2im(getframe(gca)));','sample=reshape(recgnition(exa),25,1);',...'record=round(sim(bpnet,sample)*10);','clc;','set(hb5,''String'',num2str(record),''fontSize'',48);']);uicontrol('Parent',FigHandle,'Style','text','Position',[10 60 30 20],'String','字号');
uicontrol('Parent',FigHandle,'Style','text','Position',[10 30 30 20],'String','颜色');
hb5=uicontrol('Parent',FigHandle,'Style','text','Position',[10 150 90 90]);
uicontrol('Parent',FigHandle,'Style','text','Position',[5 260 50 20],'String','学习速率');
hb6=uicontrol('Parent',FigHandle,'Style','Edit','Position',[60 260 30 20],'String','0.01');uicontrol('Parent',FigHandle,'Style','text','Position',[5 290 50 20],'String','训练精度');
hb7=uicontrol('Parent',FigHandle,'Style','Edit','Position',[60 290 30 20],'String','0.005');uicontrol('Parent',FigHandle,'Style','pushbutton','Position',[450 6 70 30],'String','清除','Callback','cla');%将函数变量导入到工作空间;
assignin('base','hb5',hb5);
assignin('base','hb6',hb6);
assignin('base','hb7',hb7);
%%%%%%%%%%%%%%%%%%%%%%%%%%%dlmwrite('IXT.txt', -10, 'delimiter', '\t', 'precision', 6);
dlmwrite('IYT.txt', -10, 'delimiter', '\t', 'precision', 6); %%滑鼠按钮被按下时的反应指令
case 'down', if strcmp(get(FigHandle, 'SelectionType'), 'normal') %如果是左键 set(FigHandle,'pointer','hand');  CurPiont = get(gca, 'CurrentPoint'); InitialX = CurPiont(1,1); InitialY = CurPiont(1,2); dlmwrite('IXT.txt', InitialX, '-append', 'delimiter', '\t', 'precision', 6); dlmwrite('IYT.txt', InitialY, '-append', 'delimiter', '\t', 'precision', 6);
% 列印「MouseDraw down!」讯息
% % fprintf('MouseDraw down!\n');
% 设定滑鼠移动时的反应指令为「MouseDraw move」 set(gcf, 'WindowButtonMotionFcn', 'MouseDraw move'); set(gcf, 'WindowButtonUpFcn', 'MouseDraw up'); elseif strcmp(get(FigHandle, 'SelectionType'), 'alt') % 如果是右键 set(FigHandle, 'Pointer', 'arrow'); set( FigHandle, 'WindowButtonMotionFcn', '') set(FigHandle, 'WindowButtonUpFcn', '') fprintf('MouseDraw right button down!\n'); ImageX = importdata('IXT.txt'); ImageY = importdata('IYT.txt'); InputImage = ones(imSize); roundX = round(ImageX); roundY = round(ImageY); for k = 1:size(ImageX,1) if 0<roundX(k) && roundX(k)<imSize && 0<roundY(k) && roundY(k)<imSize InputImage(roundX(k)-1:roundX(k)+2, roundY(k)-1:roundY(k)+2) = 0; endendInputImage = imrotate(InputImage,90); % 图像旋转90 figure(2); imshow(InputImage); end%%滑鼠移动时的反应指令 case 'move', CurPiont = get(gca, 'CurrentPoint'); X = CurPiont(1,1); Y = CurPiont(1,2);set(hb3,'String',['CurrentX(',num2str(X),')','CurrentY(',num2str(Y),')']);% 当鼠标移动较快时,不会出现离散点。 % 利用y=kx+b直线方程实现。 x_gap = 0.1; % 定义x方向增量 y_gap = 0.1; % 定义y方向增量 if X > InitialX step_x = x_gap; elsestep_x = -x_gap;endif Y > InitialY step_y = y_gap; elsestep_y = -y_gap;end% 定义x,y的变化范围和步长 if abs(X-InitialX) < 0.01 % 线平行于y轴,即斜率不存在时 iy = InitialY:step_y:Y; ix = X.*ones(1,size(iy,2)); elseix = InitialX:step_x:X ; % 定义x的变化范围和步长 % 当斜率存在,即k = (Y-InitialY)/(X-InitialX) ~= 0 iy = (Y-InitialY)/(X-InitialX).*(ix-InitialX)+InitialY;  endImageX = [ix, X];  ImageY = cat(2, iy, Y);popup_index1=26-(get(hb2,'Value')-1)*2;popup_index2=get(hb4,'Value');switch(popup_index2)case 1line(ImageX,ImageY, 'marker', '.', 'markerSize',popup_index1, ... 'LineStyle', '-', 'LineWidth', 4, 'Color', 'Red'); case 2line(ImageX,ImageY, 'marker', '.', 'markerSize',popup_index1, ... 'LineStyle', '-', 'LineWidth', 4, 'Color', 'Blue');case 3line(ImageX,ImageY, 'marker', '.', 'markerSize',popup_index1, ... 'LineStyle', '-', 'LineWidth', 4, 'Color', 'Black');case 4line(ImageX,ImageY, 'marker', '.', 'markerSize',popup_index1, ... 'LineStyle', '-', 'LineWidth', 4, 'Color', 'Yellow');case 5line(ImageX,ImageY, 'marker', '.', 'markerSize',popup_index1, ... 'LineStyle', '-', 'LineWidth', 4, 'Color', 'Green');enddlmwrite('IXT.txt', ImageX, '-append', 'delimiter', '\t', 'precision', 6); dlmwrite('IYT.txt', ImageY, '-append', 'delimiter', '\t', 'precision', 6); InitialX = X; %记住当前点坐标 InitialY = Y; %记住当前点坐标 % 列印「MouseDraw is moving!」及滑鼠现在位置 % fprintf('MouseDraw is moving! Current location = (%g, %g)\n', ... % CurPiont(1,1), CurPiont(1,2));% % fprintf('MouseDraw move!\n'); % 设定滑鼠按钮被释放时的反应指令为「MouseDraw up」 set(gcf, 'WindowButtonUpFcn', 'MouseDraw up'); %%滑鼠按钮被释放时的反应指令 case 'up', % 清除滑鼠移动时的反应指令 set(gcf, 'WindowButtonMotionFcn', ''); % 清除滑鼠按钮被释放时的反应指令 set(gcf, 'WindowButtonUpFcn', ''); % 列印「MouseDraw up!」% % fprintf('MouseDraw up!\n');
endend实现手写数字图像特征的提取:(存为recgnition.m)
function sample=recgnition(exa)
[i,j]=find(exa~=204);
imin=min(i);
imax=max(i);
jmin=min(j);
jmax=max(j);
a=exa(imin:imax,jmin:jmax);
M=imax-imin+1;
N=jmax-jmin+1;
for m=1:5for n=1:5exa_c{m,n}=a(1+(m-1)*M/5:m*M/5,1+(n)*N/5:n*N/5);sample(1,(m-1)*5+n)=size(find(exa_c{m,n}~=204),1)/(M*N/25);%subplot(5,5,(m-1)*5+n),subimage(exa_c{m,n});end
end
建立bp神经网络。(可修改所建立bp神经网络参数,也可建立其他类型神经网络)。
x=ones(25,2);
x(:,1)=0;
bpnet=newff(x,[50,1],{'logsig','logsig'},'traingd');
bpnet.trainParam.show=5;%显示训练迭代过程(每隔5次训练,显示一次训练进程)
bpnet.trainParam.lr=0.01;%学习速率
bpnet.trainParam.epochs=2000;%最大训练次数
bpnet.trainParam.goal=0.005;%训练要求精度(0.005)

此段命令应存为bpgdtrain.m文件。

以上函数以及m文件须保存以后才可调用。

神经网络要经过一定数量的训练才能达到较高的识别精度。

使用时先运行MouseDraw函数,出现下图界面,

界面介绍:

保存:可将手写数字图像保存为im.jpg文件。

训练:用于有导师训练神经网络,用户使用鼠标写好数字,点击训练,弹出输入框框,输入相应正确数字。

识别:对界面上的手写数字进行识别,结果显示在左边白色方框。

清除:可清除界面上数字,重新书写。

字号、颜色选择下拉框可选择手写数字字号与颜色。

:控制训练精度和学习速率。具体参照bp神经网络。

基于人工神经网络的MATLAB手写数字识别系统相关推荐

  1. MATLAB实现数字识别系统,基于人工神经网络的MATLAB手写数字识别系统

    <基于人工神经网络的MATLAB手写数字识别系统>由会员分享,可在线阅读,更多相关<基于人工神经网络的MATLAB手写数字识别系统(8页珍藏版)>请在人人文库网上搜索. 1.基 ...

  2. 深蓝学院第三章:基于卷积神经网络(CNN)的手写数字识别实践

    参看之前篇章的用全连接神经网络去做手写识别:https://blog.csdn.net/m0_37957160/article/details/114105389?spm=1001.2014.3001 ...

  3. 【手写数字识别】基于matlab GUI BP神经网络单个或连续手写数字识别系统【含Matlab源码 2296期】

    ⛄一.手写数字识别技术简介 1 案例背景 手写体数字识别是图像识别学科下的一个分支,是图像处理和模式识别研究领域的重要应用之一,并且具有很强的通用性.由于手写体数字的随意性很大,如笔画粗细.字体大小. ...

  4. 使用MATLAB实现基于BP神经网络训练的手写字母识别程序

    前言 大三的时候利用MATLAB搭建了一个基于BP神经网络框架的手写字母识别程序,其中使用了EMNIST数据集进行训练和测试,可实时对手写输入样本进行识别,并返回两个最可能的结果,过程中可继续添加样本 ...

  5. 手写数字识别系统 基于python

    环境基于Python3.6和Tensorflow框架 实现手写数字识别系统 本文使用python基于TensorFlow设计手写数字识别算法,并编程实现GUI界面,构建手写数字识别系统.文中首先对如何 ...

  6. 基于随机梯度下降法的手写数字识别、epoch是什么、python实现

    基于随机梯度下降法的手写数字识别.epoch是什么.python实现 一.普通的随机梯度下降法的手写数字识别 1.1 学习流程 1.2 二层神经网络类 1.3 使用MNIST数据集进行学习 注:关于什 ...

  7. 课程设计(毕业设计)—基于机器学习KNN算法手写数字识别系统—计算机专业课程设计(毕业设计)

    机器学习KNN算法手写数字识别系统 下载本文手写数字识别系统完整的代码和课设报告的链接(或者可以联系博主koukou(壹壹23七2五六98),获取源码和报告):https://download.csd ...

  8. 基于朴素贝叶斯的手写数字识别

    基于朴素贝叶斯的手写数字识别 关于数据集 关于SIMD 关于python 数据预处理 总结 关于数据集 MNIST数据库(http://www.cs.nyu.edu/~roweis/data.html ...

  9. 基于TensorFlow和mnist数据集的手写数字识别系统 ,可识别电话号码,识别准确率高,有对比实验,两组模型,可讲解代码

    基于TensorFlow和mnist数据集的手写数字识别系统 ,可识别电话号码,识别准确率高,有对比实验,两组模型,可讲解代码

最新文章

  1. 面试题:如何理解 Linux 的零拷贝技术?
  2. SQL Server 2005中的分析服务功能[转]
  3. 赞!超炫的页面切换动画效果【附源码下载】
  4. 盘点数学里十大不需语言的证明
  5. 十年WEB技术发展历程
  6. uci大学教育转计算机,UCI加州大学尔湾分校计算机科学硕士M.S. Computer Science
  7. 单片机 c语言 概念题,(C语言版)单片机复习题.doc
  8. class matplotlib.markers.MarkerStyle(marker=None, fillstyle=None)
  9. Pi3 中文环境以及输入法
  10. 利用Python进行数据分析--数据聚合与分组运算
  11. springmvc框架使用拦截器实现301永久重定向,其实用过滤器应该是更好
  12. SQL Server 2008 附加数据库之后显示为 只读 的解决方法
  13. Android:安卓虚拟机(Dalvik ART)学习
  14. 【Linux学习笔记】管理Linux操作系统:软件安装
  15. 我们为什么用GO语言来做区块链?
  16. PS基础-day03套索,魔棒,裁剪,修复画笔工具组,蒙版
  17. 研华PCI板卡开发(1)快速入门(1)
  18. 正则,把字符串/替换成-
  19. 【生科行业报告】生科行业国际巨头们的2020年过得怎么样?(一)
  20. ClickHouse介绍

热门文章

  1. java 二维表格_实现二维表
  2. 弟中弟级,基于Vivado的IP核封装以及仿真调用,FPGA入门小玩
  3. Laradock Mac下的环境配置和安装
  4. python3使用付费代理和ip池的维护
  5. 【STM32】标准库与HAL库对照学习教程八--串口通信详解
  6. 在安霸s2lm上wifi定频测试
  7. 【Codesys】字节数组转长字节,长字节转字节数组,同点位坐标系位置偏移计算
  8. 用python输入圆的半径、输出圆的周长_Python基础题练习(输入圆的半径计算周长面积,判断年份是否是闰年)...
  9. android修改输出分辨率,编译Android8.1修改默认分辨率和屏幕密度
  10. Python 中的“二维”字典 (two-dimension dictionary)