3차원 공간에서의 좌표계 변환을 하기 위해서는 4x4 Matrix를 사용하게 된다. 이를 Transformation 에서는 Homogeneous Transformation 이라고 명칭한다. VTK 에서 vtkHomogeneousTransform과 vtkLinearTransform 을 abstract 클래스로 아래와 같이 정의하고 있다. vtkHomogeneousTransform을 상속한 하위 클래스들은 각 클래스의 명칭에 맞게 그 기능들이 최적화 되어 있다. vtkMatrixToHomogeneousTransform / TestMatrixToLinearTransform - vtkMatrix4x4를 SetInput으로 입력받아 Transform 객체를 생성한다. - 두개의 클래스는 각각의 하위 클래스에 입력..
이전에 설명한 VTK의 이미지 좌표계와 Dicom 이미지 좌표계는 다르다. 여기에서 한가지 더 참고해야 할 것은 Dicom 이미지는 CT나 MRI 와 같은 장비에서 촬영한 영상이다. 이때 Dicom의 Meta data에는 Image Position Patient (0020, 0032) Tag 정보가 있다. 이는 촬영 장비의 원점에서 Dicom 영상의 좌측상단까지의 위치 값을 나타낸다. 각각의 좌표계에서 보는 이미지를 구성하기 위해서는 각 좌표계별 Transformation 을 구해야한다. 명칭 좌표계 원점 CT좌표계 장비의 원점 LPS Dicom 좌표계 이미지의 좌측상단 LPS Vtk 좌표계 이미지의 좌측하단 i : x axis j : -y axis k : z axis 각각의 좌표계로의 변환식을 구한다...
Dicom 데이터를 이용한 vtkImageData를 생성하고 Dicom의 MetaData를 적용하여 ImageData의 origin과 Slice position을 제어하고자 한다. 기본 이미지는 Dicom의 Slice 에 따라서 +Z Direction 으로 이미지를 쌓는다. 또한 vtkImageData 의 좌표계는 이미지의 좌측 하단을 원점으로 하므로 Dicom의 좌표계는 다르다. vtkImageData 좌표계 Dicom 좌표계 LPS vtkImageData -> Dicom 이미지 좌표를 변환하기 위해서는 Flip을 수행한다. var dicomSeriesList = DicomDataUtils.LoadDicomSeries(DirPath); var validSer = dicomSeriesList.First(..
Activiz에서는 WPF의 자체 render control을 지원하지 않기 때문에 winform host 를 이용하여 render control을 주입하는 방식으로 사용하게 됩니다. Winform host를 이용하여 Render control을 생성하고 rendering 하는 것은 쉽습니다. 하지만, 여기에서 주의할 것은 만약에 render control을 갖는 control이 modaless 로 동작하는 경우에는 memory leak을 주의해야 합니다. WPF control을 종료할 때에 메모리 해제를 직접하지 않을 경우에는 해당 render control 이 처리하고 있는 데이터에 대한 메모리가 release 되지 않고 계속 쌓이게 됩니다. 이게 만약 여러번 modaless 로 사용되었을 경우에는 ..
vtkContourFilter - SetValue 또는 GenerateValues 를 통해서 이미지에서 contour 영역을 그릴 곳을 선택해서 contour line을 만들어 낸다. vtkOutlineFilter - 입력된 source 의 extent를 정보를 이용하여 외부 경계선을 찾아낸다. vtkWindowToImageFilter - renderwindow의 render 영상을 vtkImageData로 출력한다 vtkTransformPolyDataFilter - PolyData에 transform 을 수행한다. MergePoints - PolyDataSet 에서 Sphere와 겹쳐지는 영역의 points 의 위치 정보를 빠르게 찾는 알고리즘 ImageConstantPad - Image의 Extent..
vtkStackImage - 이미지를 addImage로 중첩하여 한개의 imageslice로 render 하도록 한다. - 각 imageSlice의 Opacity를 조정하여 한번에 보이도록 할 수 있다. RenderWindow Layer - RenderWindow에서 표시할 layer의 갯수를 지정하고 각 render별로 그리는 layer를 지정하여 actor들을 그리도록 한다. - Layer 0 renderer가 background layer가 되고, 나머지 renderer는 background 색상이 transparent 로 작동한다. vtkImageStencil - stencil 을 이용하여 입력된 이미지에서 그릴 부분을 지정하여 image data를 표시하도록 한다. - port 0 (SetInp..
vtkImageSlice Interpolation 지정하기 vtkImageSlice는 vtkImageActor 와 vtkImageStack으로 자식 클래스를 갖는다. 또한 ImageSlice는 ImageProperty를 갖는데 여기에서 interpolation 을 지정할 수 있다. Interpolation type은 아래와 같이 정의되어 있고 default는 Linear interpolation 이다. #define VTK_NEAREST_INTERPOLATION 0 #define VTK_LINEAR_INTERPOLATION 1 #define VTK_CUBIC_INTERPOLATION 2 Interpolation type 지정하기 imageSlice.GetProperty().SetInterpolationT..
Activiz 의 경우 C++ dll을 wrapping 한 라이브러이다. 그런 이유로 vtk의 object에 대한 property 값을 확인하기 위해서는 일일이 코드로 작성을 하거나 string 값으로 나오는 전체 변수에 대한 문자열을 통해서 확인을 해야 한다. vtkActor를 예로 watch를 하게 되면 객체 정보를 쉽게 확인할 수가 없다. 모두 저 CppThis 의 HandleRef 메모리 접근을 통해서 값을 얻도록 오픈된 함수를 사용해야만한다. 그런 이유로 vtkObject 를 Dugging visualizer 로 볼 수 있도록 구성하였다. 문자열을 Node 로 Parsing 하여 object을 TreeView로 볼 수 있도록 하였다. .NetFramework 의 기준 Visualizer DLL ..
Activiz에서 vtk 의 객체를 사용하면서 GC의 동작을 예상하지 않고 구현을 하게 되면 발생할 수 있는 에러이다. 이전에도 정리한 글이 있었으나, 의도를 제대로 파악하기 쉽지 않은 것 같아서 다시 정리한다. VTK는 command, event 를 기반으로 renderingwindow 를 제어한다. 그런데 renderwindow 의 renderwindowinteractor를 사용하여 이벤트가 발생 할 때에 참조할 vtk 객체가 Garbage collector에 의해서 메모리가 해제가 되버리는 경우에는 아래와 같이 에러가 발생한다. 구현하면서 발생했던 실제 코드를 통해서 분석해보자. 아래는 WPF에서 windowformhost를 이용하여 renderwindow를 생성하고 button 클릭할때 실행되는 ..
이번에는 VTK의 Pipeline Execution에 구조를 분석하고자 합니다. 시작하기에 앞서 VTK에서 visualization 에서 처리하는 데이터 모델 들에 대한 간단한 용어 정리가 필요합니다. 1. 용어 정리 Proecss Object : Process 객체는 입력데이터에 대해 출력 데이터를 생성하는 객체를 말하며, 입출력 구조에 따라 Source, Filter, Mapper object 로 나뉩니다. Source Object : 입력데이터 없이 출력 데이터를 만들도록 처리하는 객체 Filter Object: 한개 이상의 입력데이터를 기반으로 한개 이상의 출력데이터를 만들도록 처리하는 객체 Sink (Mapper) Object: 출력 데이터는 없이 한개 이상의 입력데이터만을 이용하여 처리하는 객..