【问题标题】:Output of delaunay triangulation from lidar data来自激光雷达数据的 delaunay 三角剖分输出
【发布时间】:2014-08-08 05:01:24
【问题描述】:

我必须生成 3D 点云的网格。所以我使用delaunay 函数来执行点的三角测量。激光雷达数据是人头扫描的结果。

dt = delaunay(X,Y); 
trisurf(dt,X,Y,Z);

当我将delaunay 与两个输入一起使用时,它给了我输出但并不完美。所以我使用了三个输入 (X,Y,Z)

dt = delaunay(X,Y,Z); 
trisurf(dt,X,Y,Z);

但现在结果变得更糟了。不知道是什么问题?


这是我写的完整代码:

load Head_cloud_point.txt; 
data = Head_cloud_point; 

for i = 1 : 3 
    X = data(:, 1); 
end 

for i = 1 : 3 
    Y = data(:, 2); 
end 

for i = 1 : 3 
    Z = data(:, 3); 
end 

[m n] = size(X); 
[o p] = size(Y); 
[r s] = size(Z); 
[XI,YI]= meshgrid(X(m,n),Y(o,p)); 
ZI = interp2(X,Y,Z,XI,YI); 
% dt = delaunay(X,Y); 
% trisurf(dt,X,Y,ZI); 

Head_cloud_point 是具有 X,Y,Z 坐标的文件。我必须使用这些坐标生成网格。

【问题讨论】:

  • 你能提供一些代码吗?可能导致问题的设置?一般来说,这里没有足够的细节。
  • 加载 Head_cloud_point.txt;数据 = Head_cloud_point;对于 i = 1 : 3 X = data(:, 1);结束 i = 1 : 3 Y = data(:, 2);结束 i = 1 : 3 Z = data(:, 3);结束 [m n]= 大小(X); [o p]= 大小(Y); [r s]= 大小(Z); [XI,YI]=网格网格(X(m,n),Y(o,p)); ZI = interp2(X,Y,Z,XI,YI); % dt = delaunay(X,Y); %三冲浪(dt,X,Y,ZI);这是代码。 Head_cloud_point 是具有 X,Y,Z 坐标的文件。我必须使用这个坐标生成网格,所以我使用 delaunay 三角测量方法来接近它们。

标签: matlab plot delaunay lidar


【解决方案1】:

好吧,Delaunay 不会直接在这里做这个伎俩,无论是 2D 还是 3D 版本。主要原因是德劳内的工作方式。你可以得到一些方法,但结果通常不会是完美的。

你还没有指定点云是头部的表面,还是头部的整个内部(尽管另一个答案表明前者)。

首先要记住,Delaunay 将对数据的凸包进行三角剖分,填充任何凹面,例如类似 C 的形状将具有 C 三角的内部(以镜像 D 三角结束)。

假设点云是头部的表面。

在所有 (X,Y) 上使用 2D Delaunay 时,它无法区分头顶和底部/颈部的坐标,因此在生成三角剖分时会混合这些坐标。基本上你不能有相同的(X,Y)坐标的两层皮肤。

避免这种情况的一种方法是将数据拆分为顶部和底部,可能在鼻尖的高度附近,分别对它们进行三角剖分并合并结果。尽管在其他地方也存在类似问题,例如在嘴唇和耳朵周围,这可能会给人带来相当不错的外观。您可能还必须连接两个三角剖分,这有点难以做到。

另一种选择是将 (X,Y,Z) 转换为以头部中心为原点的球坐标 (radius, theta, gamma),然后在 (theta,gamma) 上使用 2D Delaunay。这在耳朵周围可能效果不佳,在同一方向(θ、γ)可能有几层皮肤,Delaunay 将再次混合这些皮肤。此外,在后脑勺(坐标不连续处)会丢失一些连接。但在头脑的其余部分,结果可能很好。 (theta, gamma) 中的 Delaunay 三角剖分不会是 (X,Y,Z) 中的 Delaunay 三角剖分(与每个三角形相关的外接圆可能在其内部包含其他点),但出于可视化目的,它很好。

当使用 (X,Y,Z) 使用 3D Delaunay 时,所有的凹陷都会被填充,尤其是在鼻尖和眼睛周围。在这种情况下,您将需要删除三角矩阵中代表头部“外部”的所有元素/行。手头的数据似乎很难做到这一点。

为了获得完美的结果,您需要另一个工具。尝试搜索类似的内容:

meshing of surface point cloud

【讨论】:

  • 非常感谢。它帮助我实现了我的目标。
【解决方案2】:

由于您拥有表示 3D 表面的原始数据云,因此您需要进行 3D 表面插值以消除噪声。这将确定最适合您的数据的函数 z=f(x,y)。为此,您可以使用 griddata、triscatteredinterp(已弃用)或 interp2。 注意:根据您的问题,我假设您使用 MATLAB。 [编辑] 正如您所指出的,您的数据代表一个头部,头部的表面是一个椭球体,它不是 z=f(x,y) 形式的函数。有关可视化球面的可能解决方案,请参阅这篇文章http://www.mathworks.com/matlabcentral/newsreader/view_thread/2287

【讨论】:

  • 加载 Head_cloud_point.txt;数据 = Head_cloud_point;对于 i = 1 : 3 X = data(:, 1);结束 i = 1 : 3 Y = data(:, 2);结束 i = 1 : 3 Z = data(:, 3);结束 [m n]= 大小(X); [o p]= 大小(Y); [r s]= 大小(Z); [XI,YI]=网格网格(X(m,n),Y(o,p)); ZI = interp2(X,Y,Z,XI,YI); % dt = delaunay(X,Y); % trisurf(dt,X,Y,ZI);
  • @user3745905 请编辑您的问题并在此处发布您的代码,以便我们可以正确地对其进行可视化。也就是说,我假设您的数据代表您想要可视化的 3D 表面。由于原始数据通常很嘈杂,因此按原样绘制可能会导致表面极其不平整。请仔细考虑我的原始答案或重述并澄清您的问题,以便更深入地了解您的数据性质以及您想要实现的目标。
  • 我有一个人头的激光雷达点云,其中包含 X、Y、Z 坐标。我想使用 delaunay 三角剖分方法生成该点云的网格。但是当我使用那个 delaunay(X
  • 查看更新的答案。请从数学而不是编程的角度集中精力解决您面临的问题。只有正确的视角,你才能真正找到正确的解决方案。同样,为了清楚起见,请编辑您的问题并在其中发布您的代码。
  • 请将您发布的其他问题与此问题合并并删除其他问题,以避免重复工作和浪费精力。
猜你喜欢
  • 2011-09-23
  • 2015-01-07
  • 2021-11-23
  • 2016-01-02
  • 2019-04-18
  • 2014-04-02
  • 1970-01-01
  • 2014-08-07
  • 2021-05-14
相关资源
最近更新 更多