2011-12-20 1 views
1

Je suis en train de lire des séries DICOM en utilisant itk et de les convertir en VTK à des fins de visualisation. Même si je parviens à visualiser la série DICOM dans 3 fenêtres différentes avec 3 orientations différentes (XY, XZ et YZ) je ne peux même pas cliquer sur les fenêtres. Lorsque je clique ou que j'essaie de changer la tranche visualisée, mon code donne une erreur de violation d'accès. J'utilise ImageViewer2 pour visualiser les tranches. Un fichier appelé itkVTKImageExportBase.cxx est ouvert lorsque j'essaie de savoir quelle est l'erreur. Les lignes visées sont:Comment connecter ITK avec VTK?

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

Mon code est le suivant:

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

fenêtres pViewerXX sont des objets imageviewer2 alors que m_pVTKWindow_X fait référence à des objets wxVTK à utiliser dans le package GUI wxWidgets.

En option: Mon exportateur et l'importateur sont indiquées ci-dessous:

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

Répondre

1

Je n'ai pas une réponse exacte à votre question, mais avez-vous envisagé d'utiliser l'un des cadres de traitement d'images médicales communes? Il y en a quelques-uns comme MITK (mitk.org) ou Slicer3D (slicer.org). Ils font un excellent travail de liaison entre ITK, VTK et un framework GUI sophistiqué comme QT (dans le cas de MITK). J'ai travaillé longtemps dans le traitement d'images médicales et j'ai beaucoup utilisé MITK. À mon avis, l'utilisation d'un cadre de traitement d'images médicales vous aide vraiment à vous concentrer sur vos problèmes réels de traitement d'image, plutôt que d'essayer de construire des pipelines de traitement/visualisation pour différents types de visualisations.

1

Si vous regardez InsightApplications, il y a deux méthodes:

  1. La même chose que vous avez essayé, qui est here ou
  2. This one, ce qui crée un objet de pipeline qui peut être relié des deux côtés. Nous utilisons actuellement cela, et cela fonctionne très bien pour nous. Vous pouvez copier cette classe dans votre code et l'utiliser.

Il existe également des exemples d'utilisation intéressants. Jetez un coup d'oeil à eux et voyez si vous pouvez modifier n'importe quoi pour votre condition.

0

Les classes du module ITKVTkGlue peuvent être utilisées pour convertir une image ITK en pipeline. Voir the tests pour des exemples de la façon dont les classes sont appliquées.