2013-04-19 3 views
3

Я новичок в ITK, VTK и Qt. Я использую visual studio 9. Я пытаюсь прочитать серию DICOM с ITK и отображать с VTK в QVTKWidget (Qt). Я основывался на этом коде http://www.itk.org/Wiki/VTK/Examples/Cxx/IO/ReadDICOMSeries и меня модифицировал в соответствии с моими потребностями.Как подключить ITK к VTK с помощью C++?

Когда я прочитал серию DICOM с VTK и покажу ее в QVTKWidget, это работает, но когда я хочу прочитать эту серию с ITK и отобразить с VTK в QVTKWidget, программа отображает первое изображение серии и когда я иду следующее изображение с помощью колеса мыши, программа выйдет из строя.

когда я отлажена, я получил эту ошибку:

void VTKImageExportBase::UpdateInformationCallbackFunction(void *userData) 
{ 
static_cast< VTKImageExportBase * > 
(userData)->UpdateInformationCallback();//the error is here 
} 

Я попытался ausssi класс ImageToVTKImageFilter, но с той же проблемой.

вот мой код:

void essaieAppQtVTK::drawDCMSeries(std::string folderDCM) 
{ 
typedef unsigned short PixelType; 
const unsigned int  Dimension = 3; 

typedef itk::Image< PixelType, Dimension >   ImageType; 

typedef itk::VTKImageExport<ImageType> ImageExportType; 
typedef itk::ImageSeriesReader<ImageType>  ReaderType; 
ReaderType::Pointer reader = ReaderType::New(); 
typedef itk::GDCMImageIO  ImageIOType; 
ImageIOType::Pointer dicomIO = ImageIOType::New(); 

reader->SetImageIO(dicomIO); 
typedef itk::GDCMSeriesFileNames NamesGeneratorType; 
NamesGeneratorType::Pointer nameGenerator = NamesGeneratorType::New(); 

nameGenerator->SetUseSeriesDetails(true); 
nameGenerator->AddSeriesRestriction("0008|0021"); 
nameGenerator->SetDirectory(folderDCM); 

typedef std::vector<std::string> SeriesIdContainer;  
const SeriesIdContainer & seriesUID = nameGenerator->GetSeriesUIDs(); 
std::cout << seriesUID.size() << std::endl; 
SeriesIdContainer::const_iterator seriesItr = seriesUID.begin(); 
SeriesIdContainer::const_iterator seriesEnd = seriesUID.end(); 
while(seriesItr != seriesEnd) 
{ 
std::cout << seriesItr->c_str() << std::endl; 
seriesItr++; 
} 
std::string seriesIdentifier; 
seriesIdentifier = seriesUID.begin()->c_str(); 
std::cout << seriesIdentifier.c_str() << std::endl; 

typedef std::vector<std::string> FileNamesContainer; 
FileNamesContainer fileNames; 
fileNames = nameGenerator->GetFileNames(seriesIdentifier); 

reader->SetFileNames(fileNames); 
try 
{ 
reader->Update(); 
} 
catch (itk::ExceptionObject &ex) 
{ 
std::cout << ex << std::endl; 
} 

//------------------------------------------------------------------------ 
// ITK to VTK pipeline connection. 
//------------------------------------------------------------------------ 

// Create the itk::VTKImageExport instance and connect it to the 
// itk::CurvatureFlowImageFilter. 
ImageExportType::Pointer exporter = ImageExportType::New(); 
exporter->SetInput(reader->GetOutput()); 

// Create the vtkImageImport and connect it to the 
// itk::VTKImageExport instance. 
vtkImageImport* importer = vtkImageImport::New(); 
ConnectPipelines(exporter, importer); 

//------------------------------------------------------------------------ 
// VTK pipeline. 
//------------------------------------------------------------------------ 

this->imageViewer= vtkImageViewer2::New(); 
imageViewer->SetInput(importer->GetOutput()); 


// slice status message 
//******same code *****// 

// usage hint message 
//******same code *****// 

// create an interactor with our own style (inherit from vtkInteractorStyleImage) 
// in order to catch mousewheel and key events 
//******same code *****// 

// add slice status message and usage hint message to the renderer 
//******same code *****// 

//to display the result: 
ui.qvtkWidget->SetRenderWindow(imageViewer->GetRenderWindow()); 
ui.qvtkWidget->GetRenderWindow()->GetInteractor()- >SetInteractorStyle(myInteractorStyle); 
imageViewer->Render(); 
ui.qvtkWidget->update(); 
} 

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

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

Может быть, есть ошибка в Pipline между ИТК и ВТК, пожалуйста, пожалуйста, может помогите мне найти решение этой проблемы, я потратил две недели на поиски решения, но все методы потерпели неудачу, возможно, есть другой способ привязать ITK и VTK к классу ImageToVTKImageFilter. Я рассчитываю на вашу помощь. заранее спасибо.

+0

Информация: Я забыл сообщить вам, что я попытался прочитать серию DICOM с ITK и VTK, но без Qt, и он работает очень хорошо, и я использовал тот же код, что и я, проблема, когда я хотел показать серию на QVTKWidget.Пожалуйста, помогите мне! – Clara

+0

Я могу вам сказать, что для всех моих приложений Qt + VTK + ITK (что является большой частью того, что я делаю как исследователь медицинской визуализации) я использую код ItkVTKGlue. Это сработало для меня с 2008 года и довольно много версий ITK, VTK и Qt. – drescherjm

ответ

1

Я столкнулся с такой же ошибкой в ​​той же точке, в которой вы показали внутри пустоты. VTKImageExportBase::UpdateInformationCallbackFunction Функция Я использовал для преобразования. То, что мне не хватало, - это обновление конвейера ITK, прежде чем подключать его к программе просмотра VTK. В ITK to VTK pipeline connection часть ваш код тоже отсутствует такой же предмет. Таким образом, использование:

exporter->SetInput(reader->GetOutput()); 
exporter->Update(); 

затем перейдите далее.

+0

Спасибо за ваш ответ, я нашел решение своей проблемы, на самом деле на самом деле это добавить эту строку кода в конце: 'renderWindowInteractor-> Start();' , но я хотел знать, есть ли разница между ImageToVTKImageFilter и методом, который я использовал (ConnectPipelines)? Спасибо – Clara

+0

Поскольку я проверил код ImageToVTKImageFilter, он использует тот же подход, что и для экспорта itk-изображения, поэтому нет никакой разницы. –