2011-12-20 25 views
1

私はitkを使ってDICOMシリーズを読んでおり、可視化のためにVTKに変換しています。 3つの異なる方向(XY、XZ、YZ)の3つの異なるウィンドウでDICOMシリーズを視覚化することはできますが、ウィンドウをクリックすることはできません。クリックするか、表示されたスライスを変更しようとすると、私のコードはアクセス違反エラーを起こします。 ImageViewer2を使ってスライスを視覚化しています。エラーの内容を調べようとすると、itkVTKImageExportBase.cxxというファイルが開きます。ラインが参照される以下のようITKとVTKの接続方法は?

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

私のコードは次のとおりm_pVTKWindow_XはwxWidgetsのGUIパッケージで使用するwxVTKオブジェクトを指し、一方

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オブジェクトです。

オプション:下記の通り私の輸出国と輸入者は、次のとおりです。

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

私はあなたの質問に正確な答えを持っていませんが、一般的な医用画像処理フレームワークの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を参照してください。

関連する問題