我正在尝试编写一个程序来使用VTK和C ++读取MRI数据。但是我不能在主要部分获得MRI原始数据的间距。 “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 :(得分:0)
我的假设是vtkMetaImageReader::GetOutput()
返回指向某些vtkMetaImageReader
内部数据的指针,因此当您退出ReadImageData
时,您的reader
将被销毁,并且您返回的指针将变为无效。< / p>
答案 1 :(得分:0)
假设vtkSmartPointer<vtkMetaImageReader>
是一种智能指针,当reader
返回时,函数中的ReadImageData
指向被破坏。这包括metaimage
指向的内容。
return metaimage;
// reader->~(); // Destructed here. Including what is pointed to by metaimage.
}
一个好的解决方案是返回智能指针而不是metaimage
。这样,当reader
返回时,ReadImageData
所指向的内容将不会被破坏,并且将在主要版本中可用。
答案 2 :(得分:0)
您似乎忘记将数组作为参数传递给GetSpacing
中的main
,因此它会调用返回double*
的重载,从而使您的数组保持不变。
您还打印了一个名为spacing
的数组,尽管看起来您想要sp2
中的间距。