范围3D地图可视化(与vtk?)

时间:2015-09-28 18:15:51

标签: c++ image-processing 3d vtk

我们有一个ZMap(又名深度图)图片,从激光和相机的3D三角测量中获得。我们知道每个像素的深度值和相机的分辨率(每个像素与以mm为单位的3d坐标相关联)。 我们的目标是将Zmap可视化为二维曲面,因此我们考虑创建一个点云,生成网格并使用一些3D库显示它 我们认为vtk可能是正确的选择,但我们遇到了一些问题。

首先我们尝试了无组织结构(vtkPolyData),通过3dDalaunay三角测量生成网格。 但是当点数<1时,代码正常工作。 50K。我们的3D重建由480k点组成,计算时间实际上太高了。

然后我们切换到有组织的(带连接的点)。恕我直言这个附加信息应该减少创建网格的计算时间,但我们无法理解如何创建一个&#34; vtkStructuredGrid&#34;并使用我们的Z值来提供它以获得2D网格表面。

这是正确的方法吗?有没有人从未尝试过这个?

提前致谢

1 个答案:

答案 0 :(得分:0)

如果您的点在2D网格中组织(扫描时),那么您不需要复杂和慢速的三角测量算法

  1. 将点组织成2D表格/网格

    • 这样的事情:
    • point grid
    • 灰色方块是分数
    • 所以点x,y轴与表/网格u,v索引
    • 并行
    • 如果您的数据尚未以这种方式组织,则对点进行排序,以便
    • 存储类似:double pnt[maxU][maxV][3];
    • 如果x,y直接与网格对齐,那么您只需存储Z坐标以节省内存
  2. <强> segmentate

    • 在3D扫描中,像这样组织起来很容易
    • 将所有相邻点连接在一起,Z坐标差小于阈值
    • 我图片中的彩色方块
    • 灰色点是超出范围Z坐标的背景
    • 所以添加如下结构:int obj[maxU][maxV];
    • 将所有背景/超出范围点设置为obj [u] [v] = - 1;
    • 使用(u*maxV+v)
    • 等唯一的obj索引设置其余部分
    • 现在处理每一行,如果附近的点靠近Z坐标,则重新索引其中一个(因此对象正在增长)
    • 完成后处理所有行并尝试合并reindex adjacen objects
    • 循环,直到没有合并为止
    • 这比基于洪水填充的分段更快(如果使用适当的加速结构进行线合并)
  3. <强>三角测量

    • 处理四边形标签
    • 如果所有4个点都属于来自分段的相同对象,则将quad添加到网格
    • 如果只添加三角形(4种组合)
    • 如果1或2不添加任何内容
    • 结果是彩色区域