2013-04-23 91 views
0

我正在嘗試編寫一個程序,通過使用VTK和C++來讀取MRI數據。但我無法獲得主要MRI原始數據的間隔。 「GetSpacing」僅適用於「ReadImageData」函數。我認爲我在C++編程中犯了一些錯誤。但我不知道它在哪裏。爲什麼我無法訪問main中的imagedata?

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

什麼是「間距」,你爲什麼不把它傳遞給'GetSpacing'? [documentation](http://www.vtk.org/doc/nightly/html/classvtkImageData.html#aab194f5cebd12e406fbd9e3c7047ed0f)表明你應該傳遞一個數組或者使用返回值'double *'。 – 2013-04-23 11:08:49

+0

@PeterWood謝謝你提醒我。代碼被修改:) – Yao 2013-04-23 11:37:09

回答

0

假設vtkSmartPointer<vtkMetaImageReader>是一種智能指針什麼的,reader指向的函數在ReadImageData返回時被破壞。這包括metaimage指向的內容。

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

一個好的解決辦法是返回智能指針而不是metaimage。這樣reader指向ReadImageData返回時將不會被破壞,並且可在main中使用。

+0

謝謝。這是解決方案。我返回vtkSmartPointer 閱讀器在函數中。有用!!! – Yao 2013-04-23 11:26:22

+0

@Yao很高興幫助:) – stardust 2013-04-23 11:27:04

0

我的假設是,vtkMetaImageReader::GetOutput()返回指向一些vtkMetaImageReader內部數據,所以當你退出ReadImageDatareader被破壞,返回指針變爲無效。

+0

是的,我認爲你是對的。感謝您的重播 – Yao 2013-04-23 11:28:22

0

看起來您忘記將陣列作爲參數傳遞給,因此它會調用重載返回double*,使陣列保持原樣。

您還正在打印一個名爲spacing的數組,雖然它看起來像是您想要的間距sp2

+0

謝謝。但是當我發佈這個問題時,這是一個複製/粘貼錯誤。 – Yao 2013-04-23 11:20:15

+0

@Yao如果問題中的當前代碼是您實際使用的代碼,那麼您的問題就是我的第二段中描述的問題。 – molbdnilo 2013-04-23 11:22:57

+0

謝謝你提醒我,代碼已修改:) – Yao 2013-04-23 11:34:09

相關問題