如何使用VTK原始保存DICOM系列

How to save a DICOM series raw with VTK

本文关键字:DICOM 系列 保存 原始 何使用 VTK      更新时间:2023-10-16

我正在尝试以原始形式读取并保存DICOM系列。在运行时,程序崩溃并生成以下错误:

DICOMParser无法解析。

这是我的代码:

int main(int argc, char* argv[])
{
    // Verify input arguments
    std::string folder = "C:/dicom decompress/GM_23/2801/0";
    //std::string folder = "C:\VTK\vtkdata-5.8.0\Data\DicomTestImages";
    // Read all the DICOM files in the specified directory.
    vtkSmartPointer<vtkDICOMImageReader> reader =
    vtkSmartPointer<vtkDICOMImageReader>::New();
    reader->SetDirectoryName(folder.c_str());
    reader->Update();
    vtkSmartPointer<vtkImageWriter> writer =  vtkSmartPointer<vtkImageWriter>::New();
    writer->SetInputConnection(reader->GetOutputPort());
    //  writer->SetFilePrefix(folder.c_str());
    writer->SetFilePattern("3d.raw");
    writer->Write();
    writer->Update();
    return EXIT_SUCCESS;
}

可能您的应用程序在该目录中找到了一个不是DICOM的文件(如果您在Mac.上工作,请考虑您的目录也可能包含隐藏文件,如".DS_Store"

我能想到的最好的方法是处理有关文件解析的异常。查看vtkDicomImageReader类,有一个名为CanReadFile的方法,它似乎是该错误的处理程序,抛出以下片段:

  bool canRead = this->Parser->IsDICOMFile();
  if (canRead)
    {
    return 1;
    }
  else
    {
    vtkErrorMacro("DICOMParser couldn't parse : " << fname);
    return 0;
    }

该方法是受保护的,但您可以派生该类并以您喜欢的方式处理异常。

另外,请注意,您也可以使用避开VTK警告窗口

vtkImageData::GlobalWarningDisplayOff();

(至少,最终用户不会看到这一点),但处理异常始终是最重要的事情。

如果这有帮助,请告诉我。