簡體   English   中英

從數據光標模式中檢索多個手動選擇的點

[英]Retrieve multiple hand-chosen points from data cursor mode

尊敬的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個點,這些點將成為五個新測站的坐標。

ps:為了更好地理解,請查看隨附的顯示當前狀態的圖片。

等等

提前致謝 :)

您可以使用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 ,單擊鼠標將假定這是您要選擇的最后一個點,因此繼續選擇下一個點。

這取決於您要執行的操作,但是任何一種方法都應該起作用。


希望這可以幫助。 祝好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM