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