为什么我不能在main中访问imagedata?

时间:2013-04-23 11:02:07

标签: c++ c vtk

我正在尝试编写一个程序来使用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

}

感谢您的关注。

3 个答案:

答案 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中的间距。