środa, 21 października 2009

Tworzenie zrzutów ekranu oraz filmów w VTK

Zazwyczaj po zakończonej analizie danych wyniki są zapisywane, aby można było do nich wrócić później lub przesłać współpracownikom albo zleceniodawcom. Warto również zastanowić się jak można dodatkowo utrwalić powstałe przy okazji wizualizacje, by odbiorca dostał nie tylko liczby, ale również ich graficzną prezentację. Można oczywiście udostępnić odpowiedni program lub skrypt. Jednak problem pojawi się, gdy trzeba będzie zainstalować dodatkowe biblioteki lub obliczenia miałyby trwać długo. W takiej sytuacji lepiej przygotować zrzuty ekranu kluczowych fragmentów procesu obliczeniowego, lub nagrać film przedstawiający co się dzieje. VTK posiada wsparcie dla obu podejść, co zostanie opisane w tym wpisie.

Zmiana koloru powierzchni z wykorzystaniem tablic przeglądu LUT (ang. lookup table)

Zanim przejdziemy do właściwego tematu najpierw zostanie pokazane jak ustalać kolor konturu (wizualizacja powierzchniowa) z użyciem tablic LUT. Zabieg ten pozwala na łatwiejsze rozróżnianie różnych obiektów i zwalnia nas z samodzielnego definiowania poszczególnych kolorów.

#skala kolorów od niebieskiego do czerwonego
vtkLookupTable lut
lut SetHueRange 0.66667 0.0
lut SetSaturationRange 1 1
lut SetValueRange 1 1
lut SetAlphaRange 1 1
lut SetNumberOfColors 256
lut Build

#algorytm marching cube
vtkMarchingCubes iso
iso SetInput [reader GetOutput]
iso SetValue 0 127

#obiekt mapujący wyniki na płaszczyznę; tutaj możemy określić zmianę jej koloru
vtkPolyDataMapper mapper
mapper SetInput [iso GetOutput]
mapper ScalarVisibilityOn
mapper SetLookupTable lut
mapper SetScalarRange 0 255

vtkActor isoActor
isoActor SetMapper mapper
eval [isoActor GetProperty] SetOpacity 0.5

ren1 AddActor isoActor
Jak to działa w praktyce zostanie pokazane w następnych sekcjach.

Tworzenie zrzutów ekranu z okna renderowania

Oczywiście zrzuty ekranu można zrobić za pomocą standardowych metod z użyciem klawisza PrintScreen lub korzystając ze specjalnego programu służącego do tego celu. Niestety wymaga to dodatkowej pracy i musi być wykonywane ręcznie. W VTK mamy możliwość zautomatyzowania tej czynności stosując klasę vtkWindowToImageFilter, która pobiera zawartość okna renderowania i zamienia je na obraz. Później wystarczy tylko skorzystać z odpowiedniego obiektu zapisującego (w zależności od formatu), aby otrzymać plik we wskazanej lokalizacji.
vtkWindowToImageFilter w2if
w2if SetInput renWin
vtkPNGWriter writer
writer SetInputConnection [w2if GetOutputPort]
writer SetFileName "screenshot.png" $level]
renWin Render
writer Write

Zapis sekwencji obrazów do katalogu

Jeden zrzut ekranu często bywa niewystarczający, dlatego można zapisać całą sekwencję plików.
W tym przykładzie będzie zwiększana iteracyjnie wartość progowa dla algorytmu generującego kontur, a wynik za każdym razem będzie zapisywany na dysk. Dodatkowo na początku został utworzony obiekt wyświetlający tą wartość (vtkTextActor), aby łatwiej było analizować postęp działania algorytmu.
iren Start

vtkTextActor textActor
textActor SetDisplayPosition 70 20
eval [textActor GetTextProperty] SetJustificationToCentered
eval [textActor GetTextProperty] SetFontSize 18
ren1 AddActor textActor

vtkWindowToImageFilter w2if
w2if SetInput renWin
vtkPNGWriter writer
writer SetInputConnection [w2if GetOutputPort]

for {set level 0} {$level < 255 } {incr level} {
textActor SetInput "Iso value: $level"
iso SetValue 0 $level
renWin Render
writer SetFileName [format "output/animate-change_iso_contour%04d.png" $level]
w2if Modified
writer Write
}
Po zakończeniu działania tego skryptu w katalogu output powinno znaleźć się 255 plików. Niektóre z nich zostały przedstawione poniżej. W tym momencie można dokładniej zobaczyć jakie możliwości daje użycie tablic LUT - obiekty są automatycznie kolorowane.


Uwaga:
  • Powyższy rysunek nie został przygotowany za pomocą prezentowanego skryptu tylko z użyciem programu ImageMagick. Wydano polecenie:
    montage *.png -tile x1 -background '#796a9f' -geometry 150x150+5+5  out.bmp
  • Zrzuty oczywiście zapisane są w katalogu jako niezależne pliki.

Generowanie filmów z użyciem narzędzi ffmpeg oraz mencoder

