从数据光标模式中检索多个手动选择的点

时间:2014-07-22 19:01:03

标签: matlab matlab-figure

亲爱的stackoverflow社区,

我目前正致力于为论文编写汽车共享模拟器。然而,汽车共享网络包括各种汽车共享站,因此具有可以从城市地图导出的坐标。由于改变站的数量是我的模拟器的必备功能,因此添加站是必须的,我搜索了从数据光标模式检索位置数据的方法。幸运的是,在我面前有一些勤奋的程序员,我使用过他们的努力:

statDiff = length(statCoords)- length(defaultstatCoords);
hf5 = figure(5);
set(0,'CurrentFigure',hf5)
[B, map] = imread('Hannoverosm.png');
C = imresize(B, 0.975);
imshow(C, map)
dcmObject = datacursormode;
pause
datacursormode off
cursor = getCursorInfo(dcmObject);
newStat = [cursor.Position(1), cursor.Position(2)].';
defaultstatCoords(:,end + 1) = newStat;
statCoords = defaultstatCoords;

(而cursor.Position(1)是x和cursor.Position(2)是y位置)

我现在坚持写一个循环,它不仅允许我添加一个工作站(在添加一个工作站后数据光标模式关闭的那一刻),就像在当前的解决方案中一样,但是要检索多个点(也称为新站坐标)作为默认站数和所需nr之间的差异。车站。想象一下:我有5个默认站,我想要总共10个站。两者之间的差异是5,因此我需要手动选择/点击5个点,这些点将成为五个新站的坐标。

p.s:为了更好地理解,请查看显示当前状态的附图。

blah

提前致谢:)

1 个答案:

答案 0 :(得分:2)

您可以使用ginput并指定要在图片中点击的点数。然后,这将返回x和y坐标的数组,这些坐标指定您在图像中单击的坐标。请注意,这些将作为列向量返回。不用多说,做到这一点:

%// Your code from before
statDiff = length(statCoords)- length(defaultstatCoords);
hf5 = figure(5);
set(0,'CurrentFigure',hf5)
[B, map] = imread('Hannoverosm.png');
C = imresize(B, 0.975);
imshow(C, map);

%// New
[X,Y] = ginput(statsDiff); 

%// Transpose the results to make them row vectors
%// X and Y are column vectors from the output of ginput
X = X.';
Y = Y.';

% // Add to array
defaultstatCoords = [defaultstatCoords [X; Y]];

%// Assign back
statCoords = defaultstatCoords;

上面的代码将会像以前一样生成您的图像。当您遇到ginput时,焦点将放在您的图片上,并且您可以在图片上点击任意位置,直到statsDiff次。完成后,XY坐标将放置在XY个变量中。假设X是水平的,而假设Y是垂直的。此外,原点位于左上角。

考虑如何构建放置积分的位置,我假设第一行包含所有X点,而第二行包含所有Y点。因此,我扩展了您的defaultstatCoords数组,以便第一行扩展为具有这些新的X点,而第二行扩展为具有这些新的Y点。然后,我将这些内容分配回statCoords用于您的目的。

一个小小的注意事项是ginput在数据光标模式下不会在屏幕上显示X和Y坐标。因此,您可以看到点击了哪些点的唯一方法是ginput退出。


但是,如果你真的想使用数据光标模式,你可以将它封装在一个循环中,如下所示:

for count = 1 : statsDiff
    dcmObject = datacursormode;
    pause
    datacursormode off
    cursor = getCursorInfo(dcmObject);
    newStat = [cursor.Position(1), cursor.Position(2)].';
    defaultstatCoords(:,end + 1) = newStat;
end 
statCoords = defaultstatCoords;

这种方法的问题在于,一旦选择了点,就必须按 ENTER ,然后再次单击窗口并选择下一个点。这肯定会完成您所做的工作,但在MATLAB命令提示符和图形窗口之间不断地往返是很烦人的。但是,这种方法很好,您可以拖动鼠标并选择一个点。当你终于准备好了,然后按 ENTER 。使用ginput,鼠标单击会假定这是您要选择的最终点,因此会继续选择下一个点。

这取决于你想做什么,但任何一种方法都应该有用。


希望这会有所帮助。祝你好运!