4.vtk学习——点云可视化
我帮你把博客内容优化成更易读、逻辑清晰、方便复习学习的版本,同时保留原有的代码示例和思路。以下是优化后的版本:
VTK 点云可视化教程(C# + Halcon)
1. 介绍
前文介绍了 VTK 的基本显示流程(Pipeline)、VTK 数据集概念及组成(如 vtkPolyData)、以及基础着色方法。本文重点展示如何实现点云可视化效果。
注意:点比较稀疏是因为在可视化之前,我对原始点云进行了采样。

2. 实现流程概览
点云可视化的基本流程:
- 读取点云数据(XYZ 坐标)。
- 数据预处理(滤波、采样、归一化等)。
- 构建 VTK 数据集
vtkPolyData并添加颜色属性。 - 创建拓扑结构(点或面)。
- 设置 Mapper 和 Actor,进行可视化显示。
3. 读取点云数据与预处理
这里使用 Halcon 示例,当然也可以用 VTK 的 Reader 或其他 C# 文件读取方式:
读取数据并生成3D对象
// 读取点云坐标
HOperatorSet.ReadTuple(@".\xpoints.dat", out var X);
HOperatorSet.ReadTuple(@".\ypoints.dat", out var Y);
HOperatorSet.ReadTuple(@".\zpoints.dat", out var Z);
// 生成3D对象
HOperatorSet.GenObjectModel3dFromPoints(X, Y, Z, out var WareModel3D);
// 数据采样(提高处理速度 & 降噪)
HOperatorSet.SampleObjectModel3d(WareModel3D, "fast", SamplingFactor * Diameter, new HTuple(), new HTuple(), out var SampledWareModel3D);
4. 获取 XYZ 坐标并归一化
归一化可防止坐标过大或过小,便于 VTK 显示:
获取点坐标 & 构建 vtkPoints
HOperatorSet.GetObjectModel3dParams(SampledWareModel3D, "point_coord_x", out hv_x);
HOperatorSet.GetObjectModel3dParams(SampledWareModel3D, "point_coord_y", out hv_y);
HOperatorSet.GetObjectModel3dParams(SampledWareModel3D, "point_coord_z", out hv_z);
HOperatorSet.GetObjectModel3dParams(SampledWareModel3D, "num_points", out hv_num);
vtkPoints Points = new vtkPoints();
for (int i = 0; i < hv_num; i++)
{
Points.InsertPoint(i, (hv_x[i]-xmin)/(xmax-xmin), (hv_y[i]-ymin)/(ymax-ymin), (hv_z[i]-zmin)/(zmax-zmin));
}
生成颜色属性(根据 Z 值映射)
vtkUnsignedCharArray colors_rgb = new vtkUnsignedCharArray();
colors_rgb.SetNumberOfComponents(3);
double zMax = hv_z.TupleMax();
double zMin = hv_z.TupleMin();
double zMedian = (zMax - zMin) / 2;
for (int i = 0; i < hv_num; i++)
{
double r = 0, g = 0, b = 0;
if (hv_z[i] - zMin > zMedian)
{
r = 255 * ((hv_z[i] - zMin - zMedian) / zMedian);
g = 255 * (1 - ((hv_z[i] - zMin - zMedian) / zMedian));
b = 0;
}
else
{
r = 0;
g = 255 * ((hv_z[i] - zMin) / zMedian);
b = 255 * (1 - ((hv_z[i] - zMin) / zMedian));
}
colors_rgb.InsertNextTuple3(r, g, b);
}
5. 创建 VTK PolyData 与 Mapper
vtkPolyData Model3D = new vtkPolyData();
Model3D.SetPoints(Points);
Model3D.GetPointData().SetScalars(colors_rgb);
vtkPolyDataMapper Model3DMapper = vtkPolyDataMapper.New();
注意: 目前 Model3D 只包含点和颜色属性,还缺少拓扑结构(拓扑数据是 VTK 可视化必需的)。
6. 添加拓扑结构(符号化点)
使用 vtkVertexGlyphFilter 为每个点生成可视化的拓扑数据:
生成拓扑数据 & 可视化
vtkVertexGlyphFilter glyphFilter = vtkVertexGlyphFilter.New();
glyphFilter.SetInput(Model3D); // 为每个点生成图元
Model3DMapper.SetInput(glyphFilter.GetOutput());
vtkActor ModelActor = vtkActor.New();
ModelActor.SetMapper(Model3DMapper);
renderer.AddActor(ModelActor);
// 设置渲染器背景
renderer.SetBackground(0, 0, 0);
renderer.GradientBackgroundOn();
renderer.SetBackground2(0.8, 0.8, 0.8);
// 调整相机 & 刷新显示
ResetCamera(Model3D);
renderWindow.AddRenderer(renderer);
renderWindow.SetAlphaBitPlanes(1);
renderWindow.Render();
VtkPanel.Invalidate();
Application.DoEvents();
// 强制刷新三部曲
renderWindow.Render();
VtkPanel.Invalidate(true);
Application.DoEvents();
7. 总结与扩展
-
该示例实现了点云的基本可视化(稀疏点云 + 颜色映射)。
-
核心流程:
- 读取点云数据 → 生成 3D 对象
- 数据预处理(采样、归一化)
- 构建
vtkPolyData+ 设置颜色 - 生成拓扑结构(
vtkVertexGlyphFilter) - Mapper + Actor 可视化
-
后续可扩展:
- 对 Halcon 三角化后的面进行可视化(仓壁透明效果)。
- 使用法向量或其他属性数据进行高级着色。
- 增加透明度与深度剥离,改善半透明面显示效果。

💡 学习小技巧:
vtkPolyData必须有拓扑结构,否则 Mapper 无法显示。- 透明显示需结合 Actor 的
SetOpacity和 Renderer 的DepthPeeling设置。 - 对大量点云,先采样再显示可以提升性能。
我可以进一步帮你画一张 点云处理 + VTK 可视化流程图,让从 Halcon 到 VTK 的整个流程一目了然,非常适合博客和笔记使用。
你希望我帮你画吗?

浙公网安备 33010602011771号