• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

半年多的坑了,当时遇到的问题都忘差不多了。原始代码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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
图片水印,delphi编写水印工具发布时间:2022-07-18
下一篇:
delphi编程创建桌面快捷方式发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap