Я пытаюсь написать программу для чтения данных МРТ с использованием VTK и C ++. Но я не могу получить интервал необработанных данных МРТ в основном.
«GetSpacing» работает только в функции «ReadImageData». Я думаю, что допустил ошибку в программировании на C ++. Но я не знаю, где это.
vtkImageData* ReadImageData(string mri_imagedata_file)
{
vtkSmartPointer<vtkMetaImageReader> reader =
vtkSmartPointer<vtkMetaImageReader>::New();
reader->SetFileName(mri_imagedata_file.c_str());
reader->Update();
vtkImageData* metaimage = reader->GetOutput();
double sp[3];
metaimage->GetSpacing(sp);
cout << sp[0] << " " << sp[1] << " " << sp[2] <<endl; //<----------It works here.
return metaimage;
}
int main (int argc, char *argv[])
{
if(argc != 2)
{
cerr << "Usage: " << argv[0] << " MRI image data" <<endl;
return EXIT_FAILURE;
}
string mri_imagedata_file = argv[1];// Input "prost00.mhd"
vtkImageData* metaimage = ReadImageData(mri_imagedata_file);
double sp2[3];
metaimage->GetSpacing(sp2);
cout << sp2[0] << " " << sp2[1] << " " << sp2[2] << endl; //<-----It doesn't work here
}
Спасибо за Ваше внимание.
Если предположить, vtkSmartPointer<vtkMetaImageReader>
что-то вроде умного указателя, reader
указывает на в функции разрушается, когда ReadImageData
возвращается. Это включает в себя то, что metaimage
указывает на.
return metaimage;
// reader->~(); // Destructed here. Including what is pointed to by metaimage.
}
Хорошим решением было бы вернуть умный указатель вместо metaimage
, Таким образом, на что указывает reader
не будет разрушен, когда ReadImageData
возвращается и будет доступен в основном.
Я предполагаю, что vtkMetaImageReader::GetOutput()
возвращает указатель на некоторые vtkMetaImageReader
внутренние данные, поэтому при выходе ReadImageData
ваш reader
уничтожается и указатель, который вы возвращаете, становится недействительным.
Похоже, вы забыли передать массив в качестве параметра GetSpacing
в main
поэтому он вызывает перегрузку, которая возвращает double*
, оставляя ваш массив нетронутым.
Вы также печатаете массив под названием spacing
хотя похоже, что вы хотите интервал в sp2
,