用户在后续图像上输入以存储坐标
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。
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。