• Sonuç bulunamadı

A variável FP (False Positives), será a soma de todas as imagens que pertencem ao subconjunto de imagens sem interesse (FISI – Falsas imagens sem interesse), mas foram classificadas como pertencentes ao subconjunto de imagens com interesse com as imagens classificadas como pertencendo ao subconjunto de imagens com objetos de interesse (FICI – Falsas imagens com interesse), mas que de fato, pertencem ao subconjunto de imagens sem interesse.

A variável TP (True Positives), corresponde a todas as imagens que pertencem ao subconjunto de imagens sem interesse e foram corretamente classificadas.

A variável nP será relativa ao número de exemplos existentes no conjunto de teste em estudo e que correspondem a 100 imagens sonar.

Para determinação de False positives (FP) e True positives (TP) foi definido um conjunto de imagens 100 imagens de teste (figura 37), dividido em dois subconjuntos:

 Imagens (786x506) sem objetos de interesse – 20 imagens;  Imagens (786x506) com objetos de interesse – 80 imagens;

47

4.4 Condições e Metodologia de Avaliação de Desempenho

Com o objetivo de avaliar o desempenho do algoritmo Deteção através de ficheiro

sonar foi desenvolvido uma metodologia onde o método de segmentação escolhido e o

de deteção foram testados.

A ideia subjacente à metodologia implementada, é utilizar o conjunto de imagens de teste (imagens que contêm objetos de interesse e imagens que não contêm objetos de interesse) e através dos métodos de avaliação determinar quais os parâmetros que apresentam as melhores performances nas métricas escolhidas, precisão e recall.

Como foi descrito no capítulo anterior, o processo de Deteção através de ficheiro

sonar passa pela definição de dois threshold’s: um associado à segmentação e outro

associado à classificação.

O threshold relativo à segmentação da imagem está subdividido em dois, ou seja é necessário estabelecer um limiar de intensidade por forma a considerar a partir de que valores se considera que estes fazem parte da linha água e quantos são necessários para fazer a segmentação da mesma.

O threshold relativo à classificação necessita de um limiar que a partir de um certo número de pares de semelhança classifique como sendo um náufrago. Dada a sua dimensão, forma e características, esta variável é a principal foco de ajuste pois é esta que vai definir a resposta positiva ou negativa de haver um corpo à deriva.

4.4.1 Avaliação do desempenho para a localização de náufragos

A tabela 1 demonstra se a segmentação das imagens que vão ser analisadas, é realizada de forma correta. Analisando as imagens na zona da linha de água, é notável

48

que os valores dos pixéis que pertencem à linha de água variam entre os 130 e os 230 em relação ao seu nível de intensidade.

Foi então testado com a variação do Limiar de Intensidade, a quantidade de pixéis que se encontram por linha em relação ao LI. Os resultados obtidos mostram que para valores de limiar entre 130 e 150 a segmentação é feita de forma correta, pois temos em média mais 59% de pixels maiores que o LI na zona da linha de água, e onde pode-se verificar que a segmentação é feita de forma correta.

Limiar de Intensidade Pixels na linha maiores ou iguais que o LI (%) Segmentação da imagem 130 78 Correto 140 71 Correto 150 59 Correto 160 49 Incorreto 170 41 Incorreto 180 32 Incorreto 190 24 Incorreto 200 15 Incorreto 220 13 Incorreto 230 11 Incorreto

Tabela 1: Resultados obtidos em função à segmentação da imagem

A tabela 2 demonstra o comportamento da classificação do conjunto de teste de imagens, com a variação do threshold de pares de semelhança:

Pares de

Semelhança Precisão Recall

4 50/(50+17) = 0.75 50/80 = 0.63

6 56/(56+14) = 0.8 56/80 = 0.7

8 61/(61+10) = 0.85 61/80 = 0.76

10 69/(69+7) = 0.91 69/80 = 0.86

49

14 73/(73+2) = 0.97 73/80 = 0.91

16 76/(76+0) = 1 76/80 =0.95

18 77/(77+0) = 1 77/80 = 0.96

20 79/(79+0) = 1 79/80 = 0.99

Tabela 2: Resultados obtidos em função do threshold

