来自第三方结构的vtkImageData

时间:2013-12-19 08:45:46

标签: vtk

我在c#内存中存储了一个卷作为切片。切片在内存中可能不连续。我想导入此数据并创建一个vtkImageData对象。

我找到的第一种方法是使用vtkImageImporter,但是这个导入器只接受一个void指针作为数据输入。由于我的切片在内存中可能不连续,因此我无法将单个指针传递给切片数据。

第二个选项是从头创建vtkImageData并使用vtkImageData-> GetScalarPointer()“来获取指向其数据的指针。然后使用循环填充它。这是非常昂贵的(虽然memcpy可以加快速度我也可以将复制方法与vtkImageImport ofcourse结合起来。

这些是我唯一的选择,还是有更好的方法将数据导入vtk对象?我想确保在采用复制方法之前没有其他选择(性能很重),或者修改我的切片的低级存储,使它们在内存中连续存在。

1 个答案:

答案 0 :(得分:2)

我不太熟悉VTK for C#(ActiViz)。在C ++中使用vtkImageData-> GetScalarPointer()并手动复制切片是一种很好的方法。如你所说,它将首先增加存储所有内存的速度,也许你想以更强大的方式(更改数字)来实现它:

vtkImageData * img = vtkImageData::New();
  img->SetExtent(0, 255, 0, 255, 0, 9);
  img->SetSpacing(sx , sy, sz);
  img->SetOrigin(ox, oy, oz);
  img->SetNumberOfScalarComponents(1);
  img->SetScalarTypeToFloat();
  img->AllocateScalars();

然后不要做类似的事情:

  float *  fp = static_cast<float *>(img->GetScalarPointer());

  for ( int i = 0; i < 256* 256* 10; i ++) {
      fp[i] = mydata[i]
  }

另一个更好的选择是根据vtkImageImport中的代码创建自己的vtkImporter。