Bonjour,
J'ai un programme qui fait appel à un éditeur de sélection de région sur une image à travers un bouton. Cet éditeur, je l'ai récupéré sur le Filexchange (CROIEditor). Voilà alors la petite histoire :
J'ai besoin de laisser la possibilité à l'utilisateur de définir un roi et j'ai bien aimé la proposition que j'ai trouvé sur le Filexchange. Donc lorsque l'utilisateur appuie sur le bouton correspondant de l'interface graphique, voilà le code exécuté :
pour ce qui est de la fonction manual_selection, en voici le code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part manual_selection(handles.rgb_CT);
Tout le problème réside alors dans le fait de pouvoir récupérer le masque définit par l'utilisateur dans le GUI principal pour pouvoir traiter certaines données !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 function manual_selection(img) roiwindow = CROIEditor(img); % you can also assign an image after you created the window. % e.g. roiwindow.image = thenewimage; set(gcf,'UserData',{}); addlistener(roiwindow,'MaskDefined',@your_roi_defined_callback) function your_roi_defined_callback(h,e) [mask, labels, n] = roiwindow.getROIData; % retrieve the generated data % one could also use mask = roiwindow.roi ; ... delete(roiwindow); % this also closes the figure set(gcf,'UserData',{'selected';mask}); end end
Je ne vais pas copier ici le contenu de tout le CROIEditor qui fait 500 lignes mais certaines parties.
Une fois que l'utilisateur a définit sa région d'intérêt, il appuie sur le bouton "appliquer" qui lève un évènement 'MaskDefined' et grâce à notre addlistener on peut alors récupérer ce masque dans la fonction manual_selection. le masque en question est sauvegardé dans une variable puis récupéré dans l'interface principale :
Voilà alors le problème... Une fois la fonction manual_selection exécutée, j'ai tenté un
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 selection_output = get(gcf,'UserData');
uiwait(gcf) pour attendre que l'utilisateur ait finit de définir sa région. Malheureusement ça ne marche pas comme prévu dès qu'une action est terminée le script reprend. Exemple : une première région est définie, l'utilisateur ne peut en définir une deuxième complémentaire et n'a pas le temps d'appuyer sur le bouton "appliquer".
Je tente donc le code suivant :
Donc pour le coup ça marche !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 while isempty(selection_output) uiwait(gcf); selection_output = get(gcf,'UserData'); end size(selection_output) operation_check = selection_output{1}
MAIS... que faire si l'utilisateur décide soudainement d'annuler ce qu'il faisait et fermer la fenêtre ?! j'ai donc tenté de modifier le code lors de la fermeture de la fenêtre également :
Les ennuis commencent, voilà alors l'erreur inattendue que j'ai :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 function closefig(this,h,e) temp = get(gcf,'UserData'); if isempty(temp) set(gcf,'UserData',{'cancelled'}); end uiresume(gcf); % on appellera cette ligne marqueur1 delete(this); % on appellera cette ligne marqueur2 end;
La taille de la variable en sortie est de 526 526 3... ca ressemble à une image donc la fonction get(gcf,'UserData') fonctionne peut-être sur un autre gcf que celui attendu !ans =
526 526 3
Cell contents reference from a non-cell array object.
Error in test3_1_listbox>pushbutton8_Callback (line 809)
operation_check = selection_output{1}
Error in gui_mainfcn (line 96)
feval(varargin{:});
Error in test3_1_listbox (line 42)
gui_mainfcn(gui_State, varargin{:});
Error in @(hObject,eventdata)test3_1_listbox('pushbutton8_Callback',hObject,eventdata,guidata(hObject))
Error while evaluating uicontrol Callback
J'ai donc essayé de glisser entre marqueur1 et marqueur2 la ligne suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part wait(gcf)Bon cette fois j'ai une erreur MAIS la sortie est bien celle que l'on attendait ! par contre la fenêtre ne se ferme plus...Undefined function 'wait' for input arguments of type 'double'.
Error in CROIEditor/closefig (line 203)
wait(gcf);
Error in CROIEditor>@(varargin)this.closefig(varargin{:}) (line 315)
'CloseRequestFcn',@this.closefig, 'visible','off');
Error using waitfor
Error while evaluating figure CloseRequestFcn
ans =
1 1
operation_check =
cancelled
Je tente donc de remplacer uiwait(gcf) par (laisser le temps au script principal de récupérer la valeur ?) :
Retour à la case départ, le programme fait une pause puis on a exactement la même erreur qu'auparavant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part pause(1)
A partir de là je manque d'idée pour faire fonctionner mon interface... quelqu'un aurait une idée s'il-vous-plaît ?ans =
526 526 3
Cell contents reference from a non-cell array object.
Error in test3_1_listbox>pushbutton8_Callback (line 809)
operation_check = selection_output{1}
Error in gui_mainfcn (line 96)
feval(varargin{:});
Error in test3_1_listbox (line 42)
gui_mainfcn(gui_State, varargin{:});
Error in @(hObject,eventdata)test3_1_listbox('pushbutton8_Callback',hObject,eventdata,guidata(hObject))
Error while evaluating uicontrol Callback
Merci d'avance !
Partager