1

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はwxWidgetsGUIパッケージで使用するwxVTKオブジェクトを参照します。

オプション:私のエクスポーターとインポーターは以下のとおりです。

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

3 に答える 3

1

InsightApplicationsを見ると、次の 2 つの方法があります。

  1. あなたが試したのと同じ、ここにあります、または
  2. これは、両側で接続できるパイプライン オブジェクトを作成します。私たちは実際にこれを使用しており、非常にうまく機能しています。このクラスをコードにコピーして使用できます。

興味深い使用例もいくつかあります。それらを見て、要件に合わせて何かを変更できるかどうかを確認してください。

于 2011-12-23T08:08:38.927 に答える
1

あなたの質問に対する正確な答えはありませんが、一般的な医用画像処理フレームワークの 1 つを使用することを検討しましたか? MITK ( mitk.org ) や Slicer3D ( slicer.org )のようなものがあります。ITK、VTK、および QT のような洗練された GUI フレームワーク (MITK の場合) をリンクするという素晴らしい仕事をしています。

私は医療画像処理の分野で長い間働いており、MITK を広範囲に使用しています。私の意見では、医用画像処理フレームワークを使用すると、さまざまな種類の視覚化の処理/視覚化パイプラインを構築しようとするのではなく、実際の画像処理の問題に集中するのに本当に役立ちます。

于 2011-12-21T00:32:30.660 に答える
0

ITKVTkGlueモジュールのクラスを使用して、ITK イメージをパイプラインに変換できます。クラスの適用方法の例については、テストを参照してください。

于 2015-01-11T22:06:17.743 に答える