【问题标题】:Access Reading Violation when writing a DICOM with vtkDICOMWriter使用 vtkDICOMWriter 写入 DICOM 时访问读取冲突
【发布时间】:2019-10-15 07:28:46
【问题描述】:

我正在尝试将 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(); 

testDatvtkSmartPointer&lt;vtkImageData&gt; 类型,其中包含数据。关于导致错误的原因有什么想法吗?我在网上找不到类似的东西。

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

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

【问题讨论】:

  • 您是否为相同的数据尝试过不同的写入器?这样你就可以排除testDat的问题。
  • 我尝试了 vtk 的 TIFF 阅读器并使用“”对文件路径进行硬编码。一切都按预期工作。然而,使用 DICOM 编写器的“”对路径进行硬编码不起作用。是的,它是 Qt (QString),我试图将其转换为 const char*。
  • “testDat”从何而来?
  • testDat 是 vtkImageData

标签: c++ qt vtk dicom


【解决方案1】:

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

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

toStdString() 很可能返回一个临时的std::stringfullPath 看起来像一个 Qt QString),您可以在其上调用c_str()。在声明之后,您的临时文件被销毁,您传递给SetFileName 的任何内容现在都是一个悬空指针。因此出现了段错误。

请尝试以下方法::

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

这应该可以正常工作。即使没有,也肯定是您的代码有问题。

【讨论】:

  • 不幸的是,这不起作用。我什至尝试使用“”对路径进行硬编码,但我仍然得到访问冲突读取位置。它在dcmWriter-&gt;Update() 上崩溃,如果我注释掉Update() 行,它将在dcmWriter-&gt;Write() 行上崩溃。
  • 您的编译器是否使用了正确的vtk-dicom 二进制文件?
【解决方案2】:

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

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

你使用

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-14
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    • 2017-02-22
    • 1970-01-01
    • 2015-07-31
    相关资源
    最近更新 更多