Вызов функции в графическом интерфейсе руководства MATLAB

У меня есть сценарий под названием ‘main.m’, который в основном принимает пути, где я сохранил все мои изображения и вставить их в массивах. Он сохраняет имя изображений в a .файл dat и вызов функции с именем ‘selectFolder.m’.

Я разместил все скрипты и функции под, мой запрос внизу.

%% 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 %sn', 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 %sn', 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 ‘script только один раз с кнопкой, как «Let’s Start», и с этим покажет отказ от ответственности.
Затем повторите процесс, вызывая только кнопку’ Next’, которая вызывает ‘ selectFolder.m ‘ и отображать изображения с помощью описанной выше процедуры.

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

Код в gui похож:

-главный:

% --- 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)

1 ответ

  1. Простой способ поделиться переменными среди обратного вызова GUI-использовать
    функция 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 a comment: глядя на два обратного вызова, которые вы разместили в нижней части вашего вопроса, кажется, что ваш GUI имеет, по крайней мере, одинaxes, тем не менее, вы создаете, в обоих из них новыйfigure, поэтому не ясно роль этого axes

    Рассматривая сейчас ваши вопросы

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

    • вызовите ‘ main.M ‘script только один раз с помощью кнопки «Let’s Start» и с этим покажет отказ от ответственности

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

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

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

    для этого необходимо удалить вызов to selectFolderиз main и переместить тело вашего в Nextpushbotton callback.

    Также вы можете скопировать selectImageв файл GUI.m.

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

    Qapla’