почему я не могу получить доступ к imagedata в основном?

Я пытаюсь написать программу для чтения данных МРТ с использованием 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

}

Спасибо за Ваше внимание.

0

Решение

Если предположить, vtkSmartPointer<vtkMetaImageReader> что-то вроде умного указателя, reader указывает на в функции разрушается, когда ReadImageData возвращается. Это включает в себя то, что metaimage указывает на.

    return metaimage;
// reader->~();  // Destructed here. Including what is pointed to by metaimage.
}

Хорошим решением было бы вернуть умный указатель вместо metaimage, Таким образом, на что указывает reader не будет разрушен, когда ReadImageData возвращается и будет доступен в основном.

0

Другие решения

Я предполагаю, что vtkMetaImageReader::GetOutput() возвращает указатель на некоторые vtkMetaImageReader внутренние данные, поэтому при выходе ReadImageData ваш reader уничтожается и указатель, который вы возвращаете, становится недействительным.

0

Похоже, вы забыли передать массив в качестве параметра GetSpacing в mainпоэтому он вызывает перегрузку, которая возвращает double*, оставляя ваш массив нетронутым.

Вы также печатаете массив под названием spacing хотя похоже, что вы хотите интервал в sp2,

0
По вопросам рекламы [email protected]