【问题标题】:C++ VTK initialize volume using pointerC ++ VTK使用指针初始化卷
【发布时间】:2021-12-11 20:25:19
【问题描述】:

我有一个大小为NX x NY x NZ x NC 的体积,其中NC = 3 是通道数,即体素的颜色。

应使用 C++ 中的 VTK 可视化卷。但是,如果数据已经存储在内存中而没有使用 4D 嵌套循环执行深度复制,我不知道如何在 VTK 中初始化卷。

应将以下代码视为伪代码,以了解所需的结果。

unsigned int NX = 100, NY = 100, NZ = 100, NC = 3;
float *volPtr = (float *)malloc(sizeof(float) * NX * NY * NZ * NC); // pointer to raw data

vtkNew<vtkVolume> vol;  // or vtkNew<vtkStructuredGrid> vol;

// vol.setPointer(volPtr); // <- I need to find a way to do this

// EDIT: This makes arr point to volPtr without copying it.
//       Maybe the vtkFloatArray can be converted to a volume.
vtkNew<vtkFloatArray> arr;
arr->SetArray(volPtr, NX * NY * NZ * NC, 1);

while (true) {
    generate_data(volPtr); // dummy function to generate new data and write it to vol

    // The VTK object 'vol' should now contain the new data as it points to volPtr

    // Visualize the volume
    // ...
}

【问题讨论】:

  • 对于未来的参考,类似的问题here

标签: c++ pointers vtk


【解决方案1】:

您应该创建一个尺寸为[NX+1, NY+1, NY+1]vtkImageData(它是每个方向的点数,因此比体素多1)

然后创建你的浮点数组。指定

arr->SetNumberOfComponents(3)

因为每个体素都是 3 个值的元组。还要指定一个名称。

接下来,将其作为CellData 添加到您的图像数据中:

image->GetCellData()->AddArray(arr)

最后,您可以可视化您的图像,例如使用volume rendering

编辑

关于VTK数据结构

在 VTK 中,数据总是附加到网格上。网格是由单元链接的点列表。 vtkImageData 是一个结构化的规则网格,因此点和单元格是隐含的:您只需要提供维度来创建它。点是由坐标定义的数学点。体素是……体素:由 8 个点定义的立方体。

数据数组,因为vtkFloatData 是将值与每个点或单元格关联的方式。在您的情况下,每个体素都有 3 个组件(R、G 和 B),因此在内存中您应该有 R0 G0 B0 R1 G1 B1 ... Rn Gn Bn

幅度

如果您想要每个体素的幅度,您应该计算它(并将其添加到另一个vtkFloatArray)。

【讨论】:

  • 为什么我必须使用大小为[NX+1, NY+1, NZ+1]vtkImageData 实例?点和体素的区别在哪里?此外,对于一个包含三个分量的数组,我假设每个元素都应包含相应的 x、y 和 z 分量。但是额外的元素呢?那我该如何指定幅度呢?
  • 嗯,最多的就是对VTK数据结构的理解了。对于量级,它只是另一个需要计算和添加的数据。我已经更新了我的答案
猜你喜欢
  • 2011-04-10
  • 1970-01-01
  • 2016-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多