如何连接ITK和VTK



我正在使用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是指wxVTK对象在wxWidgets GUI包中使用。

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

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());
}

我对你的问题没有确切的答案,但是你考虑过使用常见的医学图像处理框架之一吗?有几个像MITK (mitk.org)或Slicer3D (slicer.org)。他们很好地将ITK、VTK和像QT这样复杂的GUI框架连接在一起(在MITK的情况下)。

我长期从事医学图像处理工作,广泛使用MITK。在我看来,使用医学图像处理框架确实可以帮助您专注于实际的图像处理问题,而不是试图为不同类型的可视化构建处理/可视化管道。

如果你看一下InsightApplications,有两个方法:

  1. 与您尝试的相同,在这里,或
  2. 这个,它创建一个可以在两边连接的管道对象。我们实际上在用这个,而且效果很好。你可以将这个类复制到你的代码中并使用它。

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

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

最新更新