A avaliação do desempenho do algoritmo SURF em relação ao número de pares de semelhança para a classificação do náufrago é descrita, na tabela 2. A percentagem ótima de recall é obtida quando se utiliza o valor de threshold vinte pares de semelhança para a classificação do náufrago, e temos uma percentagem de 99%. Quanto à precisão conclui-se que o valor ótimo de threshold é obtido quando o algoritmo SURF utiliza dezasseis pares de semelhança, tendo associada uma percentagem de 100%.

Em relação ao protótipo desenvolvido, pode-se concluir que os valores de

threshold recomendados são 140 para o threshold LI e em relação aos pares de

semelhança o valor 20 de threshold. É de salientar que estes valores de threshold foram obtidos nas condições ideais, pois o ruido em ambiente controlado é muito menor em relação ao ambiente real (mar aberto), onde o ruido se faz sentir muito à superfície devido à ondulação e ao vento sentido no local.

50

Capitulo 5 – Sumário e Trabalho Futuro

5.1 Sumário

Para sumarizar, o caminho seguido, que teve como objetivo, conseguir detetar náufragos através de imagens sonar com um elevado grau de certeza. Para tal farei uma breve descrição do caminho seguido através de uma breve síntese de cada capítulo.

No capítulo 1, foi procurada uma introdução que colocasse o leitor dentro do problema em questão. Para tal, contextualizou-se o tema e foi definido o objetivo perseguido.

No capítulo 2, foi desenvolvido o estado da arte do processamento de imagem digital, procurando sempre fazer a ligação a imagens sonar. Ao longo do capítulo 2, foi definido o caminho a seguir, desde a fase de pré-processamento da imagem, passando pelos diversos métodos de segmentação da imagem e reconhecimento de padrões em imagens, por forma a conseguir criar um algoritmo robusto e eficaz.

No capítulo 3, procurou-se desenvolver o processo que irá permitir localizar náufragos através de imagens sonar. Dividiu-se o processo em três fases: simplificação, extração de características e classificação.

A fase da simplificação da imagem tem como objetivo a melhoria no desempenho final do processo de identificação de náufragos. Esta visa a redução de alguns efeitos indesejáveis, tais como o ruído. Para esse efeito cada imagem é pela função linha de água.

Nesta é feita a segmentação da imagem para se ficar apenas com a zona de possível

aparecimento do náufrago e onde é removido parcialmente o ruído.

A fase da extração de características e de classificação de imagem encontram-se no mesmo módulo (Funçao Detect), onde primeiramente se extrai as características da imagem a ser analisada e depois se procede à comparação das características da mesma com as características das imagens presentes na base de dados.

É importante salientar que as imagens sonar são contaminadas com ruido, que atrapalha o processamento e a interpretação das mesmas. Durante o desenvolvimento da dissertação de mestrado houve preocupação em melhorar a qualidade das imagens, para tal utilizou-se o filtro Sobel antes de passarem para a fase de extração de características, sendo que a perda da informação não é significante.

51

O ambiente implementado para a criação dos métodos e para a realização dos testes foi desenvolvido no Matlab, ferramenta computacional muito empregue no trabalho com imagens.

Conforme apresentado no capítulo 3, o algoritmo SURF foi apresentado por Herbert Bay na Conferência Internacional sobre Visão Computacional realizada na Áustria, em maio de 2006, mostrando que pode ser usado em tarefas como o reconhecimento de objetos, sendo este muito mais eficaz e mais rápido do que o SIFT, tendo a característica de ser invariante a rotação.

Por fim, no capítulo 4, temos a base de dados que foi criada, e os resultados obtidos. Dos resultados obtidos é demostrado o porque da escolha dos limiares de decisão que o algoritmo usa e são retiradas conclusões da eficácia do algoritmo empregue para a deteção de náufragos.

