目标:在一张图中执行多次点击,包含使用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);
在此阶段,变量x
和y
仅在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坐标的数组)。我很清楚不理解执行这项任务的机制。有什么帮助吗?
答案 0 :(得分:3)
有几种方法
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
使用assignin
function ax_bdfcn(varargin)
a = get(gca, 'CurrentPoint');
assignin('caller', 'x', a(1) );
assignin('caller', 'y', a(2) );
使用数字句柄的'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
后,工作区中没有xArray
或yArray
个变量(至少不应该这样)。第一次点击后,这两个变量将“奇迹般地”创建。在每次点击之后,这两个数组将增加它们的大小,直到你关闭数字。