2

我必须生成 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 坐标的文件。我必须使用这些坐标生成网格。

4

2 回答 2

2

好吧,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
于 2014-06-18T09:07:13.163 回答
1

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

于 2014-06-18T03:45:15.360 回答