Вы находитесь на странице: 1из 6

Criando uma interface grfica para

obter distncias entre pontos em uma


figura
Este exemplo mostra como criar uma interface grfica para obter a distncia entre
pontos em uma figura. O principal neste exemplo a interface e como trabalhar com os
componentes, pois a distncia entre os pontos pode ser obtida por diversas outras
formas, podendo at mesmo ser automatizada.
Download dos arquivos (8.9 KB).

Contedo

Criando a interface

Codificando o exemplo

Transformando num executvel

Criando a interface
Para criar uma interface no MATLAB, basta chamar a funo guide no prompt do
MATLAB. Esta funo trar a seguinte janela:

Neste exemplo, podemos ficar com a opo padro (Blank GUI) e voc tambm pode
salvar a figura (interface) com a opo Save new figure as. Quando voc salvar, o
MATLAB criar automaticamente um arquivo *.m correspondente sua interface e j

adiciona a este arquivo um monte coisa necessria ao bom funcionamento da interface.


Este arquivo conter o cdigo para as aes dos botes, controles de texto, menus e
demais componentes existentes na interface. Clicando em OK, temos a nova interface:

Agora voc j pode colocar os componentes na interface. Basta selecionar um


componente na lista esquerda e coloc-lo na interface com um clique. Todos os
componentes suportam o recurso de arrastar e soltar e tambm tm alas de
redimensionamento, que voc j deve ter visto em algum outro programa. Para alterar
cores, fonte e texto dos componentes, basta clicar duas vezes sobre ele, ir aparecer o
editor de propriedades, onde voc pode modificar facilmente as caracterstica dos
controles e da prpria interface. Para o exemplo, eu usei uma interface assim (clique
para ver maior):

Esta interface funcionar da seguinte forma: o usurio clica em Abrir imgem e


escolhe uma figura, que ser aberta no componente axes1; em seguida, ele especifica
uma distncia conhecida usando a caixa de texto abaixo do boto Referncia e
escolhe a unidade em que est a distncia com o menu logo abaixo. Ento ele clica no
boto Referncia e marca na figura onde est a distncia conhecida. Depois basta
escolher com quantos pontos ele quer trabalhar (na minha interface eu chamei de
Estaes), clica em Marcar pontos e marca os pontos na figura. Conforme ele
marca os pontos as distncias so calculadas e mostradas sobre a figura. Veja em
funcionamento (note que no editor de propriedades eu coloquei a propriedade ToolBar
da figura como figure para ter acesso s ferramentas de imagem durante a execuo do
programa) (clique para ver maior):

Para ver funcionando voc pode clicar no tringulo verde do GUIDE ou apertar F5 no
editor de cdigos. Para chamar a interface futuramente, basta usar o nome que voc deu
a ela como se fosse uma funo (e isso que ela ), voc pode cham-la dentro de
outros programas ou direto do promtp (ela deve estar acessvel no path).

Codificando o exemplo
Para associar aes aos componententes, o MATLAB utiliza os chamados callbacks,
que so apenas funes chamadas quando alguma coisa acontece. Veremos como
funciona na prtica: clicando com o boto direito sobre um componente, aparece um
menu, neste menu h a opo View Callbacks que mostra todos os callbacks disponveis
para um componente e voc precisa clicar em qual voc quer editar e o MATLAB
mostra onde digitar e, para alguns componentes, j trs algumas dicas. Veja o cdigo
que eu coloquei no callback do boto Abrir imagem (os comentrios em ingls foram
colocados automaticamente pelo MATLAB):
% --- Executes on button press in pushbutton1.
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)

% mostra uma tela para que o usurio escolha um arquivo de imagem:


[filename, canceled] = imgetfile;
% se o usurio no tiver cancelado
if canceled
% guarda o nome do arquivo
handles.arquivo = filename;
% abre a imagem
handles.imagem = imread(filename);
% seleciona o componente axes1
axes(handles.axes1);
% exibe a figura
imshow(handles.imagem);
end
% reseta a referncia
handles.px2min = NaN;
% salva a varivel handles
guidata(hObject, handles);

Handles so nmeros que identificam os componentes, eles ficam armazenados na


