我的任务是可视化可以在 DICOM 系列中找到的灰度点云。我找到了本教程https://pyscience.wordpress.com/2014/09/11/surface-extraction-creating-a-mesh-from-pixel-data-using-python-and-vtk/它展示了如何可视化骨骼通过机械化它们以 3D 形式呈现。我可以将它转移到 c# 并且它可以工作,但我只需要一个 3D 点云,我可以通过对灰度进行阈值化来定义对象。希望你明白我的意思。所以我尝试了这个:
// read file
string pathDicom = @"...\dicomDirectory";
vtkDICOMImageReader reader = new Kitware.VTK.vtkDICOMImageReader();
reader.SetDirectoryName(pathDicom);
reader.Update();
// convert HU value
vtkImageShiftScale shiftScale = vtkImageShiftScale.New();
shiftScale.SetScale(reader.GetRescaleSlope());
shiftScale.SetShift(reader.GetRescaleOffset());
shiftScale.SetInputConnection(reader.GetOutputPort());
shiftScale.Update();
// Visualize
vtkPolyDataMapper mapper = vtkPolyDataMapper.New();
mapper.SetInputConnection(shiftScale.GetOutputPort());
vtkActor actor = vtkActor.New();
actor.SetMapper(mapper);
actor.GetProperty().SetPointSize(4);
vtkRenderWindow renderWindow = renderWindowControl1.RenderWindow;
vtkRenderer renderer = renderWindow.GetRenderers().GetFirstRenderer();
renderer.SetBackground(0.2, 0.3, 0.4);
renderer.AddActor(actor);
当我开始这个时,我总是得到同样的错误
vtkStreamingDemandDrivenPipline (09366B85)
和 Visual Studio 告诉我
System.AccessViolationException
这是一种记忆错误。
所以我的问题是我的错误在哪里?在调试过程中,我发现错误是在我为演员设置映射器时开始的。但我现在认为这段代码是在 vtk 中显示所有内容的正常方式。我认为问题在于我并没有真正从数组中得到点,但 imageData 应该包含该系列的所有像素。
希望你能帮助我。