Danilo R. Vieira | Oceanógrafo

Aqui estão algumas das coisas que eu aprendi, descobri ou fiz (por obrigação ou por diversão). Espero que encontre algo que seja útil para você.

MATLAB → Criação, manipulação e análise de vídeos

Gerando um vídeo AVI com anomalias mensais de SST (Sea Surface Temperature)

Neste exemplo, faremos um vídeo AVI contendo as anomalias mensais de temperatura, usando dados de Reynolds et al, disponíveis gratuitamente na internet.

Conteúdo

Os dados

Neste exemplo, os dados já foram previamente organizados em matrizes anuais e estão salvos com nomes do tipo sst2008.mat, que quando carregados trazem matrizes do tipo:

sst2008(latitude, longitude, mes);

Inicialização

close all; clear all; clc;

Primeiro especifica-se com quais anos trabalharemos e pré-alocamos a matriz para melhorar o desempenho do código.

% Quais anos serão incluidos no vídeo
anos = 1982:2007;
% Quantos meses serão contados
qtd_mes = length(anos) * 12;

% estrutura da matriz soma e média:
% - linhas: latitude
% - colunas: longitude
% - páginas: mês
soma = zeros(180, 360, 12);

Obtendo as médias

Primeiro somaremos todos os janeiros, todos os fevereiros e assim sucessivamente. Para isso, será usado um for, que deve ser evitado, mas, aqui, não vi melhor opção.

Apesar de termos pré-alocado a matriz, pode ser que o código demore um pouco para ser executado, então adicionaremos uma barra de progresso para indicar o andamento.

ah = waitbar(0, ...
      'Aguarde enquanto enquanto a soma é calculada.');

[Barra de progresso]

Agora fazemos a soma.

AVISO: este artigo foi escrito em uma época em que eu não sabia MATLAB direito. Utilizar a função eval para abrir um arquivo (como feito abaixo) é uma vergonha. O correto é utilizar matriz = load(['sst', num2str(anos(i))]);.

for i=1:length(anos) % para todos os anos
  % Carrega cada um dos arquivos anuais de SST
  cmd = ['load sst', num2str(anos(i)),'; matriz = sst', ...
         num2str(anos(i)),';'];
  eval(cmd);

  % soma mês média...
   soma = soma + matriz;

  % Atualiza a barra de progresso
  waitbar(i / length(anos));
end;

% Fecha a barra de progresso
close(ah);

A matriz media receberá as médias (óbvio, não?)

media = soma / length(anos);

Chega de enrolar, vamos fazer o vídeo

Para fazer o vídeo, primeiro iniciamos o arquivo usando a função avifile. Eu passei como parâmetro fps o valor 10, pois quero 10 quadros por segundo.

aviobj = avifile('anima-anomalia.avi', 'fps', 10);

Agora temos mais um for que criará cada um dos quadros do vídeo e também adicionará cada quadro ao arquivo.

for i=1:length(anos)
  cmd = ['load sst', num2str(anos(i)),'; matriz = sst', ...
         num2str(anos(i)),';'];
  eval(cmd);

  % Anomalia = mês - média
  anomalia = matriz - media;

  for j=1:12
    imagesc(anomalia(:,:,j));
    axis ('xy', 'equal', 'tight');
    caxis([-5 5]);
    colorbar vert;
    text(170,10, ...
        datestr([anos(i) j 1 0 0 0], 'mmm - yyyy'),...
        'color', 'w', 'backgroundcolor', 'k');
    set(gcf, 'color', 'w');
    aviobj = addframe(aviobj, getframe);
  end;
end;

[Resultado]

Agora basta finalizar o arquivo e o vídeo será criado.

aviobj = close (aviobj);