MATLAB:如何使用ButtonDownFcn存储单击的坐标

时间:2013-03-04 13:02:57

标签: matlab save coordinates

目标:在一张图中执行多次点击,包含使用imshow显示的图像并保存“点击”点的坐标,以便在进一步操作中使用。

注意:我了解函数getpts / ginput,但我想在不使用它们的情况下执行此操作。这可以使用ButtonDownFcn吗? (见以下代码)

function testClicks
img = ones(300); % image to display
h   = imshow(img,'Parent',gca);
set(h,'ButtonDownFcn',{@ax_bdfcn});

function ax_bdfcn(varargin)
a = get(gca,'CurrentPoint');
x = a(1,1);
y = a(1,2);

在此阶段,变量xy仅在ax_bdfcn内“生效”。 如何在testClicks功能中使它们可用?这可以使用ButtonDownFcn吗?这是一个好方法吗?

非常感谢。

EDIT1: 的 谢谢你的回答。但我仍然无法实现我的目标。

function [xArray, yArray] = testClicks()
img = ones(300); % image to display
h   = imshow(img,'Parent',gca);
x = [];
y = [];
xArray = [];
yArray = [];
stop = 0;
while stop == 0;
    set(h,'ButtonDownFcn',{@ax_bdfcn});
    xArray = [xArray x];
    yArray = [yArray y];
        if length(xArray)>15
            stop = 1;
        end
end

    function ax_bdfcn(varargin)
        a = get(gca, 'CurrentPoint');
        assignin('caller', 'x',  a(1,1) );
        assignin('caller', 'y',  a(1,2) );
    end
end % must have end for nested functions

这个代码(buggy!)是我能得到的最接近我想要的东西(在所有点击之后,有一个带有点击点的x和y坐标的数组)。我很清楚不理解执行这项任务的机制。有什么帮助吗?

1 个答案:

答案 0 :(得分:3)

有几种方法

  1. 使用nested functions

    function testClicks
       img = ones(300); % image to display
       h   = imshow(img,'Parent',gca);
       set(h,'ButtonDownFcn',{@ax_bdfcn});
       x = []; % define "scope" of x and y 
       y = [];  
    
       % call back as nested function
       function ax_bdfcn(varargin)
           a = get(gca,'CurrentPoint');
           x = a(1,1); % set x and y at caller scope due to "nested"ness of function
           y = a(1,2);
       end  % close nested function
    end % must have end for nested functions
    
  2. 使用assignin

    function ax_bdfcn(varargin)
         a = get(gca, 'CurrentPoint');
         assignin('caller', 'x',  a(1) );
         assignin('caller', 'y',  a(2) ); 
    
  3. 使用数字句柄的'UserData'属性

    function ax_bdfcn(varargin)
         a = get(gca, 'CurrentPoint');
         set( gcf, 'UserData', a(1:2) );
    
    使用'UserData'可以访问

    cp = get( gcf, 'UserData');(只要图中有效)。

  4. 修改
    将点击的位置“传达”到'base'工作区

    的方法示例
    function ax_bdfcn(varargin)
       a = get(gca,'CurrentPoint');
       % the hard part - assign points to base
       if evalin('base', 'exist(''xArray'',''var'')')
          xArray = evalin('base','xArray');
       else 
          xArray = [];
       end
       xArray = [xArray a(1)]; % add the point
       assignin('base','xArray',xArray); % save to base
       % do the same for yArray
    

    调用testClicks后,工作区中没有xArrayyArray个变量(至少不应该这样)。第一次点击后,这两个变量将“奇迹般地”创建。在每次点击之后,这两个数组将增加它们的大小,直到你关闭数字。