Как связать ИТК с ВТК? - PullRequest
       47

Как связать ИТК с ВТК?

1 голос
/ 20 декабря 2011

Я читаю серии DICOM, используя itk, и конвертирую их в VTK для визуализации. Хотя мне удается визуализировать серию DICOM в 3 разных окнах с 3 разными ориентациями (XY, XZ и YZ), я даже не могу щелкнуть по окнам. Когда я нажимаю или пытаюсь изменить просматриваемый фрагмент, мой код выдает ошибку нарушения доступа. Я использую 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.

Дополнительно: мой экспортер и импортер указаны ниже:

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

Ответы [ 3 ]

1 голос
/ 23 декабря 2011

Если вы посмотрите на InsightApplications , есть два метода:

  1. То же, что вы пробовали, что здесь или
  2. Это , который создает объект конвейера, который может быть соединен с обеих сторон.Мы на самом деле используем это, и это работает довольно хорошо для нас.Вы можете скопировать этот класс в свой код и использовать его.

Там также есть несколько интересных примеров использования.Посмотрите на них и посмотрите, сможете ли вы что-нибудь изменить в соответствии с вашими требованиями.

1 голос
/ 21 декабря 2011

У меня нет точного ответа на ваш вопрос, но рассматривали ли вы возможность использования одной из распространенных медицинских схем обработки изображений?Есть несколько таких, как MITK ( mitk.org ) или Slicer3D ( slicer.org ).Они отлично работают, связывая воедино ITK, VTK и сложные графические интерфейсы, такие как QT (в случае MITK).

Я долгое время работал в области обработки медицинских изображений и широко использовал MITK.По моему мнению, использование инфраструктуры обработки медицинских изображений действительно помогает вам сосредоточиться на реальных проблемах обработки изображений, а не пытаться создавать конвейеры обработки / визуализации для различных типов визуализаций.

0 голосов
/ 12 января 2015

Классы в модуле ITKVTkGlue могут использоваться для преобразования изображения ITK в конвейер.См. тесты с примерами применения классов.

...