我现在正在使用带有vtk的c ++建立一个医学注释系统。
我想在3d vtkimagedata的切片(轴向,冠状,矢状)上绘制线条或绘画,并连续保存3d vtkimagedata的绘制图像。 所以我打算制作一个新的空(用零填充)但具有与原始vtkimagedata相同的属性。
有没有人知道如何只将vtkimagedata的结构复制到另一个?
提前谢谢!
答案 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()
函数。