Forum Informatica Unict

LAUREA TRIENNALE (D.M. 270/04) => Interazione e Multimedia, 9 CFU => Topic started by: TheSpecialOne on 28-01-2010, 12:19:16



Title: Aprire un'immagine in un'interfaccia
Post by: TheSpecialOne on 28-01-2010, 12:19:16
Ho tentato di aprire un'immagine, tramite il bottone "apri", creato con una gui come fatto a lezione dal prof.
Ho naturalmente modificato, il '*.m' in '*.jpg' e provato a caricare il file corrispondente in una matrice A, ma niente da fare.
Continua ad aprirmi un nuovo foglio, con il nome dell'immagine che ho caricato!
L'idea è quella di creare una matrice A, con il contenuto di pathname,filename, cioè il file che tento di aprire.
Correggetemi se sbaglio, magari con un codice più "verosimile"!

Dato che ci sono, se qualcuno ha qualche info in più sul salvataggio del file e la chiusura dell'interfaccia, se può gentilmente condividere!

Grazie anticipatamente!

ecco il mio codice:

Code:
function pushbutton1_Callback (hObject ecc...)
  [pathname, filename]=uigetfile ('*.jpg','Apri file');
  edit ([pathname,filename]);
  A=imread ([pathname, filename]);
  figure,imshow (A,[]);


Title: Re:Aprire un'immagine in un'interfaccia
Post by: atrides86 on 28-01-2010, 13:26:12
l'errore è semplice.. hai sbagliato la sintassi di uigetfile scrivendo:

 [pathname, filename]=uigetfile ('*.jpg','Apri file');

invece è: (hai invertito i valori di ritorno tra pathname e filename)

[nomefile,path]=uigetfile('*.formato','titolo_fin')

Quindi quella giusta nel tuo caso è:

[filename,pathname]=uigetfile ('*.jpg','Apri file');

Ora pongo io una domanda sperando che qualcuno mi risponda... Una volta caricata questa immagine mettiamo che voglio creare un altro bottone filtro sobelx che fa partire una funzione lavorando con l'immagine appena caricata.. come gliela passo? Avevo pensato di dichiarare la variabile dell'immagine globale.. metto global A per esempio ma non so in che parte del codice dell'interfaccia inserirla perche mi da errore ovunque.



Title: Re:Aprire un'immagine in un'interfaccia
Post by: Vivynz on 28-01-2010, 13:29:37
ho il tuo stesso problema..perchè per lavorare sull'immagine è necessario che le modifiche vengano salvate nella variabile mentre così ogni volta che si vuole utilizzare l'immagine bisogna caricarla nuovamente...ho provato a dichiararla come globale anche io in varie parti del codice, anche nella funzione che dovrebbe essere quella prinicpale, ma se poi la voglio utilizzare da qualche altra parte non la vede sempre lo stesso..


Title: Re:Aprire un'immagine in un'interfaccia
Post by: TheSpecialOne on 28-01-2010, 14:07:42
l'errore è semplice.. hai sbagliato la sintassi di uigetfile scrivendo:

 [pathname, filename]=uigetfile ('*.jpg','Apri file');

invece è: (hai invertito i valori di ritorno tra pathname e filename)

[nomefile,path]=uigetfile('*.formato','titolo_fin')

Quindi quella giusta nel tuo caso è:

[filename,pathname]=uigetfile ('*.jpg','Apri file');

Ora pongo io una domanda sperando che qualcuno mi risponda... Una volta caricata questa immagine mettiamo che voglio creare un altro bottone filtro sobelx che fa partire una funzione lavorando con l'immagine appena caricata.. come gliela passo? Avevo pensato di dichiarare la variabile dell'immagine globale.. metto global A per esempio ma non so in che parte del codice dell'interfaccia inserirla perche mi da errore ovunque.



ora provo, non avendo matlab in questo pc, non sò se funziona.
Stando all'ultimo tuo quesito, supposta caricata un'immagine (in A per esempio), si potrebbe pensare di copiarla in una nuova matrice B, e su quest'ultima eseguire il filtro o l'operatore che si vuole applicare, cosi in modo da avere l'originale (A) distinta e intatta, e andare a salvare B con la modifica apportata.
Idea ancora non testata, quindi da prendere con le molle!!!


Title: Re:Aprire un'immagine in un'interfaccia
Post by: Vivynz on 28-01-2010, 14:13:55
il problema non è quello è che le variabili normali sono locali al metodo e quindi inutili e quelle globali (che dovrebbero essere viste in tutte le funzioni) forse sbagliamo ad utilizzarle..


Title: Re:Aprire un'immagine in un'interfaccia
Post by: leviadragon on 28-01-2010, 14:47:46
Ieri ci ho lavorato anchio , e dopo 5 ore (si davvero 5 ore) a cercare guide e tutto ho scoperto che per salvare una variabile globale quale sia un'immagine bisogna creare un handles

