最近在做一个手写数字的程序,拿了别人的程序跑时发现在鼠标左键写完字后会点击右键会出现如下错误:
MouseDraw
MouseDraw right button down!
Attempt to reference field of non-structure array.
Error in MouseDraw (line 56)
axes(FigHandle.Children),cla;%删除坐标图像
Error while evaluating figure WindowButtonDownFcn
源代码如下,请各位大神帮忙看看谢谢!
function MouseDraw(action)
%以Handle Graphics来设定滑鼠事件
%鼠标左键按下不放进行写字,右键进行识别
%(MouseDraw Events)的反应指令(Callbacks)
% global不能传矩阵
%global用于定义全局变量,定义之后全局变量可作用于其他函数
global InitialX InitialY FigHandle %定义了三个变量
imSizex = 90; %定义图片的长度
imSizey = 120; %定义图片的宽度
%如果函数没有输入值的话,把action定义为start
if nargin == 0
action = 'start';
end
%进行判断actio是什么
switch(action)
%%开启图形视窗
case 'start',
FigHandle = figure('WindowButtonDownFcn','MouseDraw down');%figure函数用于新建一个窗口,此处获得它的句柄,第一个参数是在figure中点击时的回调函数
set(FigHandle,'position',[200,200,360,410] ); %设定图窗大小来适应识别的图片大小,设置的是中心坐标为200,横竖长度分别为360和410(或是各边离框的距离)
%set(gca,'position',[0.1,0.1,0.5,0.8] ); %定
axis([1 imSizex 1 imSizey]); % 设定图轴范围
grid on; %添加网格线
box on; % 将图轴加上图框
title('手写体输入窗(左键写字 右键识别)');
dlmwrite('C:\Users\Administrator\Desktop\贝叶斯手写汉字识别\程序\IXT1.txt', -10, 'delimiter', '\t', 'precision', 6);
dlmwrite('C:\Users\Administrator\Desktop\贝叶斯手写汉字识别\程序\IYT1.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('C:\Users\Administrator\Desktop\贝叶斯手写汉字识别\程序\IXT1.txt', InitialX, '-append', 'delimiter', '\t', 'precision', 6);
dlmwrite('C:\Users\Administrator\Desktop\贝叶斯手写汉字识别\程序\IYT1.txt', InitialY, '-append', 'delimiter', '\t', 'precision', 6);
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('C:\Users\Administrator\Desktop\贝叶斯手写汉字识别\程序\IXT1.txt');
ImageY = importdata('C:\Users\Administrator\Desktop\贝叶斯手写汉字识别\程序\IYT1.txt');
InputImage = ones(imSizex,imSizey);
roundX = round(ImageX);
roundY = round(ImageY);
for k = 1:size(ImageX,1)
if 0<roundX(k) && roundX(k)<imSizex && 0<roundY(k) && roundY(k)<imSizey
InputImage(roundX(k)-1:roundX(k)+2, roundY(k)-1:roundY(k)+2) = 0;
end
end
InputImage = imrotate(InputImage,90); % 图像旋转90
axes(FigHandle.Children),cla;%删除坐标图像
delete('C:\Users\Administrator\Desktop\贝叶斯手写汉字识别\程序\IXT1.txt');%每次识别完要先删除,否则是根据上面的'-append'写入
delete('C:\Users\Administrator\Desktop\贝叶斯手写汉字识别\程序\IYT1.txt');
bayesBinaryTest(InputImage); %调用手写体识别函数
imwrite(InputImage,'C:\Users\Administrator\Desktop\贝叶斯手写汉字识别\程序\图片.bmp');
end
%%滑鼠移动时的反应指令
case 'move',
CurPiont = get(gca, 'CurrentPoint');
X = CurPiont(1,1);
Y = CurPiont(1,2);
% 当鼠标移动较快时,不会出现离散点。
% 利用y=kx+b直线方程实现。
x_gap = 0.1; % 定义x方向增量
y_gap = 0.1; % 定义y方向增量
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
% 定义x,y的变化范围和步长
if abs(X-InitialX) < 0.01 % 线平行于y轴,即斜率不存在时
iy = InitialY:step_y:Y;
ix = X.*ones(1,size(iy,2));
else
ix = InitialX:step_x:X ; % 定义x的变化范围和步长
% 当斜率存在,即k = (Y-InitialY)/(X-InitialX) ~= 0
iy = (Y-InitialY)/(X-InitialX).*(ix-InitialX)+InitialY;
end
ImageX = [ix, X];
ImageY = cat(2, iy, Y);
line(ImageX,ImageY, 'marker', '.', 'markerSize',18, ...
'LineStyle', '-', 'LineWidth', 2, 'Color', 'Black');
dlmwrite('C:\Users\Administrator\Desktop\贝叶斯手写汉字识别\程序\IXT1.txt', ImageX, '-append', 'delimiter', '\t', 'precision', 6);
dlmwrite('C:\Users\Administrator\Desktop\贝叶斯手写汉字识别\程序\IYT1.txt', ImageY, '-append', 'delimiter', '\t', 'precision', 6);
InitialX = X; %记住当前点坐标
InitialY = Y; %记住当前点坐标
%%滑鼠按钮被释放时的反应指令
case 'up',
% 清除滑鼠移动时的反应指令
set(gcf, 'WindowButtonMotionFcn', '');
% 清除滑鼠按钮被释放时的反应指令
set(gcf, 'WindowButtonUpFcn', '');
end