2016-12-31 37 views
0

功能我有一個叫做「的main.m」腳本,基本上需要在那裏我已經救了我的所有圖像,並在陣列插入他們的路徑。它將圖像名稱保存在.dat文件中,並調用名爲「selectFolder.m」的函數。電話在MATLAB嚮導GUI

我發佈的所有腳本和功能下,我的要求是在底部。

%% Folders 
imgFolder = './1.Dataset/'; 
functFolder = './2.Functions/' ; 
%resFolder = './3.Results/'; 

%% Add path 
addpath(genpath(imgFolder)); 
addpath(genpath(functFolder)); 

%% Listing Folders where my images are at 

myFolder1 = '../Always'; %folder path 
[..] %12 folders in total 
myFolder12 = '../Random'; %folder path 
%% Distinguish folder 'Always' & 'Random' 

% Always Folders: subset of images for all users 
mfA = {myFolder1, myFolder3, myFolder5, myFolder7, myFolder9, myFolder11}; 
dimA = length(mfA); 
% Random Folders: subset of images randomly showed 
mfR = {myFolder2, myFolder4, myFolder6, myFolder8, myFolder10, myFolder12}; 
dimR = length(mfR); 
% check if folders are present 
for i = 1:dimA 
    if ~isdir(mfA{i}) 
     errorMessage = sprintf('Error: The following folder does not exist:\n%s', mfA{i}); 
     uiwait(warndlg(errorMessage)); 
     return; 
    end 
end 
for j = 1:dimR 
    if ~isdir(mfR{j}) 
     errorMessage = sprintf('Error: The following folder does not exist:\n%s', mfR{j}); 
     uiwait(warndlg(errorMessage)); 
     return; 
    end 
end 
%% Take images and insert'em in Arrays 

% Always 
MyImgs1 = dir(fullfile(mfA{1}, '*.jpg')); 
[..] %for every cell 
MyImgs6 = dir(fullfile(mfA{6}, '*.jpg')); 

% Random 
MyImgs1r = dir(fullfile(mfR{1}, '*.jpg')); 
[..] %for every cell 
MyImgs6r = dir(fullfile(mfR{6}, '*.jpg')); 

% create arrays with images names 
Array_mfA = {MyImgs1.name, MyImgs2.name, MyImgs3.name, MyImgs4.name, MyImgs5.name, MyImgs6.name}; 
Array_mfR = {MyImgs1r.name, MyImgs2r.name, MyImgs3r.name, MyImgs4r.name, MyImgs5r.name, MyImgs6r.name}; 

%% Print content of array on file 

fileIDA = fopen('2.Functions/Array_Always.dat','w'); 
formatSpec = '%s,'; 
nrows = length(Array_mfA); 
for row = 1 : nrows 
    fprintf(fileIDA, formatSpec, Array_mfA{row}); 
end 
fclose(fileIDA); 

fileIDR = fopen('2.Functions/Array_Random.dat','w'); 
formatSpec = '%s,'; 
nrows = length(Array_mfR); 
for row = 1 : nrows 
    fprintf(fileIDR, formatSpec, Array_mfR{row}); 
end 
fclose(fileIDR); 

%disclaimer 
nrc = 1; 
file = fopen('2.Functions/disclaimer.dat', 'w'); 
fprintf(file, '%d', nrc); 
fclose(file); 

%% call function 

selectFolder(mfA, mfR); 

該函數以兩個數組作爲輸入,這些數組包含我排序的所有圖像的名稱。它執行一些操作,然後調用另一個函數'selectImage.m',該函數全屏顯示所選圖像。

function [] = selectFolder(mfA, mfR) 
    clc 

    %% Open Arrays from file 

    % Always 
    fileID = fopen('2.Functions/Array_Always.dat', 'rt'); 
    Array_A = textscan(fileID,'%s', 'Delimiter', ','); 
    fclose(fileID); 

    % Random 
    fileID2 = fopen('2.Functions/Array_Random.dat', 'rt'); 
    Array_R = textscan(fileID2,'%s', 'Delimiter', ','); 
    fclose(fileID2); 

    %% Show Disclaimer 
    file = fopen('2.Functions/disclaimer.dat', 'r'); 
    dis = fscanf(file, '%d'); 
    fclose(file); 
    if (dis == 1) 
     set(gcf,'Toolbar','none','Menubar','none', 'NumberTitle','off'); 
     set(gcf,'units','normalized','outerposition',[0 0 1 1]); 
     hAx = gca; 
     set(hAx,'Unit','normalized','Position',[0 0 1 1]); 
     imshow('1.Dataset/Disclaimer/DIS.jpg'); 
     drawnow; 

     nrc = 0; 
     file = fopen('2.Functions/disclaimer.dat', 'w'); 
     fprintf(file, '%d', nrc); 
     fclose(file); 

     return; 
    end 
    %% select random folder from 'Array_A' aka Always Array 

    dimA = length(mfA); 

    if ~isempty(Array_A{1}) 
     rndn = randperm(dimA, 1); 
     A_check = Array_A; 
     while isequal(A_check,Array_A) 
      Array_A = selectImage(mfA{rndn}, Array_A); 
      if isequal(A_check,Array_A) 
       rndn = randperm(dimA, 1); 
      end 
     end 
     fileIDA = fopen('2.Functions/Array_Always.dat','w'); 
     formatSpec = '%s,'; 
     nrows = cellfun('length', Array_A); 
     for row = 1 : nrows 
      fprintf(fileIDA, formatSpec, Array_A{1}{row}); 
     end 
     fclose(fileIDA); 
     return; 
    end 

    %% select random folder from 'Array_R' aka Random Array 

    if ~isempty(Array_R{1}) 
     dimR = length(mfR); 
     rndnr = randperm(dimR, 1); 
     R_check = Array_R; 
     while isequal(R_check,Array_R) 
      Array_R = selectImage(mfR{rndnr}, Array_R); 
      if isequal(R_check, Array_R) 
       rndnr = randperm(dimR, 1); 
      end 
     end 
     fileIDR = fopen('2.Functions/Array_Random.dat','w'); 
     formatSpec = '%s,'; 
     nrows = cellfun('length', Array_R); 
     for row = 1 : nrows 
      fprintf(fileIDR, formatSpec, Array_R{1}{row}); 
     end 
     fclose(fileIDR); 
    end 
