piątek, 16 października 2009

Interaktywne wyświetlanie wartości wskazanego woksela w VTK

Nawet najlepsza wizualizacja danych może okazać się niewystarczająca kiedy potrzebujemy dokładniej zbadać szczegóły na obrazie. Celowy w takiej sytuacji może być powrót do danych pierwotnych i przegląd wartości poszczególnych punktów. Zadanie to oczywiście ma sens tylko wtedy, gdy potrafimy określić gdzie na obrazie znajduje się dany punkt, bo przecież patrząc na plik wypełniony liczbami tego nie widać. Najwygodniej byłoby wskazać konkretny punkt na wizualizacji i otrzymać jego wartość. Przykład jak to zrobić w VTK zostanie opisany w tym poście.

Przykład
Aby zrealizować wyżej postawione zadanie skorzystamy z kontrolki wizualnej vtkPointWidget oraz obiektu graficznego vtkTextActor. Reprezentują one odpowiednio punkt w przestrzeni, którym możemy poruszać oraz tekst wyświetlający zadane informacje na scenie wizualizacji. Oczywiście dla kontrolki punkt powinna zostać przygotowana funkcja obsługi zdarzenia zmiany współrzędnych. W takiej sytuacji następuje pobranie wartości wskazanego woksela i wpisanie jej do obiektu tekst.
vtkPointWidget pointWidget
pointWidget SetInteractor iren
pointWidget SetInput [reader GetOutput]
pointWidget AllOff
pointWidget PlaceWidget
pointWidget AddObserver InteractionEvent pickValueCallback
pointWidget On

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

proc pickValueCallback {} {
set pos [pointWidget GetPosition]
set x [expr int([lindex $pos 0]) ]
set y [expr int([lindex $pos 1]) ]
set z [expr int([lindex $pos 2]) ]
set value [[reader GetOutput] GetScalarComponentAsDouble $x $y $z 0 ]

textActor SetInput "($x, $y, $z): $value"
}

Możliwości przedstawionego przykładu można zobaczyć na poniższym obrazku:


Taki sposób wyświetlania wartości danego piksela jest na pewno zdecydowanie wygodniejszy od przeglądu poszczególnych punktów w pliku lub wypisywaniu ich w linii poleceń.

0 komentarze:

Prześlij komentarz