仅将vtkImageData的结构复制到另一个用零填充的vtkImageData

时间:2018-02-06 08:01:32

标签: c++ vtk

我现在正在使用带有vtk的c ++建立一个医学注释系统。

我想在3d vtkimagedata的切片(轴向,冠状,矢状)上绘制线条或绘画,并连续保存3d vtkimagedata的绘制图像。 所以我打算制作一个新的空(用零填充)但具有与原始vtkimagedata相同的属性。

有没有人知道如何只将vtkimagedata的结构复制到另一个?

提前谢谢!

1 个答案:

答案 0 :(得分:1)

您可以使用ShallowCopy()DeepCopy()函数复制vtkDataSet对象的属性,但如果您只对给定vtkImageData对象的几何结构感兴趣,我认为你可以这样做:

// copy attributes from a to b (assuming access to a by address)
vtkSmartPointer<vtkImageData> b = vtkSmartPointer<vtkImageData>::New();
b->SetOrigin(a->GetOrigin());
b->SetSpacing(a->GetSpacing());
b->SetExtent(a->GetExtent());

然后您可以添加一个新字段(在以下示例中与点相关联)。 随意修改类型和名称以满足您的需求:

// allocate memory for a new scalar field
vtkIdType numberOfPoints = b->GetNumberOfPoints();
vtkSmartPointer<vtkCharArray> f = vtkSmartPointer<vtkCharArray>::New();
f->SetNumberOfComponents(1);
f->SetNumberOfTuples(numberOfPoints);
f->SetName("NewScalarFieldName");

// fill the array with zeros
char *arr = static_cast<char*>(f->GetVoidPointer(0));
std::fill(arr, arr + numberOfPoints, 0);

// add the field to the data set
b->GetPointData()->AddArray(f);

在这里,我使用static_cast来访问原始数据并对其进行修改而不会产生太多开销,但您也可以使用SetTuple()函数。