2015-10-08 16 views
0
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的矩陣。用戶輸入後續圖像以存儲座標

但是在上面

a。我無法獲得從函數ImageClickCallback

返回的座標b。無法在用戶點擊時關閉圖像並顯示新圖像。

+0

嘗試'close(get(axesHandle,'Parent'));'以關閉圖像。是否顯示正確的座標? – Wauzl

+0

@Wauzl是的,他們顯示,但我也想存儲他們。最後的手段是創建一個全局變量並添加。在哪裏添加'close(get(axesHandle,'Parent'));'。 –

回答

2

我現在沒有MATLAB在這裏,所以在我的答案有幾個猜測。在這裏,我們去:

期末圖

你不關閉圖像,所以它不會關閉。在回調結束時只需添加close gcf;

傳遞數據

現在讓我建議使用基礎工作空間的座標,而不是一個全局變量或參數傳遞給你的回調。 意味着我會在回調結束時使用assignin('base','newcords',coordinates);

使用evalin從基礎工作區返回座標。你可以嘗試訪問新的線沒有evalin,但我很確定它不會工作。 newcords=evalin('base','newcords');

現在你創建一個新的變量(初始化它外面的for循環),它包含所有的座標,假設二維座標:allcords=zeros(2,numel(img_name));

寫的回調座標到新-allcords變量。

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

關於第二個想法,你並不需要通過座標從回調回來,一起去:

你的循環之外初始化allcords:

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-index相反)。

P.S.:我不確定uiwait是否適用於這種情況,如果您只用1個句柄(用於圖像)創建一個GUI,而不是關閉圖形,則只需在每次座標爲時重新繪製圖像選擇。或者在每個循環迭代中加載GUI,並將圖像名稱傳遞給GUI。

+0

謝謝你的回覆!你能解釋一下,如果所有的圖片都打開了,你的座標與img-list-indexes相反。 –

+0

@Abhisek Bhatia:如果你使用figure,你會創建一個等於新窗口的新圖形。當你創建一個新窗口時,它總是在最上面,這意味着你最後創建的圖形將成爲最上面的圖形。如果用戶在每個窗口中選擇座標,那麼第一個座標輸入將是最後一個圖像的座標輸入,最後一個輸入是第一個圖像的座標輸入。 –

+0

感謝您的回覆。有什麼方法可以清除當前圖形並重新繪製圖形頂部的圖像。我不想每次都打開一個新窗口。 –