2016-12-31 5 views
0

У меня есть сценарий под названием «main.m», который в основном принимает пути, где я сохранил все мои изображения и вставлял их в массивы. Он сохраняет имя изображения в файле .dat и вызывает функцию с именем «selectFolder.m».Вызов функции в GUID 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 

Теперь я должен интегрировать эти функции в моем гуй. То, что я хочу сделать, это вызвать сценарий «main.m» только один раз с помощью кнопки «Let's Start», и с этим будет отображаться отказ от ответственности. Затем повторите процесс, вызывая только кнопку «Далее», которая вызывает «selectFolder.m» и отображает изображения с помощью процедуры, описанной выше.

Возможно ли это сделать так? Я имею в виду, как передать переменную «mfA» и «mfR» в selectFolder? Есть ли лучший и простой способ сделать это?

код в графическом интерфейсе, как:

-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

простой способ разделить переменные между обратного вызова графического интерфейса является используйте функцию guidata.

Что касается вашего конкретного переменных mfA и mfR вы можете использовать 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; 

В обоих примерах структура my_guidata содержит дескрипторы GUI и дополнительные переменные, которые вы определили.

Что касается архитектуры графического интерфейса, то есть множество возможностей.

Firt комментарий: глядя на два обратных вызове вы публикуемые в нижней части вашего вопроса, то кажется, что ваш GUI имеет, по крайней мере, один axes, тем не менее, вы создаете, в обеих из них нового figure так не ясно, роль этого axes

Учитывая теперь ваши вопросы

то, что я хочу сделать, это назвать "main.m подлинником только один раз с помощью кнопки, как«Давайте Start»и с что покажет отказ от ответственности. Затем повторите процесс, вызывающий только кнопку «Далее», который называет «selectFolder.m» и отображать изображения с процедурой, описанной выше

  • звонка «main.m» скрипт только один раз с помощью кнопки как «Давайте Start» и что покажет Дисклеймере

Вы должны просто скопировать соответствующий код вашего main в Start кнопочный обратного вызова.

Обратите внимание, что код, который показывает отказ, фактически находится в вашей функции selectFolder, поэтому вам необходимо переместить его в обратном вызове 1010.

  • Затем повторите процесс, вызывающий только кнопку «Далее», который называет «selectFolder.m» и отображать изображения с процедурой, описанной выше

, чтобы сделать это, вы должны удалить вызов до selectFolder от основного и переместить тело вашего в Next pushbotton callback.

Также вы можете скопировать selectImage в файл графического интерфейса пользователя .m.

Надеюсь, это поможет.

Qapla '

 Смежные вопросы

  • Нет связанных вопросов^_^