Я пытаюсь прочитать и сохранить в необработанном виде серии 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, в этом каталоге (учтите, что ваш каталог может также содержать скрытые файлы, например «.DS_Store», если вы работаете на Mac.
Лучший способ, которым я могу придумать, — обработать исключение, касающееся разбора файла.
Глядя на класс vtkDicomImageReader, есть метод, называемый CanReadFile, и кажется, что это обработчик этой ошибки через этот фрагмент:
bool canRead = this->Parser->IsDICOMFile();
if (canRead)
{
return 1;
}
else
{
vtkErrorMacro("DICOMParser couldn't parse : " << fname);
return 0;
}
Метод защищен, но вы можете получить этот класс и обработать исключение так, как вам удобно.
В качестве дополнительного примечания учтите, что вы также можете избежать появления окна предупреждений VTK, используя
vtkImageData :: GlobalWarningDisplayOff ();
(по крайней мере, конечный пользователь не будет это визуализировать), но обработка исключений всегда самая приоритетная вещь.
Позвольте мне знать, если это помогает.
Других решений пока нет …