黄家琛 2019-10-29 21:45 采纳率: 60%
浏览 858

matlab拿别人的程序跑时出现Attempt to reference field of non-structure array.

最近在做一个手写数字的程序,拿了别人的程序跑时发现在鼠标左键写完字后会点击右键会出现如下错误:

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

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 想问一下stata17中这段代码哪里有问题呀
    • ¥15 flink cdc无法实时同步mysql数据
    • ¥100 有人会搭建GPT-J-6B框架吗?有偿
    • ¥15 求差集那个函数有问题,有无佬可以解决
    • ¥15 【提问】基于Invest的水源涵养
    • ¥20 微信网友居然可以通过vx号找到我绑的手机号
    • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
    • ¥15 解riccati方程组
    • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
    • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决