使用 vtkDICOMWriter 编写 DICOM 时访问读取冲突

Access Reading Violation when writing a DICOM with vtkDICOMWriter

本文关键字:访问 读取 冲突 DICOM vtkDICOMWriter 编写 使用      更新时间:2023-10-16

我正在尝试将vtkImageData编写为DICOM。当我尝试编写图像时,我不断收到"访问读取冲突"。

0x00007FFDA30ECA50时未处理的异常:0xC0000005:访问冲突读取位置0x000001BD38D5C000

这是我的代码:

vtkSmartPointer<vtkDICOMWriter> dcmWriter = vtkSmartPointer<vtkDICOMWriter>::New();
dcmWriter->SetInputData(testDat);
dcmWriter->SetFileName(fullPath.toStdString().c_str());
dcmWriter->Update(); // this line breaks
dcmWriter->Write(); 

testDat是一种vtkSmartPointer<vtkImageData>类型,其中包含数据。关于导致错误的原因的任何想法?我在网上找不到类似的东西。

我遵循了这个例子:https://github.com/dgobbi/vtk-dicom/blob/master/Examples/TestDICOMWriter.cxx

我没有元数据,但这应该不是问题。

我需要在这里做一些猜测,因为你没有发布所有代码,但我怀疑问题发生在以下行:

dcmWriter->SetFileName(fullPath.toStdString().c_str());

toStdString()很可能返回一个临时std::string(fullPath看起来像一个Qt QString(,你称之为c_str()。在声明之后,你的临时被摧毁了,你传递给SetFileName的任何内容现在都是一个悬而未决的指针。因此段错误。

请尝试以下操作:

const auto pathString = fullPath.toStdString();
dcmWriter->SetFileName(pathString.c_str());

这应该希望工作正常。即使不是,这肯定是您的代码的问题。

这些行来自您发布的示例:

writer->SetFilePrefix("/tmp");
writer->SetFilePattern("%s/IM-0001-%04.4d.dcm");

而你使用

dcmWriter->SetFileName(fullPath.toStdString().c_str());

似乎vtkDICOMWriter写入了多个文件,因此您可能需要提供文件模式。无论如何,很难猜测为什么它会给出阅读错误,如果您不发布完整的工作示例,也很难提供帮助。

最后,vtkDICOMWriter 不是 vtk 的一个类,它是在 2017 年单独发布的(似乎(。这意味着它不会在每个新版本中针对 VTK 的其余部分进行测试。