用户输入后续图像以存储坐标

时间:2015-10-08 13:22:31

标签: image matlab figure

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

返回坐标

湾每当用户点击时,我都无法关闭图像并显示新图像。

1 个答案:

答案 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。