function main()
clear all;clc;
path='.\image_files\'; %___________image files path
path_posmap='.\pos_maps\';%_________stores positions of agents
NumOfImages = length(dir(path)) - 2;
w = dir(path);
img_names={}; %________stores names of all images
for i=3:NumOfImages+2,
img_names{i-2} = w(i).name;
end
for i=1:numel(img_names),
imname = [ path img_names{i}];
im0 = imread(imname);
imageHandle =imshow(im0);%_____________displays the image
xlabel(num2str(i));
set(imageHandle,'ButtonDownFcn',@ImageClickCallback);
end
end
function coordinates=ImageClickCallback ( objectHandle , eventData )
axesHandle = get(objectHandle,'Parent');
coordinates = get(axesHandle,'CurrentPoint');
coordinates = coordinates(1,1:2);
message = sprintf('x: %.1f , y: %.1f',coordinates (1) ,coordinates (2));
disp(coordinates); %___ add these coordinates for each image
close(gcf);
end
我想向用户显示一系列图像。对于用户以鼠标单击图像的形式输入的每个图像请求。将每次点击的坐标存储在矩阵中。因此,最终具有维度为num_images x 2
的矩阵。
但在上面
一个。我无法从函数ImageClickCallback
湾每当用户点击时,我都无法关闭图像并显示新图像。
答案 0 :(得分:2)
我现在没有MATLAB,所以我的答案中有几个猜测。我们走了:
结束数字
您不关闭图像,因此不会关闭。只需在回调结束时添加close gcf;
即可。
传递数据
现在获取我建议使用基础工作区而不是全局变量的坐标,或者将参数传递给回调。
意味着我会在回调结束时使用assignin('base','newcords',coordinates);
。
使用evalin从基础工作区返回坐标。您可以尝试访问没有evalin的新密码,但我很确定它不会起作用。
newcords=evalin('base','newcords');
现在你创建一个新的变量(在for循环之外初始化它),它包含所有坐标,假设是2D坐标:allcords=zeros(2,numel(img_name));
将回调中的坐标写入new-allcords-variable。
allcords(1,i)=newcords(1);
allcords(2,i)=newcords(2);
On Second认为你不需要从回调中传回坐标,请使用:
初始化循环外的所有线索:
allcords=zeros(2,1);
在你的回调中:
allcords=evalin('base',allcords);
allcordssize=size(allcords):
if min(allcordssize)=1
allcords(1,end)=coordinates(1);
allcords(2,end)=coordinates(2);
assignin('base','allcords',allcords);
else
allcords(1,end+1)=coordinates(1);
allcords(2,end+1)=coordinates(2);
assignin('base','allcords',allcords);
end
close gcf %close picture
通过它,您可以获得回调中的所有坐标。您可以使用的另一种方法是,如上所述,将变量传递给回调。
确保数据与正确的数字匹配
第二个问题是,你的for循环确实一次打开所有图片我猜? (我没有MATLAB可用)。那么在uiwait(gcf);
循环中使用for
怎么样? (在set
之后)。通过这种方式,您可以知道哪个坐标分配给哪个图形(如果打开所有图片,您的坐标与img-list-indexes相反)。
PS:我不确定uiwait
在这种情况下是否有效,如果您创建一个只有1个句柄的GUI(对于您的图像),那么可以肯定的是,而不是关闭您的数字每次选择坐标时都会重新绘制图像。或者每次循环迭代加载GUI,并将图像名称传递给GUI。