Mudanças entre as edições de "Curso Matlab aplicado ao processamento de imagens - Aula 2"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
Linha 163: Linha 163:
 
====Capturando o valor do campo de texto====
 
====Capturando o valor do campo de texto====
  
O valor do campo de texto está armazenado na variável ''hObject'', que como o próprio nome já diz, é um objeto. Para atribuir ou receber valores da variável ''hObject'', usamos respectivamente as funções '''set(hObject,\'<atributo>\',<valor>)''' e '''get(hObject,\'<atributo>\')'''.
+
O valor do campo de texto está armazenado na variável ''hObject'', que como o próprio nome já diz, é um objeto. Para atribuir ou receber valores da variável ''hObject'', usamos respectivamente as funções '''set(hObject,'<atributo>',<valor>)''' e '''get(hObject,'<atributo>')'''.

Edição das 12h33min de 4 de dezembro de 2014

Nesta aula, vamos aprender sobre dois tópicos: a criação de interfaces gráficas do usuário - GUI e o básico de processamento de imagens. Esses são dois tópicos interessantes, e que podem ser considerados simples de serem realizados no Matlab.

Interfaces Gráficas do Usuário - GUI

O Matlab possui uma ferramenta para simplificar a criação de GUIs, o GUIDE. Neste curso, vamos criar uma interface simples, com dois eixos de plot, um campo de entrada de dados, dois botões de radio e um botão de apertar. No primeiro eixo vamos plotar um seno, e no segundo vamos plotar um cosseno ou uma tangente, dependendo do botão de radio marcado. A frequência da senoide será inicialmente 0, mas poderá ser alterada através do campo de dado.


Projeto da interface a ser criada


Criação da interface

Para iniciar a criação da interface, escolha a pasta que você quer que os arquivos estejam salvos e digite na janela de comandos:

>> guide

Na janela quick start que apareceu, escolha Blank GUI e pressione OK.


Início da ferramenta GUIDE


A janela que se abre é o editor de interfaces. É aí que os botões são dispostos na janela. Para adicionar uma componente, basta clicar no botão na parte esquerda e arrastá-lo para a parte central, na posição desejada. Cada componenteadicionada possui atributos, que podem ser visualizados através de um duplo clique:


Atributos do botão


Inicie com a criação de 3 painéis, como dispostos na figura:


Painéis


Inclua 2 axes nos painéis superior esquerdo e direito:


Axes


Por fim, inclua um campo edit text no painel inferior esquerdo dois radiobuttons na parte inferior do painel direito:


Interface construida


É possível alterar as informações escritas na interface, clicando duas vezes na componente e alterando o campo Title, no caso dos painéis, ou String para os demais. A interface concluída pode ser vista abaixo:


Interface concluída


Salve o arquivo com o nome interface, uma janela com vários códigos irá aparecer. Ao digitar na janela de comando o comando interface, a janela da interface se abrirá.


Interface


Repare que nenhuma ação é executada ao clicar nos botões ou alterar o campo de texto. Isso acontece porque apenas a interface está criada, falta atribuir ações à cada uma das componentes. É isso que faremos na próxima etapa.

Atribuir uma ação às componentes

Ao salvar a interface criada, dois arquivos são gerados pela ferramenta, um interface.fig, que é a interface em si, e interface.m que é o código que indica a ação que cada componente gera. Este arquivo é organizado como funções, das quais as mais importantes são:

  • interface: Abre a interface criada.
  • interface_OpeningFcn: Última função executada antes que a interface seja efetivamente criada. É usada para inicialização de variáveis, etc.
  • <componente>_Callback: Ação executada pelo componente ao ser pressionado.

Assim, para atribuir ações aos componentes, basta indicá-las no espaço correspondente à componente. Após escrever o código, não esqueça de salvar o arquivo. A seguir, vamos atribuir algumas ações às componentes:

Ação do botão

Inclua na função pushbutton1_Callback o código:

display('Botão pressionado')

salve, e execute a função. Repare que toda vez que o botão é pressionado, uma mensagem Botão pressionado é impressa na janela de comandos.

Plotando ao pressionar o botão

Para plotar um gráfico ao pressionar o botão, inclua na função pushbutton1_Callback o código:

plot(randn(1,10))


Plotando após pressionar o botão


Referenciando uma componente específica

Repare que o eixo em que o gráfico foi plotado não foi escolhido. Para escolher o eixo, é preciso passar para a função plot um indicador da componente a ser utilizada. Todas as componentes estão dispostas na variável handles, struct criada automaticamente pela ferramenta GUIDE. Para esta interface, a variável handles possui os seguintes campos:

handles = 

        figure1: 191.0381
       uipanel3: 27.0389
       uipanel2: 25.0389
       uipanel1: 19.0397
    pushbutton1: 192.0381
   radiobutton1: 34.0389
   radiobutton2: 33.0389
          axes2: 28.0389
          edit1: 26.0389
          axes1: 20.0389
         output: 191.0381

Os valores atribuídos à cada campo não são muito importante, são as referências que o Matlab criou ao gerar a interface. Assim, para escolher o eixo em que o plot será feito, basta passar o valor handles.axes1 ou handles.axes2.

Guardando valores entre componentes

A ação de cada componente é atribuída por uma função dentro do arquivo interface.m. Sendo funções, todas as variáveis criadas são apagadas após sua execução. Caso seja necessário guardar valores entre as ações das componentes, pode-se atribuir à variável handles outros campos, que guardarão os valores desejados.

Por exemplo, para criar um contador de apertos no botão, precisamos de uma variável que guarde o número de vezes que o botão foi pressionado. Criamos um campo chamado contador na variável handles, inicializado com 0, e atribuímos a ação de somar 1 sempre que o botão for pressionado.

Para criar o campo e inicializá-lo com zero, inserimos um código à função interface_OpeningFcn, que ficará assim:

% --- Executes just before interface is made visible.
function interface_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to interface (see VARARGIN)

handles.contador = 0;     %------------------------- Criando o contador

% Choose default command line output for interface
handles.output = hObject;

% Update handles structure
guidata(hObject, handles);

O incremento do contador, e a impressão da mensagem com o número de vezes que o botão foi pressionado são incluídos na função pushbutton1_Callback:

handles.contador = handles.contador + 1;
display(['O botão foi pressionado ' num2str(handles.contador) ' vezes'])

Porém, ao executar a interface e pressionar o botão, observamos que aparece sempre a mesma mensagem:

>> interface
O botão foi pressionado 1 vezes
O botão foi pressionado 1 vezes
O botão foi pressionado 1 vezes

Isso acontece porque as funções de ação não retornam nenhum valor, ou seja, a alteração realizada na variável handle.contador se perde após a execução da função. Para salvar as variáveis, é necessário usar a função guidata(hObject, handles);. Assim, a função pushbutton1_Callback ficará:

function pushbutton1_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

handles.contador = handles.contador + 1;
display(['O botão foi pressionado ' num2str(handles.contador) ' vezes'])
guidata(hObject, handles);

Com isso, o problema está resolvido:

>> interface
O botão foi pressionado 1 vezes
O botão foi pressionado 2 vezes
O botão foi pressionado 3 vezes

Capturando o valor do campo de texto

O valor do campo de texto está armazenado na variável hObject, que como o próprio nome já diz, é um objeto. Para atribuir ou receber valores da variável hObject, usamos respectivamente as funções set(hObject,'<atributo>',<valor>) e get(hObject,'<atributo>').