Através do capítulo 4 pode-se concluir que o threshold LI que indica o limiar de intensidade, a partir do qual o pixel é constituinte da linha da água pode variar entre os 130 e os 150 por forma a realizar a segmentação da imagem de forma correta. Em relação ao segundo threshold dos pares de semelhança que são necessários para que se consiga obter classificação foi escolhido o valor de threshold 20, pois foi este que apresentou uma percentagem ótima de recall de 99% porcento para a classificação positiva de náufragos à deriva. É de salientar que estes valores de threshold foram obtidos nas condições ideais, pois o ruido em ambiente controlado é muito menor do que em ambiente real (mar aberto), onde o ruido se faz sentir muito à superfície devido à ondulação e ao vento sentido no local.

Neste capítulo também foi possível notar que para cumprir com o objetivo final desta dissertação, que era fazer deteção em tempo real de náufragos, será necessário aumentar a velocidade de processamento dos dados de uma forma mais expedita. Na secção seguinte deixo uma solução possível que fará com que o tempo de análise diminua drasticamente.

5.2 Trabalho Futuro

É importante definir algumas linhas de trabalho que poderão ser abordadas por outros investigadores, para que a pesquisa tenha sequencia. Neste contexto foram

52

identificadas algumas possibilidades de continuação para este trabalho que devem contar com futuros investigadores. Um dos possíveis incrementos seria colocar a posição vertical do náufrago à superfície na base de dados, recolhendo imagens sonar nas duas frequências (high and Low Frequency) e com os dois ganhos (20db e 30 dB) por forma a enriquecer– la. Com isto é expectável que se consiga aumentar taxa de eficiência na classificação. A partir do método deteção através de ficheiro sonar, adaptar por forma a desenvolver um método em que se consiga a deteção em tempo real, ou seja a cada imagem proveniente do feixe acústico esta seja instantaneamente analisada e obtida uma resposta. Como foi referido na secção anterior esta deteção a velocidade de processamento não é a desejável (2,3 segundos). Uma das soluções possíveis é abordar o problema com uma arquitetura CUDA (Compute Unified Dispositivo Architecture), em que esta é uma plataforma utilizada para programação em paralelo, sendo o primeiro modelo de programação que permitiu alto nível de programação para GPUs (unidades de processamento gráfico). A função dos GPUs é o processamento gráfico, assim sendo o desenvolvimento feito pelos programadores CUDA, consiste em acelerar os processamentos dos algoritmos, através da quantidade de paralelismos dos GPUs. Outro incremento de extrema relevância seria a utilização de outro tipo de sonar, por exemplo o de multifeixe por forma a comparar a qualidade de imagens e os thresholds usados para a segmentação da imagem e classificação. Por último a programação noutra linguagem para que se consiga a implementação do software num UUV, em que o veículo encontrar-se-á submerso sempre a analisar a superfície e só se deslocará à superfície caso tenha encontrado um possível náufrago.

54

Bibliografia

ALLAN, L. D. (1986). Manual of Fetal Echocardiography. Norwell, MA.USA: MTP Press. AWCOCK, G. J., & THOMAS, R. (1996). Applied Image Processing. New York: McGraw-Hill. BAY, H. (2008). Speeded-Up Robust Features (SURF). Computer Vision and Image

Understanding.

BEDNAR, J., & WATT, T. (1984). Alpha-trimmed and their relationship to the median filters. New York: IEEE Transactions on Acoustic.

BISHOP, C. M. (1995). Neural Networks for Pattern Recognition. New York: Oxford University Press.

BUSSE, L., CRIMMINS, T. R., & FIENUP, J. R. (1995). Ultrasonics Symposium (v.2 ed.). IEEE Computer Society.

CAETANO, T. S. (2000). Estudo sobre Técnicas Estatísticas Paramétricos para Reconhecimento

de Padrões. Porto Alegre: PPGC UFRGS.

CRIMMINS, T. R. (1985). Geometric filter for specke reduction.

FACON, J. (1993). Processamento e Análise de Imagens. Cordoba: Escuela Brasileno - Argentina de Informática.

FISHER, R., PERKINS, S., WALKER, A., & WOLFART, E. (2000). Crimmins Speckle

Removal. (Edinburgh: Univerty of Edinburgh, Division of Informatics Artificial

Intelligence) Obtido em Acesso em: Jan. 2015, de

<http://www.dai.ed.ac.uk/HIPR2/crimmins.htm#1>

GONZALEZ, R. C., & WOODS, R. E. (1993). Digital Image Processing. Massachusetts: Addison-Wesley.

