2016-12-31 2 views
0

'main.m'이라는 스크립트는 기본적으로 모든 이미지를 저장하고 배열에 삽입하는 경로를 사용합니다. .dat 파일에 이미지 이름을 저장하고 'selectFolder.m'이라는 함수를 호출합니다.MATLAB GUIDE에서 함수 호출 guy

아래에 모든 스크립트와 기능을 게시했습니다. 내 요청은 맨 아래에 있습니다.

%% 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에서 이러한 기능을 통합해야합니다. 내가하고 싶은 일은 '시작하자.'와 같은 버튼으로 'main.m'스크립트를 한 번 호출하면 면책 조항이 표시됩니다. 그런 다음 위에서 설명한 절차로 '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) 

답변

0

는 GUI의 콜백 사이에서 변수를 공유하는 쉬운 방법은이다 guidata 기능을 사용하십시오.

특정 변수에 대하여

mfAmfR 당신은이 방법으로 guidata 그들을 저장하는 데 사용할 수 있습니다 : 당신이 변수를 생성하는 콜백에서 당신은 다음 코드를 삽입 할 수있는 다른 콜백와 공유하려는 :

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

: 당신이 데이터를 retreive하는 wnat하는 콜백에서

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

, 당신은 다음 코드를 삽입 할 수 있습니다 두 예제 모두에서 구조체 my_guidata에는 GUI의 핸들과 사용자가 정의한 추가 varaibles가 들어 있습니다.

GUI의 아키텍처와 관련하여 많은 가능성이 있습니다.

의견을 말하기 : 질문 하단에 게시 한 두 콜백을 보면 GUI에 최소한 axes이 하나있는 것 같습니다. 그럼에도 불구하고 두 제품 모두에 새로운 figure이 생성됩니다. 그것은

내가하고 싶은 것은 같은 버튼으로 'main.m'스크립트를 한 시간에 전화입니다 '시작하자'와 함께 귀하의 질문에 지금 고려하는 axes

의 역할을 분명하지 않다 면책 조항이 표시됩니다. 그런 다음 버튼을

  • 호출 'main.m'스크립트를 한 번만 위에서 설명한 절차와 이미지를 'selectFolder.m'호출하는 만 '다음'버튼을 호출하는 과정을 반복 표시 같은 면책 조항

당신은 단지 Start 푸시 버튼 콜백에 main의 관련 코드를 복사 할 필요가 보여줄 것이며, 그와 함께 '시작하자'.

고지 사항을 나타내는 코드는 실제로는 selectFolder 함수에 있음을 알 수 있으므로 Start 콜백으로 이동해야합니다.

  • 그런 다음 호출을 제거해야,이 작업을 수행

위에서 설명한 절차와 이미지를 'selectFolder.m'호출하는 만 '다음'버튼을 호출하는 과정을 반복 표시 메인에서 selectFolder으로 이동하고 Next pushbotton 콜백에서 본문을 이동하십시오.

또한 .m 파일에 selectImage을 복사 할 수 있습니다.

희망이 도움이됩니다.

카플라 '

관련 문제