1

我正在使用 itk 阅读 DICOM 系列并将它们转换为 VTK 以进行可视化。即使我设法在具有 3 个不同方向(XY、XZ 和 YZ)的 3 个不同窗口中可视化 DICOM 系列,我什至无法单击窗口。当我单击或尝试更改查看的切片时,我的代码给出了访问冲突错误。我正在使用 ImageViewer2 来可视化切片。当我试图找出错误所在时,打开了一个名为 itkVTKImageExportBase.cxx 的文件。所指的线路是:

void VTKImageExportBase::UpdateInformationCallbackFunction(void* userData)
{
  static_cast<VTKImageExportBase*>
    (userData)->UpdateInformationCallback();
}

我的代码如下:

typedef itk::VTKImageExport< ImageType > ExportFilterType;
    ExportFilterType::Pointer itkExporter = ExportFilterType::New(); 
    itkExporter->SetInput( reader->GetOutput() );


    // Create the vtkImageImport and connect it to the itk::VTKImageExport instance.
    vtkImageImport* vtkImporter = vtkImageImport::New();  
    ConnectPipelines(itkExporter, vtkImporter);


    pViewerXY->SetInput(vtkImporter->GetOutput());
    pViewerXY->SetSlice(3);
    pViewerXY->SetSliceOrientationToXY();
    pViewerXY->SetupInteractor(m_pVTKWindow_1);
    pViewerXY->UpdateDisplayExtent();
    m_pVTKWindow_1->AddObserver(vtkCommand::KeyPressEvent, m_pVTKWindow_1_CallbackCommand);
    m_pVTKWindow_1->Update();

    pViewerXZ->SetInput (vtkImporter->GetOutput());
    pViewerXZ->SetSliceOrientationToXZ();
    pViewerXZ->SetupInteractor(m_pVTKWindow_2);
    pViewerXZ->UpdateDisplayExtent();
    m_pVTKWindow_2->AddObserver(vtkCommand::KeyPressEvent, m_pVTKWindow_2_CallbackCommand);
    m_pVTKWindow_2->Update();

    pViewerYZ->SetInput (vtkImporter->GetOutput());
    pViewerYZ->SetSliceOrientationToYZ();
    pViewerYZ->SetupInteractor(m_pVTKWindow_3);
    pViewerYZ->UpdateDisplayExtent();
    m_pVTKWindow_3->AddObserver(vtkCommand::KeyPressEvent, m_pVTKWindow_3_CallbackCommand);
    m_pVTKWindow_3->Update();

pViewerXX 窗口是 imageviewer2 对象,而 m_pVTKWindow_X 是指在 wxWidgets GUI 包中使用的 wxVTK 对象。

可选:我的出口商和进口商如下:

template <typename ITK_Exporter, typename VTK_Importer>
void ConnectPipelines(ITK_Exporter exporter, VTK_Importer* importer)
{
  importer->SetUpdateInformationCallback(exporter->GetUpdateInformationCallback());
  importer->SetPipelineModifiedCallback(exporter->GetPipelineModifiedCallback());
  importer->SetWholeExtentCallback(exporter->GetWholeExtentCallback());
  importer->SetSpacingCallback(exporter->GetSpacingCallback());
  importer->SetOriginCallback(exporter->GetOriginCallback());
  importer->SetScalarTypeCallback(exporter->GetScalarTypeCallback());
  importer->SetNumberOfComponentsCallback(exporter->GetNumberOfComponentsCallback());
  importer->SetPropagateUpdateExtentCallback(exporter->GetPropagateUpdateExtentCallback());
  importer->SetUpdateDataCallback(exporter->GetUpdateDataCallback());
  importer->SetDataExtentCallback(exporter->GetDataExtentCallback());
  importer->SetBufferPointerCallback(exporter->GetBufferPointerCallback());
  importer->SetCallbackUserData(exporter->GetCallbackUserData());
}
/**
 * This function will connect the given vtkImageExport filter to
 * the given itk::VTKImageImport filter.
 */
template <typename VTK_Exporter, typename ITK_Importer>
void ConnectPipelines(VTK_Exporter* exporter, ITK_Importer importer)
{
  importer->SetUpdateInformationCallback(exporter->GetUpdateInformationCallback());
  importer->SetPipelineModifiedCallback(exporter->GetPipelineModifiedCallback());
  importer->SetWholeExtentCallback(exporter->GetWholeExtentCallback());
  importer->SetSpacingCallback(exporter->GetSpacingCallback());
  importer->SetOriginCallback(exporter->GetOriginCallback());
  importer->SetScalarTypeCallback(exporter->GetScalarTypeCallback());
  importer->SetNumberOfComponentsCallback(exporter->GetNumberOfComponentsCallback());
  importer->SetPropagateUpdateExtentCallback(exporter->GetPropagateUpdateExtentCallback());
  importer->SetUpdateDataCallback(exporter->GetUpdateDataCallback());
  importer->SetDataExtentCallback(exporter->GetDataExtentCallback());
  importer->SetBufferPointerCallback(exporter->GetBufferPointerCallback());
  importer->SetCallbackUserData(exporter->GetCallbackUserData());
}
4

3 回答 3

1

我对您的问题没有确切的答案,但是您是否考虑过使用一种常见的医学图像处理框架?其中有几个,例如 MITK ( mitk.org ) 或 Slicer3D ( slicer.org )。他们在将 ITK、VTK 和复杂的 GUI 框架(如 QT)(在 MITK 案例中)链接在一起方面做得很好。

我在医学图像处理方面工作了很长时间,并广泛使用了 MITK。在我看来,使用医学图像处理框架确实可以帮助您专注于真正的图像处理问题,而不是尝试为不同类型的可视化构建处理/可视化管道。

于 2011-12-21T00:32:30.660 回答
1

如果您查看InsightApplications,有两种方法:

  1. 与您尝试的相同,即here,或
  2. 这个,它创建了一个可以在两侧连接的管道对象。我们实际上正在使用它,它对我们来说效果很好。您可以将此类复制到您的代码中并使用它。

那里也有一些有趣的用法示例。看看它们,看看您是否可以根据您的要求修改任何内容。

于 2011-12-23T08:08:38.927 回答
0

ITKVTkGlue模块中的类可用于将 ITK 图像转换为管道。有关如何应用类的示例,请参阅测试。

于 2015-01-11T22:06:17.743 回答