GONZALEZ, R. C., WOODS, R., & EDDINS, S. (2004). Digital Image Processing: Using

Matlab (1.ed. ed.). Upper Saddle River: Pearson Prentice Hall.

GRAHAN, D., & BARRETT, A. (1997). Knowledge-Based Image Processing. London: Springer Verlag.

JAHNE, B. (1997). Digital Image Processing. Berlin: Springer-Verlag.

JAIN, A. K. (1989). Fundamentals of Digital Image Processing. Englewood Cliffs: Prentice Hall. LINDEBERG, T. (1998). Feature Detection with Automatic Scale Selection. International Journal

on Computer Vision.

LOWE, D. G. (1999). Object Recognition from Local Scale-Invariant Features. International Conference on Computer Vision.

MALLADI, R., & SETHIAN, J. (1996). Graphical Models and Image Processing ([s.1.], v.58, n.2 ed.). IEEE Transaction on Medical Imaging.

55

MURINO, V. (1998). Structured Neural Networks for Pattern Recognition (v.28 ed.). New York: IEEE Transactions on Systems, Man and Cybernetics.

Murphy, K., Torralba, A., Eaton, D., & Freeman, W. (2005). Object Detection and Localization

Using Local and Global Features. University of British Columbia.

Palma, D. (2004). Extracção automática de texto em sequências de video. Lisboa: Instituto Superior Técnico.

PEDRINI, H., & SCHWARTZ, W. R. (2007). Análise de Imagens Digitais - Prinicipios,

Algoritmos e Aplicações (1.ed. ed.). São Paulo: Thompson Learning.

SANTANA, J. (1999). Pré-processamento de Imagens Ecocardiográficas. Porto Alegre: PPGC da UFRGS.

SONKA, M., HLAVAC, V., & BOYLE, R. (1998). Image Processing, Analysis and Machine

56

Apêndices

58

Apêndice 1 - Código que vai fazer a deteção do náufrago

function testar(data)

D1 = 'C:\Users\Hugo Fonseca\Desktop\base de dados\HF20\';%pasta que

contem img´s da base de dados

imgcount = contadorIMG(D1);%variavel com nº de img´s na BD

i = lineofwater(data);%funçao que descobre a linha de àgua

ToAnalyze = data(1:i,:);%imagem ja segmentada com a linha de àgua

for i = 1 : imgcount

source = imread(strcat(D1,int2str(i),'.png'));%imagem da base de dados

detect(source,ToAnalyze,i); % funçao que detecta naúfrago

end end

60

Apêndice 2 - Código que vai contar quantas imagens estão presentes na Base de Dados

function imgcount = contadorIMG(Dcaminho)

D = dir(Dcaminho);%caminho da pasta

imgcount = 0;%inicia contador de ficheiros

for i=1 : size(D,1)

if

