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 czerwonegoJak to działa w praktyce zostanie pokazane w następnych sekcjach.
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
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 StartPo 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.
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
}
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 mencoderPrzykład użycia ffmpeg:
ffmpeg -sameq -y -r 10 -i animate-change_iso_contour%04d.png -r 24 ff_out.mpgPrzykład użycia mencoder:
mencoder "mf://*.png" -mf fps=10 -o men_out.mpg -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=2000W 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.
- W dziale Download na stronie VTK, szukamy sekcji "Download additional components",
- Pobieramy plik vtkmpeg2encode.tar.gz i rozpakowujemy go do dowolnego katalogu.
- Tworzymy katalog build, przechodzimy do niego i uruchamiamy kompilację:
mkdir build && cd build && cmake ../ && make
- 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 - Kompilujemy VTK.
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