2011-12-20 95 views
1

我正在閱讀使用itk的DICOM系列,並將它們轉換爲VTK用於可視化目的。即使我設法在3種不同的方向(XY,XZ和YZ)下顯示DICOM系列,我甚至不能點擊窗口。當我點擊或嘗試更改查看的切片時,我的代碼會提供訪問衝突錯誤。我使用ImageViewer2來可視化切片。當我試圖找出錯誤是什麼時,打開一個名爲itkVTKImageExportBase.cxx的文件。線稱爲是:如何將ITK與VTK連接?

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

回答

1

我沒有一個確切的回答你的問題,但你有沒有考慮過使用常見的醫學圖像處理的框架之一?有幾個像MITK(mitk.org)或Slicer3D(slicer.org)。他們將ITK,VTK和QT等複雜的GUI框架(在MITK案例中)連接在一起做得很好。

我在醫學圖像處理方面工作了很長時間,並廣泛使用MITK。在我看來,使用醫學圖像處理框架確實可以幫助您專注於實際的圖像處理問題,而不是嘗試爲不同類型的可視化構建處理/可視化管線。

1

如果你看一下InsightApplications,有兩種方法:

  1. 你嘗試過,這是here,或
  2. This one,其創建的兩面都可以被連接的管道對象是相同的。我們實際上正在使用這個,它對我們來說效果很好。您可以將此類複製到您的代碼中並使用它。

這裏還有一些有趣的用法示例。看看他們,看看你是否可以根據你的需求修改任何東西。

0

ITKVTkGlue模塊中的類可用於將ITK圖像轉換爲流水線。有關這些類如何應用的示例,請參見the tests