not(strcmp(D(i).name,'.')|strcmp(D(i).name,'..')|strcmp(D(i).name,'Thu

mbs.db'))%verifica se tem ficheiro

imgcount = imgcount + 1; % Numero das imagens que estao na

pasta da base de dados

end

end end

62

Apêndice 3 - Código da Função Linha de água

function agua = lineofwater(data)

LIMIAR=20;%intesidade minima do pixel

[height,length] = size(data);%[506x700]

for i=15:length

line = data(i,:);%Analisa linha à linha a imagem

indice = line >LIMIAR;%substitui os valores maiores que o LIMIAR

por "1" e os outros abaixo por "0"

y = line(indice);%compara a matriz inicial com o indice e forma

uma matriz so com esses valores

z = size(y);%da as dimensoes da matriz

if z(1,2) > 30%se tiver mais que X valores

agua = i+20; %linha de àgua

return;

end

end

agua = 500;%linha de àgua

64

Apêndice 4 - Código da Função Video

function video(VideoIN)

%limpa a pasta onde vao ser guardadas as imgs

delete('C:\Users\Hugo Fonseca\Desktop\imagens a testar\*.png');

%carrega o video

vidobj=VideoReader(VideoIN);

%nº de frames que estao no video

frames=vidobj.Numberofframes;

k=1; % variavel que permite saltar de 4 em 4 frames

o=1; % gera o nome das imagens em nº (1.png,2.png,3png,...,n.png)

for f=1:frames

if k<=frames

thisframe=read(vidobj,k);% le a frame k do video

% funçao que nos da a posiçao da linha de agua

i = lineofwater(thisframe);

% descarta tudo o que tiver abaixo da linha de agua

i2=thisframe(1:i,1:786,:);

% caminho das imagens que vao ser analisadas

pathname = 'C:\Users\Hugo Fonseca\Desktop\imagens a testar\';

% grava as imagens ja recortadas

imwrite( i2,[pathname, num2str(o),'.png']);

k=k+4;% variavel que permite saltar de 4 em 4 frames

o=o+1;% gera o nome das imagens em nº

(1.png,2.png,3png,...,n.png) else break end end end

66

Apêndice 5 - Código da Função Detect

function detect(source,ToAnalyze,i)

I= rgb2gray (source); % converte para cizento a imagem

K= ToAnalyze;

sourcePoints = detectSURFFeatures(I); %analisa as caracteristicas da

imagem

ToAnalyzePoints = detectSURFFeatures(K);

%extração das caracteristicas

[sourceFeatures, sourcePoints] = extractFeatures(I, sourcePoints); [ToAnalyzeFeatures, ToAnalyzePoints] = extractFeatures(K,

ToAnalyzePoints);

%compara as caracteristicas das duas imagens (da-nos as coordenadas)

boxPairs = matchFeatures(sourceFeatures,

ToAnalyzeFeatures,'MaxRatio',1);

numPairs = length(boxPairs); % Numero de pares entre as duas imagens

if numPairs >= 5 matchedsourcePoints = sourcePoints(boxPairs(:, 1), :); matchedToAnalyzePoints = ToAnalyzePoints(boxPairs(:, 2), :); % figure; % showMatchedFeatures(source, ToAnalyze, matchedsourcePoints,matchedToAnalyzePoints, 'montage'); % title('Pontos Correspondentes (Incluindo os Outliers)');

tform = estimateGeometricTransform(matchedsourcePoints,

matchedToAnalyzePoints, 'projective');

% buscar as dimensoes da imagem da base de dados

boxPolygon = [1, 1;... % canto sup esquerdo

(1,1)

size(source, 2), 1;... % canto sup direito

size(source, 2), size(source, 1);... % canto inf direito

1, size(source, 1);... % canto inf esquerdo

1, 1]; % canto sup esquerdo para fechar o poligno

% adapta a img da base de dados com a posiçao da imagem a testar

newBoxPolygon = transformPointsForward(tform, boxPolygon);

figure;

imshow(ToAnalyze);%colaca a imagem que esta a ser

analisada

hold on;

line(newBoxPolygon(:, 1), newBoxPolygon(:, 2),

'Color', 'G','LineWidth', 3); %desenha a box

title('Caixa ao Redor do Naúfrago');

mensagem = strcat('Na imagem' , int2str(i), ' da BD

temos ---> ', int2str(numPairs), 'pontos de semelhança --->

67 disp(mensagem);

else

mensagem = strcat('Na imagem' , int2str(i), ' da BD temos --->

', int2str(numPairs), 'pontos de semelhança ---> NEGATIVO');

disp(mensagem);

68

Apêndice 6 - Código que permite visualizar dados do sonar em Matlab (FEUP)

function varargout = offlineViewer(varargin)

% OFFLINEVIEWER M-file for offlineViewer.fig

% OFFLINEVIEWER, by itself, creates a new OFFLINEVIEWER or raises the % existing

% singleton*. %

% H = OFFLINEVIEWER returns the handle to a new OFFLINEVIEWER or the handle to

% the existing singleton*. %

% OFFLINEVIEWER('CALLBACK',hObject,eventData,handles,...) calls the local

% function named CALLBACK in OFFLINEVIEWER.M with the given input arguments.

%

% OFFLINEVIEWER('Property','Value',...) creates a new OFFLINEVIEWER or raises the

% existing singleton*. Starting from the left, property value pairs are

% applied to the GUI before offlineViewer_OpeningFcn gets called. An

% unrecognized property name or invalid value makes property application

% stop. All inputs are passed to offlineViewer_OpeningFcn via varargin.

%

% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one

% instance to run (singleton)". %

% See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help offlineViewer % Last Modified by GUIDE v2.5 27-May-2014 13:26:53

% Begin initialization code - DO NOT EDIT

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%

gui_Singleton = 1;

gui_State = struct('gui_Name', mfilename, ...

'gui_Singleton', gui_Singleton, ...

'gui_OpeningFcn', @offlineViewer_OpeningFcn, ...

'gui_OutputFcn', @offlineViewer_OutputFcn, ...

'gui_LayoutFcn', [] , ...

'gui_Callback', []);

if nargin && ischar(varargin{1})

gui_State.gui_Callback = str2func(varargin{1}); end

69

[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else

gui_mainfcn(gui_State, varargin{:}); end

% End initialization code - DO NOT EDIT

% --- Executes just before offlineViewer is made visible.

function offlineViewer_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 offlineViewer (see VARARGIN) % Choose default command line output for offlineViewer

handles.output = hObject; handles.chunkSize = 640; handles.numReads = 500; handles.fName = ''; handles.fPath = ''; handles.fIndex = 0; handles.running = 0; handles.pause = 0;

set(handles.pushbuttonStartStop, 'Enable', 'off');

set(handles.textFileName, 'String', '(no file selected)');

set(handles.pushbuttonPause, 'Enable', 'off');

set(handles.sliderSpeed, 'Value', handles.numReads);

set(handles.sliderSpeed, 'SliderStep', [1/9, 1/9]);

set(handles.editSpeed, 'String', handles.numReads);

handles.t = timer();

set(handles.t, 'Name', 'OffViewerT');

set(handles.t, 'ExecutionMode', 'fixedDelay');

set(handles.t, 'Period', 0.2);

handles.t.TimerFcn = {@offViewerT_Callback, handles};

handles.fId = 0;

handles.A = zeros(handles.chunkSize, 1, 'uint8');

handles.ssWidth = 500; handles.ssLength = 300;

handles.ssImage = zeros(handles.ssLength, handles.ssWidth, 'uint8');

handles.stbd = 113 + (0:2:handles.ssLength-1); handles.port = 113 + (1:2:handles.ssLength-1);

set(handles.axes1, 'Position', [0.03 0.03 0.95 0.78]);

set(handles.axes1, 'DrawMode', 'fast');

set(handles.axes1, 'DataAspectRatio',

70

set(handles.axes1, 'Parent', hObject);

handles.iHandle = image(handles.ssImage, 'Parent', handles.axes1);

%handles.iHandle = image('CDATA', handles.ssImage, 'Parent', handles.axes1,

%'BusyAction', 'cancel', 'EraseMode', 'normal', 'HitTest', 'off');

colormap(handles.axes1, bone(128));%desenha as 5 linhas vermelhas

for b = 1:5

linePoint = round(handles.ssLength * b/6);

line([0, handles.ssWidth],[linePoint, linePoint], 'Color', 'r',

'LineWidth', 1, 'LineStyle', ':');

end

axis off;

%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%% % Update handles structure

guidata(hObject, handles);

% UIWAIT makes offlineViewer wait for user response (see UIRESUME) % uiwait(handles.figure1);

% --- Outputs from this function are returned to the command line.

function varargout = offlineViewer_OutputFcn(hObject, eventdata,

handles)

% varargout cell array for returning output args (see VARARGOUT); % hObject handle to figure

% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Get default command line output from handles structure

varargout{1} = handles.output;

function offViewerT_Callback(obj, event, handles)

data = guidata(handles.figure1);

if (data.fId == 0)

return;

end

data.A, count] = fread(data.fId, [data.chunkSize, data.numReads],

'*uint8'); if feof(data.fId) frewind(data.fId); if count == 0 return end end if data.A(613, :) ~= 252

71

disp('Error in reading file');

disp(data.A(613, :)); end %imshow(data.A(data.port,:)); testar(data.A(110:600,:)); imshow(data.A(110:600,:)); B = [flipud(data.A(data.stbd, :)); data.A(data.port, :)]; realNumReads = data.numReads; if size(data.A, 2) ~= realNumReads realNumReads = size(data.A, 2); end

data.ssImage = [data.ssImage(:, realNumReads+1:end), B];

set(data.textDateData, 'String', char(data.A(9:20, end)'));

set(data.textTimeData, 'String', char(data.A(21:29, end)'));

set(data.textPosData, 'String', char(data.A(48:71, end)'));

set(data.textSpeedData, 'String', double(data.A(74, end)) * 0.0514 );

set(data.textHeadingData, 'String', hex2dec(strcat(dec2hex(data.A(75,

end),

2), dec2hex(data.A(76, end), 2)))/10 );

set(data.figure1, 'CurrentAxes', data.axes1);

set(data.iHandle, 'CData', data.ssImage);

drawnow expose; guidata(handles.figure1, data);

% --- Executes on button press in pushbuttonStartStop.

function pushbuttonStartStop_Callback(hObject, eventdata, handles)

% hObject handle to pushbuttonStartStop (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)

if handles.fIndex == 1

% if file selected

if handles.running == 0

% Start playback

try

handles.fId = fopen(strcat(handles.fPath, handles.fName)); start(handles.t);

handles.running = 1;

set(handles.pushbuttonStartStop, 'String', 'Stop');

set(handles.pushbuttonSelectFile, 'Enable', 'off');

set(handles.pushbuttonPause, 'Enable', 'on');

set(handles.pushbuttonPause, 'String', 'Pause');

catch mException

errordlg(mException.message, 'Error opening file.');

end else % Stop playback try fclose(handles.fId); handles.fId = 0;

72 stop(handles.t);

handles.running = 0;

set(handles.pushbuttonStartStop, 'String', 'Start');

set(handles.pushbuttonSelectFile, 'Enable', 'on');

set(handles.pushbuttonPause, 'Enable', 'off');

catch mException

errordlg(mException.message, 'Error closing file.');

end end end guidata(handles.figure1, handles);

% --- Executes on button press in pushbuttonSelectFile.

function pushbuttonSelectFile_Callback(hObject, eventdata, handles)

% hObject handle to pushbuttonSelectFile (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)

[fName, fPath, fIndex] = uigetfile('*.81s', 'Choose Sidescan File');

if fIndex ~= 0

handles.fName = fName; handles.fPath = fPath; handles.fIndex = 1;

set(handles.textFileName, 'String', fName);

set(handles.pushbuttonStartStop, 'Enable', 'on');

else

handles.fName = '';

handles.fPath = '';

handles.fIndex = 0;

set(handles.textFileName, 'String', '(no file selected)');

set(handles.pushbuttonStartStop, 'Enable', 'off');

end

guidata(handles.figure1, handles);

% --- Executes on button press in pushbuttonPause.

function pushbuttonPause_Callback(hObject, eventdata, handles)

% hObject handle to pushbuttonPause (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)

if handles.pause == 0

% pause state

stop(handles.t); handles.pause = 1;

set(handles.pushbuttonPause, 'String', 'Resume');

else

% un-pause state

start(handles.t); handles.pause = 0;

set(handles.pushbuttonPause, 'String', 'Pause');

end

guidata(handles.figure1, handles);

73

% --- Executes on slider movement.

function sliderSpeed_Callback(hObject, eventdata, handles)

% hObject handle to sliderSpeed (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,'Value') returns position of slider

% get(hObject,'Min') and get(hObject,'Max') %to determine range of slider

sliderV = get(hObject,'Value');

set(handles.editSpeed, 'String', sliderV);

handles.numReads = sliderV;

guidata(handles.figure1, handles);

% --- Executes during object creation, after setting all properties.

function sliderSpeed_CreateFcn(hObject, eventdata, handles)

% hObject handle to sliderSpeed (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called

% Hint: slider controls usually have a light gray background.

if isequal(get(hObject,'BackgroundColor'),

get(0,'defaultUicontrolBackgroundColor'))

set(hObject,'BackgroundColor',[.9 .9 .9]);

end

function editSpeed_Callback(hObject, eventdata, handles)

% hObject handle to editSpeed (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB

Benzer Belgeler