2

目标:在一个图形中执行多次单击,包含使用 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: 感谢Shai的回答。但我仍然无法完成我的意图。

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

这段代码(有问题!)是我能得到的最接近我想要的代码(在所有点击之后,有一个带有点击点的 x 和 y 坐标的数组)。我显然不了解执行此任务的机制。有什么帮助吗?

4

1 回答 1

3

有几种方法

  1. 使用嵌套函数

    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');

编辑:
将单击的位置“传达”到'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变量(至少不应该有)。第一次单击后,这两个变量将“奇迹般地”创建。每隔一次单击后,这两个数组将增加它们的大小,直到您关闭该图。

于 2013-03-04T13:11:26.983 回答