demo:在matlab的figure窗口中手写数字并识别

半年多的坑了,当时遇到的问题都忘差不多了。原始代码copy的matlab实现鼠标画图,但是在我电脑上跑不了,稍作改动。

function MouseDraw(action)
global InitialX InitialY FigHandle
load ***.mat%***.mat是自己训练好的网络
%要在函数里load训练好的数字识别卷积神经网络。如果在函数外load,函数执行时,他的工作区里是没有net的,报错:***net未定义(当然,把绘的图传递出去也行,这里直接在函数里识别了
if nargin == 0, action = 'start';   end%如果鼠标啥都不干,就start,开启图形视窗
switch(action)
    %%开启图形视窗
    case 'start',
        %设定滑鼠按钮被按下时的反应指令为「MouseDraw down」
        FigHandle = figure('WindowButtonDownFcn','MouseDraw down');
        axis([1 50 1 50]);
        axis off%关闭坐标轴,过会截图省的截到
    case 'down',    %如果按键了
        if strcmp(get(FigHandle, 'SelectionType'), 'normal')    %如果是左键,strcmp:比较,如果相等,返回1
            set(FigHandle,'pointer','hand');    %鼠标是手的形状
            CurPiont = get(gca, 'CurrentPoint');    %获取鼠标刚刚的坐标
            InitialX = CurPiont(1,1);
            InitialY = CurPiont(1,2);%鼠标的xy位置
            dlmwrite('IXT.txt', InitialX, '-append', 'delimiter', '\t', 'precision', 6);
            dlmwrite('IYT.txt', InitialY, '-append', 'delimiter', '\t', 'precision', 6);%储存了鼠标的坐标
            % 设定滑鼠移动时的反应指令为「MouseDraw move」,设定滑鼠松开时的反应指令为「MouseDraw up」
            set(gcf, 'WindowButtonMotionFcn', 'MouseDraw move');
            set(gcf, 'WindowButtonUpFcn', 'MouseDraw up');
        elseif strcmp(get(FigHandle, 'SelectionType'), 'alt')   % 如果是右键,停止绘图,识别结果
            set(FigHandle, 'Pointer', 'arrow');%变成箭头
            %识别
            I = getframe(gcf);
            pic = I.cdata;
            pic=imresize(pic,[28, 28]);
            pic=rgb2gray(pic);
            pic=225.*ones(28,28,1,'uint8')-pic;%反相,网络用的黑底白字
            label = classify(net, pic);
            text(5,45,char(label),'Color','black','FontSize',40)%显示识别结果
            drawnow;
            pause(1);停一秒,然后进行下一个
            axes(FigHandle.Children),cla;%删除坐标图像   单独用注释掉
            delete('IXT.txt');%每次识别完要先删除,否则是根据上面的'-append'写入
            delete('IYT.txt');   
        end
        %%滑鼠移动时的反应指令,移动时连贯不断点相拟合(原样照贴)
    case 'move',
        CurPiont = get(gca, 'CurrentPoint');
        X = CurPiont(1,1);
        Y = CurPiont(1,2);
        x_gap = 0.1;
        y_gap = 0.1;
        if X > InitialX
            step_x = x_gap;
        else
            step_x = -x_gap;
        end
        if Y > InitialY
            step_y = y_gap;
        else
            step_y = -y_gap;
        end
        if abs(X-InitialX) < 0.01
            iy = InitialY:step_y:Y;
            ix = X.*ones(1,size(iy,2));
        else
            ix = InitialX:step_x:X ;
            iy = (Y-InitialY)/(X-InitialX).*(ix-InitialX)+InitialY;
        end
        ImageX = [ix, X];
        ImageY = cat(2, iy, Y);
        line(ImageX,ImageY, 'marker', '.', 'markerSize',80, ...
            'LineStyle', '-', 'LineWidth', 4, 'Color', 'Red');%移动画线的具体参数,比如笔画大小
        dlmwrite('IXT.txt', ImageX, '-append', 'delimiter', '\t', 'precision', 6);
        dlmwrite('IYT.txt', ImageY, '-append', 'delimiter', '\t', 'precision', 6);
        InitialX = X;       %记住当前点坐标
        InitialY = Y;       %记住当前点坐标
        %%鼠标抬起时
    case 'up',
        set(FigHandle, 'Pointer', 'arrow');%变成箭头
        % 清除滑鼠移动时的反应指令,不然放开就不停下
        set(gcf, 'WindowButtonMotionFcn', '');
        % 清除滑鼠按钮被释放时的反应指令
        set(gcf, 'WindowButtonUpFcn', '');
end

像这样
在这里插入图片描述
最后,关于训练手写数字的卷积神经网络:mathworks

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值