varivel handles. Essa varivel do tipo struct e muito importante: a nica que
est disponvel para todos os callbacks, pois salva com a funo guidata. Veja que eu
aproveitei ela para guardar o nome do arquivo e tambm a imagem.
Agora o callback do boto Referncia:
% --- Executes on button press in pushbutton3.
function pushbutton3_Callback(hObject, eventdata, handles)
% hObject
handle to pushbutton3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles
structure with handles and user data (see GUIDATA)
% ativa o axes1
axes(handles.axes1);
% mostra a imagem (isso reseta a imagem quando marcamos uma nova
referncia)
imshow(handles.imagem);
% pegamos qual a distncia que o usurio que marcou
% ("edtRef" a propriedade "Tag" da caixa de texto)
numRef = str2double(get(handles.edtRef, 'String'));
% V se o usurio digitou um nmero vlido, caso contrrio
% mostra uma mensagem e sai desse callback
if isnan(numRef) || (numRef <= 0)
% mostra a mensagem
errordlg('Por favor, digite um nmero vlido.', 'Erro');
% sai da funo
return;
end
% pede para o usurio marcar dois pontos
ptos = ginput(2);
% calcula a distncia em pixels que o usurio marcou.
% se voc estudou vetores, sabe que distncia entre pontos

%
%
%
%
c

pode ser obtida pela norma do vetor que tem


incio num ponto e fim no outro, ento basta chamar
a funo norm com a diferena entre os pontos como
parmetro.
= norm(ptos(1,:)-ptos(2,:)) / numRef;

% converte a distncia em pixels para milhas nuticas, levando


% em considerao que o usurio pode ter marcado em qualquer
% unidade disponvel.
% get(handles.popupmenu1, 'Value') retorna qual item o usurio
escolheu
switch get(handles.popupmenu1, 'Value')
case 1 % minuto
fator = c;
case 2 % segundo
fator = c / (1/60);
case 3 % grau
fator = c / 60;
case 4 % quilometro
fator = c / (1/(1852 * 1000));
case 5 % metro
fator = c / (1/1852);
end
% guarda a referncia
handles.px2min = fator;
guidata(hObject, handles);

Veja que continuamos usando os handles, agora para obter propriedades dos
componentes usando a funo get (para mudar propriedades via cdigo, usa-se set).
Finalmente, o callback do boto Marcar pontos. Nesse eu vou usar a mesma tcnica
que autores famosos de livros tcnicos usam quando tm preguia: no vou comentar
para estimular o raciocnio do leitor.
% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject
handle to pushbutton2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles
structure with handles and user data (see GUIDATA)
if isnan(handles.px2min)
errordlg('Marque a referncia primeiro', 'Erro');
return;
end
numEst = str2double(get(handles.edtNumEst, 'String'));
if ~isnan(numEst) && numEst > 1
axes(handles.axes1);
pto = ginput(1);
hold on;
plot(pto(1), pto(2), 'xr');
else
errordlg('Por favor, digite um nmero vlido de estaes.',
'Erro');
return;
end
for j=2:numEst

last = pto;
pto = ginput(1);
plot(pto(1), pto(2), 'xr');
line([last(1) pto(1)], [last(2) pto(2)]);
d = ( norm(last-pto) / handles.px2min ) * 1852;
text(pto(1)+(last(1)-pto(1))/2, pto(2)+(last(2)-pto(2))/2, ...
sprintf('%.2fm', d), 'backgroundcolor', 'y');
end
hold off;

Transformando num executvel


Se voc quiser transformar uma interface grfica em um programa de verdade (que pode
ser executado em outros computadores, mesmo sem o MATLAB) voc pode usar o
MATLAB Compiler, digitando o seguinte no prompt do MATLAB (interface.m o
nome do arquivo M, no necessrio especificar o arquivo FIG correspondente):
mcc -m interface.m

A opo -m diz que queremos um programa standalone, ou seja, que funcione sozinho,
independente do MATLAB. Na verdade, ele no ser totalmente independente, ele
requerir a instalao do MCR (MATLAB Compiler Runtime), mas voc poder
distribuir seu programa e o MCR livremente e dentro da lei, pois o pessoal da
MathWorks deixa voc distribuir o MCR para qualquer um (apenas o MCR). Consulte
a documentao para saber mais.
Em Windows, ser criado o arquivo interface.exe na mesma pasta na qual est o arquivo
M, em Linux ser criado o arquivo binrio interface, tambm na mesma pasta do
arquivo M.