亲爱的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:为了更好地理解,请查看显示当前状态的附图。
提前致谢:)
答案 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
次。完成后,X
和Y
坐标将放置在X
和Y
个变量中。假设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
,鼠标单击会假定这是您要选择的最终点,因此会继续选择下一个点。
这取决于你想做什么,但任何一种方法都应该有用。
希望这会有所帮助。祝你好运!