13.1.3 - Matlab AVI film

Skærmbillede 2012-05-23 kl. 15.19.21


En flink og dygtig matlab bruger, har programmeret en funktion til at plotte forskellige jordklode-billeder projiceret på en globus, deriblandt filen BlueMarble, som er afbildet herover. Denne kan animeres og gemmes som AVI fil. Naturligvis kan filen også gemmes i en animation med getframe som hidtil, men denne funktionalitet benyttes primært til at lave animationer til intern brug i Matlab. Eksempelvis kunne man bruge Phase-Contrast animationen i et program til at segmentere Phase-Contrast billeder, som da kunne vise animationen på kommando.

I denne øvelse skal I derimod gemme den roterende klode direkte til en AVI fil, som da kan bruges I et hvilket-som-helst program.

Instruktioner:

  • Hent mat filen plotearth.zip og pak den ud i et passende bibliotek.
  • Skift til det nylavede bibliotek i Matlab og lav et blankt script. Gem det som EarthMovie.m
  • Plot et billede af jorden med kommandoen plotearth
    • Den kan kaldes med mange inputs, se help plotearth for flere
    • I jeres tilfælde, skal den kaldes med en 'MapType', som I kan sætte til 'texture','relief','bluemarble','topo' eller andre. Som i andre Matlab kommandoer, indsættes argumenter parvis, først 'MapType' dernæst komma og da fx 'bluemarble':
      • Fx plotearth('MapType','bluemarble');
    • I kan med fordel (specielt hvis I har en knap så hurtig bærbar computer) downsample billedet, så plotearch går hurtigere. Dette gøres med inputargumentet 'SampleStep' som efterfølges af et heltal, der beskriver hvor meget billedet skal downsamples. En god værdi vil være 3-4.
  • plotearth plotter som default billedet i fuld skærm. Gemmer I dette som en avi fil, bliver den meget stor.
  • Vi starter derfor med at "docke" figur vinduet:
    • set(gcf,'WindowStyle','Docked');
  • Dernæst oprettes et handles til en AVI fil med kommandoen VideoWriter:
    • vidObj = VideoWriter('EarthSpin.avi');
  • Dette er analogt til fid = fopen('…'), som I tidligere har stiftet bekendtskab med.
  • Sæt nu frameraten i vidObj til fx 15:
    • vidObj.FrameRate = 15;
  • Endelig åbnes adgangen til vidObj med kommandoen:
    • open(vidObj);
  • Nu skal der dannes en rotationsakse, som jorden skal roteres omkring. Dette gøres med kommandoen:
    • zdir = [0 0 1];
  • Lav et for loop, som løber fra 1 til antallet af frames du vil have rotationen til at foregå med. Hvis du eksempelvis vil have jorden til at rotere en hel omgang i skridt af 1°, skal du vælge 360 (dette kan IKKE anbefales, det giver ganske vist flotte billeder, men tager MEGET lang tid…)
    • En god værdi kan være fx 90 eller 60
  • Sæt dernæst Matlab til at rotere jordkloden med kommandoen:
    • rotate(get(gca,'Children'),zdir,XXX);
    • hvor XXX er antallet af grader pr. loop step
      • Hvis du fx satte loop funktionen til at løbe fra 1-60, skal jordkloden roteres 6° for hvert skridt, hvis du vil have den til at rotere en hel omgang. Tilsvarende skal den roteres 4°, hvis du valgte 90 skridt etc.
  • Nu skal den aktuelle frame gemmes i en variabel ved navn currFrame med kommandoen getframe:
    • currFrame = getframe;
  • Det nyskabte frame skrives til AVI filen med kommandoen:
    • writeVideo(vidObj,currFrame);
  • Afslut dit for loop med end
  • Luk video-objektet (vidObj) med kommandoen:
    • close(vidObj);
  • Tjek at du har en AVI fil ved navn EarthSpin.avi i dit bibliotek og prøv at afspille den.

Der er mange yderligere billeder, som kan anvendes sammen med plotearth. Du kan hente en pakke med disse her. Fx kan du plotte populations-densiteten med kommandoen:

  • plotearth('NEOmap','PlotEarthImages\Population.png','SampleStep',3)

Dette forudsætter dog, at billederne ligger i en undermappe af plotearth mappen kaldet PlotEartImages - ellers skal kommandoen modificeres.

Skærmbillede 2012-05-23 kl. 15.49.42
Created by Samuel Thrysøe © 2012