la sintassi è questa ( da inserirefuori dai metodi dei pulsanti)
handles.A = imread('immagine');

quando la modificate  (con un qualunque metodo )dovete lanciare un comando che salva gli headles

guidata(hObject, handles);

insomma , nelle interfaccie la cosa è un pò complessa.
la funzione inoltre mi sembra abbastanza instabile perchè spesso mi crasha il programma :boh


Title: Re:Aprire un'immagine in un'interfaccia
Post by: atrides86 on 28-01-2010, 15:09:07
sono riuscito a usare le variabili globali... le funzioni che indico sono quelle dei punsalti dell'interfaccia.

funzione pulsante carica immagine
...
[nomeFile,path]=uigetfile(...)
global A
A=imread([path nomeFile]);

...

funzione pulsante applica filtro
global A
B=filtro(A);
...


Nota: per riusarla si deve scrivere global... inoltre se a qualcuno interessa io ho creato una variabile globale chiamata stato che mi permette di capire se è gia stata caricata l'immagine ecc.. all'inizio vedo se è vuota con la funzione di matlab isempty(variabile) e poi modifiico gli stati a mio piacere assegnando un numero per ogni stato.. es carica stato 1.. applicazione filtro stato 2.. ecc ecc



Title: Re:Aprire un'immagine in un'interfaccia
Post by: andreacannella on 28-01-2010, 16:44:26
a proposito di GUI in matlab, potrebbe essere utile scaricare alcuni esempi di GUI.

Ce n'è diversi a quest'indirizzo:
http://www.mathworks.it/matlabcentral/fileexchange/?term=tag%3A%22gui%22 (http://www.mathworks.it/matlabcentral/fileexchange/?term=tag%3A%22gui%22)

Saluti
 :-ciao :-ciao

Andrea


Title: Re:Aprire un'immagine in un'interfaccia
Post by: Vivynz on 28-01-2010, 17:08:54
 :-OK :-OK :-OK


Title: Re:Aprire un'immagine in un'interfaccia
Post by: Alex_47 on 01-02-2010, 17:19:10
sono riuscito a usare le variabili globali... le funzioni che indico sono quelle dei punsalti dell'interfaccia.

funzione pulsante carica immagine
...
[nomeFile,path]=uigetfile(...)
global A
A=imread([path nomeFile]);

...

funzione pulsante applica filtro
global A
B=filtro(A);
...


Nota: per riusarla si deve scrivere global... inoltre se a qualcuno interessa io ho creato una variabile globale chiamata stato che mi permette di capire se è gia stata caricata l'immagine ecc.. all'inizio vedo se è vuota con la funzione di matlab isempty(variabile) e poi modifiico gli stati a mio piacere assegnando un numero per ogni stato.. es carica stato 1.. applicazione filtro stato 2.. ecc ecc



Ho un problema con questa funzione praticamente quando applico il filtro , naturalmente creo il filtro da applicare come se fosse una funzione , ma mi da una serie di errori che non riesco a capire

ecco il codice della funzione e del metodo che applica il filtro

Code:
Funzione Outlier prima parte

function [Z]=Outlier(A)

I = double(rgb2gray(imread(A)));



qua i codici dei due pulsati , il caricamento immagine e l'applicazione del filtro
Code:
function pushbutton7_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton7 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

[filename,pathname] = uigetfile('*.jpg','Apri file');
global A
A = imread ([pathname, filename]);
figure,imshow(A,[]);




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

[Z] = Outlier(A);

figure,imshow(Z,[]),title('Outlier');






qua ci sono gli errori

Code:

??? Error using ==> strfind
Input strings must have one row.

Error in ==> imread at 201
if (strfind(filename, '://'))

Error in ==> Outlier at 6
I = double(rgb2gray(imread(A)));

Error in ==> Opzioni>pushbutton8_Callback at 188
[Z] = Outlier(A);

Error in ==> gui_mainfcn at 75
        feval(varargin{:});

Error in ==> Opzioni at 44
    gui_mainfcn(gui_State, varargin{:});

??? Error while evaluating uicontrol Callback.




Title: Re:Aprire un'immagine in un'interfaccia
Post by: atrides86 on 02-02-2010, 13:13:08
L'errore è semplice. Riguarda la funzione e non l'interfaccia. Tu hai scritto:

function [Z]=Outlier(A)

I = double(rgb2gray(imread(A)));

mentre quello giusto è:

function [Z]=Outlier(A)

Z = double(rgb2gray(A));

C'erano 2 errori:
1) Dichiari il valore di ritorno della funzione in Z ma poi metti la matrice in I quindi non la trova.
2) L'immagine è stata gia caricata dal bottone. Quindi devi semplicemente usarla senza doverla ricaricare.

A presto :-)



Title: Re:Aprire un'immagine in un'interfaccia
Post by: Alex_47 on 02-02-2010, 19:52:01
Grazie sono riuscito a risolvere il problema^^