end 

selectImage:

function [ Array ] = selectImage(myFolder, Array) 
%% Check 

MyImgs = dir(fullfile(myFolder, '*.jpg')); 
dim = length(MyImgs); 
n = 0; 
for i = 1 : dim 
    MyImgs(i).name 
     if ~any(strcmp(Array{1}, MyImgs(i).name)) 
      disp(MyImgs(i).name);disp('not present in ');disp(myFolder); 
      n = n + 1; 
     end 
end 
if (n == dim) 
    disp('empty folder') 
    return; 
end 

rN = randperm(dim, 1); 
baseFileName = MyImgs(rN).name; 

while ~any(strcmp(Array{1}, baseFileName)) 
    fprintf(1, 'not present %s\n', baseFileName); 
    rN = randperm(dim, 1); 
    baseFileName = MyImgs(rN).name; 
end 

%% Dispay image 

dim = cellfun('length', Array); 

for i = 1 : dim 
    if strcmp(baseFileName, Array{1}(i)) 
     Array{1}(i) = []; 
     break 
    end 
end 

fullFileName = fullfile(myFolder, baseFileName); 
fprintf(1, 'Now reading %s\n', fullFileName); 
imageArray = imread(fullFileName); 

set(gcf,'Toolbar','none','Menubar','none', 'NumberTitle','off'); 
set(gcf,'units','normalized','outerposition',[0 0 1 1]); 
hAx = gca; 
set(hAx,'Unit','normalized','Position',[0 0 1 1]); 
imshow(imageArray); % Display image. 
drawnow; 

end 

現在我有這些功能在我的GUI集成。我想要做的就是用「Let's Start」這樣的按鈕一次調用'main.m'腳本,並顯示免責聲明。 然後重複該過程調用只有「下一步」按鈕,它調用「selectFolder.m」並顯示與上述過程中的圖像。

難道不可能性做這樣?我的意思是,如何將變量'mfA'和'mfR'傳遞給selectFolder?有更好更簡單的方法嗎?

在GUI中的代碼是這樣的:

-main:

% --- Executes on button press in Start. 
function Start_Callback(hObject, eventdata, handles) 
% hObject handle to Start (see GCBO) 
% eventdata reserved - to be defined in a future version of MATLAB 
% handles structure with handles and user data (see GUIDATA) 


axes(handles.axes1); 
figure 
main 

-selectFolder:

function Next_Callback(hObject, eventdata, handles) 
% hObject handle to Next (see GCBO) 
% eventdata reserved - to be defined in a future version of MATLAB 
% handles structure with handles and user data (see GUIDATA) 

axes(handles.axes1); 
figure %show the image in another window 
selectFolder(mfA, mfR) 

回答

0

的簡單方法的GUI的回調之間共享的變量是使用 guidata函數。

對於您的特定變量mfAmfR可以使用guidata 來存儲它們,這種方式:在您生成變量回調你想,你可以將以下代碼插入其他的回調分享到:

% Get the GUI data 
my_guidata=guidata(gcf); 
% 
% section of your code in which you create the mfA and mfR vars 
% 
% Store the variables to be shared among the callbacks in the guidata 
my_guidata.mfA=mfA; 
my_guidata.mfR=mfR; 
% Save the updated GUI data 
guidata(gcf,my_guidata); 

在其中您wnat中檢索數據的回調,可以插入 以下代碼:

% Get the GUI data 
my_guidata=guidata(gcf); 
% Retrieve the data from the GUI data structure 
mfA=my_guidata.mfA; 
mfR=my_guidata.mfR; 

在這兩個示例中,struct my_guidata都包含GUI的句柄以及您定義的附加變量。

關於GUI的體系結構,有很多可能性。

留一條評論:看看你在問題底部發布的兩個回調,看起來你的GUI至少有一個axes,不過你創建了一個新的figure目前還不清楚那axes

的作用現在考慮您的問題

我想要做的就是所說的「main.m文件」腳本只是一個時間就像一個按鈕,「讓我們開始」,並與這將顯示免責聲明。然後重複該過程調用只有「下一步」按鈕,它調用「selectFolder.m」和顯示圖像與上述

  • 呼叫「的main.m」腳本僅一次描述的按鈕的程序像「讓我們開始」,並與將顯示免責聲明

你剛纔在Start按鈕回調您main的相關代碼複製。

注意,這說明免責條款的代碼實際上是在你的selectFolder功能,所以你必須把它移到在 Start回調。

  • 然後重複上述過程僅調用「下一步」按鈕,這稱之爲「selectFolder.m」,並顯示圖像與上述

描述的過程要做到這一點,你必須刪除通話從selectFolder從主和移動你的身體在Next pushbotton回調。

您也可以在GUI .m文件中複製selectImage

希望這會有所幫助。

Qapla'