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

User input on subsequent images to store coordinates

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

返回的坐标

b。我无法在用户单击时关闭图像并显示新图像。

我现在这里没有 MATLAB,所以我的回答中有一些猜测。开始吧:

期末数据

你没有关闭图片,所以它不会关闭。只需在回调的末尾添加 close gcf;

传递数据

现在要获取坐标,我建议使用基础工作区而不是全局变量,或者将参数传递给回调。 意味着我会在你的回调结束时使用 assignin('base','newcords',coordinates);

使用 evalin 从基础工作区取回您的坐标。您可以尝试在没有 evalin 的情况下访问 newcords,但是我很确定它不会起作用。 newcords=evalin('base','newcords');

现在您创建一个新变量(在 for 循环外初始化它),它包含所有坐标,假定为 2D 坐标:allcords=zeros(2,numel(img_name));

将回调中的坐标写入您的新 allcords 变量。

allcords(1,i)=newcords(1);
allcords(2,i)=newcords(2);

再想想你不需要从回调中传回坐标,然后:

在循环外初始化所有线:

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)。那么在 for 循环中使用 uiwait(gcf); 怎么样? (在你的 set 之后)。这样你就知道哪个坐标分配给了哪个图形(如果所有图片都打开你的坐标与 img-list-indexes 是相反的)。

P.S.: 我不确定 uiwait 在这种情况下是否有效,如果您创建一个只有 1 个句柄(用于您的图像)的单一 GUI,则肯​​定有效,每次选择坐标时,不要关闭图形,只需重新绘制图像即可。或者在每次循环迭代时加载您的 GUI,并将图像名称传递给 GUI。