我正在开发基于VTK和GDCM的应用程序,用于查看医疗(DICOM)图像。
该应用程序有三个窗口,分别显示XY,YZ和XZ方向(轴向,冠状和矢状)。这类似于2D视图here。我为此使用了vtkImageViewer2。 DICOM图像的体素值被传递到vtkImageData的实例。 vtkImageData的实例是传递给vtkImageViewer2的三个实例(让我们使用imageViewerXY,imageViewerYZ和imageViewerXZ)。然后使用SetSliceOrientationToXY()
,SetSliceOrientationToYZ()
和SetSliceOrientationToXZ()
设置vtkImageViewer2的每个实例的方向。没有面具,我可以看到切片,耦合窗口并完美地滚动图像。
要添加蒙版以使其显示在三个视图中,我使用vtkImageActor。对于XY视图,这是默认视图,这很好。我更新了vtkImageActor的实例,我根据XY窗口的鼠标事件调用了maskActorXY,如下所示:
int extent[6];
imageViewerXY->GetImageActor->GetDisplayExtent(extent);
maskActorXY->SetDisplayExtent(extent);
maskActorXY->Update();
imageViewerXY->GetRenerer->Render();
现在,当我为其他两个窗口执行相同操作时,我可以在其他两个方向上看到3D蒙版,例如YZ方向,
imageViewerYZ->GetImageActor->GetDisplayExtent(extent);
maskActorYZ->SetDisplayExtent(extent);
maskActorYZ->Update();
imageViewerYZ->GetRenerer->Render();
我收到一条错误消息,该消息跟踪到vtkImageData并访问为掩码actor设置的范围之外的像素值。
我有VTK有限的熟悉程度,但在看source code of vtkImageViewer2(参见UpdateDisplayExtent()
上线341),我不理解为什么像素值超出规定的显示范围的侧面是从请求我的代表掩码的vtkImageActor实例。
答案 0 :(得分:0)
我找到了解决方案。由于我不熟悉VTK,我可能无法提供明确的解释。我需要的只是每个面具的以下两行,以迫使其地图制作者面对相机:
maskActorYZ->GetMapper()->SetAtFocalPointOn();
maskActorYZ->GetMapper()->SliceFacesCameraOn();
(参见[vtkImageMapper3D][1]
class。)