Pracując ostatnio nad symulacją rozchodzenia się fal sejsmicznych natknąłem się na problem związany z wygenerowaniem animacji w środowisku Matlab. We wspominanym przed chwilą opisie można zobaczyć efekt jaki udało mi się uzyskać, czyli animację w wysokiej rozdzielczości.
Matlab oferuje dwie standardowe drogi wygenerowania animacji z serii figur (zawierających np. wykres). Jedna droga to stworzenie obiektu avi i dodawanie do niego kolejnych klatek animacji. Druga metoda to stworzenie zmiennej (struktury) z kolejnymi klatkami i zapisanie jej do pliku avi. Metody różnią się wykorzystaniem pamięci programu i zapewne wydajnością (coś za coś).
Niestety obie metody mają wadę, której nie dało mi się w nich wyeliminować: rozdzielczość i jakość filmu jest marna a na dodatek jego rozmiar ze względu na kiepską kompresję jest ogromny.
Mój pomysł na wygenerowanie animacji jest odmienny. Każdą klatkę filmu zapisujemy do pliku graficznego, nadając plikom kolejne nazwy. Wystarczy użycie funkcji print(). Dla przyspieszenia procesu można nie wyświetlać wykresów na ekranie i rysować w pamięci. W poniższym przykładzie rysujemy 50 wykresów z losowymi punktami i każdy wykres zapisujemy do pliku bez wyświetlania:
figure('Visible','Off') % Otwieramy "ukryte" okno for i=1:50 % 50 powtórzeń plot(rand(1,100),rand(1,100),'.'); % Rysujemy 100 punktów print(gcf, '-r120', '-dpng', [num2str(i) '.png']); % Zapisujemy % wykres do pliku .png clf; % Czyścimi okno end close all; % Zamykamy okno
Szczegóły funkcji print() można znaleźć w dokumentacji.
Oczywiście to nie koniec przygody. Czas przerobić klatki w film. Bardzo prosto można to zrobić programem VirtualDub. Uruchamiamy program i przeciągamy pierwszą klatkę (ważne są kolejne numery klatek) do głównego okna programu.
W menu “video” możemy ustawić ilość klatek na sekundę “Frame Rate” i kompresję oraz jej parametry “Compression”. Następnie z menu file wybieramy “Save as AVI”. Otrzymujemy gotową animację. Możemy generować obrazu różnej wielkości (rozdzielczości) a co za tym idzie rozdzielczość animacji. Różnica w jakości wyjściowej i potrzebnej pamięci (zarówno w RAM i na dysku twardym) jest ogromna, więc polecam tą metodę.
Kroki w programie Virtual Dub opisałem pobieżnie, ale mam nadzieję, że każdy sobie poradzi.
Mam nadzieję, że komuś pomogłem.
adres |
hskhdi:
3 May 2013 @ 10:19
Dzieki za cenne wskazówki. Pomogłeś mi i to bardzo. Ciesze ze udało mi się trafić na twoją stronę. Jasno i przejrzyście opisane.
pozdrawiam serdecznie.