Kiedy mamy już całą serię obrazów zapisaną w katalogu można na jej podstawie przygotować film. W Linuksie do najpopularniejszych narzędzi wspierających to zadanie można zaliczyć ffmpeg i mencoder (podobno są również ich odpowiedniki dla MS Windows). Pomimo tego, że są to programy działające z poziomu linii komend, to ich możliwości w wielu przypadkach przewyższają aplikacje okienkowe do edycji wideo.

Instalacja w Ubuntu sprowadza się do wydania następującego polecenia w okienku terminala:
sudo apt-get install ffmpeg mencoder
Przykład użycia ffmpeg:
ffmpeg -sameq -y -r 10 -i animate-change_iso_contour%04d.png -r 24 ff_out.mpg
Przykład użycia mencoder:
mencoder "mf://*.png" -mf fps=10 -o men_out.mpg -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=2000
W obu przypadkach powstaje film wideo bardzo dobrej jakości zakodowany w formacie MPEG-4. Aby film nie przebiegał zbyt szybko w każdej sekundzie jest wyświetlane 10 klatek wejściowych, co daje w sumie 25 sekundowy utwór przy 255 plikach.

Tworzenie filmów z poziomu VTK

VTK
, tak jak pisałem na początku, również posiada wsparcie do tworzenia filmów. Mamy do dyspozycji następujące klasy:
  • vtkAVIWriter - tworzy pliki AVI; dostępny tylko dla Windows; nie testowałem,
  • vtkFFMPEGWriter - bazuje na bibliotekach wchodzących w skład ffmpeg; miałem problemy z kompilacją VTK ze wsparciem tej opcji,
  • vtkMPEG2Writer - zapisuje wideo z użyciem częściowo opatentowanego kodeka MPEG-2. Użycie tej opcji w własnych programach tylko na własne ryzyko. Kompilacja bez problemów.
Z powyższych metod udało mi się przetestować tylko tą ostatnią. Dobre wprowadzenie jak sobie poradzić z instalacją jest w dokumentacji VTK. Postaram się jednak opisać poszczególne etapy krok po kroku.
  1. W dziale Download na stronie VTK, szukamy sekcji "Download additional components",
  2. Pobieramy plik vtkmpeg2encode.tar.gz i rozpakowujemy go do dowolnego katalogu.
  3. Tworzymy katalog build, przechodzimy do niego i uruchamiamy kompilację:
    mkdir build && cd build && cmake ../ && make
  4. Przechodzimy do katalogu gdzie mamy skompilowane VTK i uruchamiamy graficzną nakładkę na CMake. Ustawiamy dodatkowe opcje:
    VTK_USE_MPEG2_ENCODER            ON
    vtkMPEG2Encode_INCLUDE_PATH /home/rafal/install/vtk/support/vtkmpeg2encode/;/home/rafal/install/vtk/support/vtkmpeg2encode/build/
    vtkMPEG2Encode_LIBRARIES /home/rafal/install/vtk/support/vtkmpeg2encode/build/libvtkMPEG2Encode.a
  5. Kompilujemy VTK.
Przykład użycia jest niemal identyczny z opisywanym wcześniej sposobem zapisu sekwencji plików do katalogu. Zamieniamy tylko obiekt vtkPNGWriter na vtkMPEG2Writer i zmieniamy nazwę pliku do wygenerowania. Warto zwrócić uwagę na różnice: 1) nie musimy każdorazowo ustawiać nazwy pliku, 2) mamy dodatkowe funkcje Start oraz End otwierające i zamykające plik wideo.
vtkWindowToImageFilter w2if
w2if SetInput renWin
vtkMPEG2Writer movie
movie SetInputConnection [w2if GetOutputPort]
movie SetFileName "output/animate-change_iso_contour.mpg"
movie Start

for {set level 0} {$level < 255 } {incr level} {
textActor SetInput "Iso value: $level"
iso SetValue 0 $level
renWin Render
w2if Modified
movie Write
}

movie End

Umieszczanie filmów na YouTube

Jeśli uda nam się przygotować ciekawe wizualizacje warto je przedstawić szerszej publiczności na jednym z portali hostujących pliki wideo. Do najpopularniejszych serwisów tego typu należy oczywiście YouTube. Portal ten pozwala na publikację filmów wysokiej rozdzielczości pod warunkiem, że zostaną one przygotowane w odpowiedni sposób. Opisze tylko najważniejsze kwestie z tym związane, a po szczegóły odsyłam do dokumentacji YouTube.

Optymalizacja filmów pod kątem wysokiej rozdzielczości YouTube:
  • Ustawiamy rozmiar obrazu na: 640-szerokość, 480-wysokość
    renWin SetSize 640 480
  • Jeśli korzystamy z gradientu tła najlepiej go wyłączyć. Podczas kompresji wideo mogły by się pojawić pasy.
    ren1 SetGradientBackground 0
  • Preferowanymi kodekami są: H.264, MPEG-2 lub MPEG-4. Opisywane uprzednio sposoby generowania filmów korzystają odpowiednio z MPEG-4 (ffmpeg, mencoder) oraz MPEG-2 (vtkMPEG2Writer).

Film przygotowany z użyciem omawianych wyżej technik wizualizacji i tworzenia wideo umieściłem na YouTube:



0 komentarze:

Prześlij komentarz