0

构建点云后,我想获得每个点的法线,我使用了内置的 matlab 函数 surfnorm 但它需要大量的处理时间。因此,如果有人可以帮助我以更好,更有效的方式做到这一点。

4

1 回答 1

3

我想知道以下代码是否会对您有所帮助。这里有三个步骤。

  1. 创建 500 个随机间隔的点 (x,y),并计算一个对应的值 z(表面的高度),我为其选择了一个sinc相似的函数
  2. 使用函数重新采样随机点TriScatteredInterp- 这允许我在均匀采样的网格上获得与初始表面“大致对应”的点
  3. 计算该网格上“某些点”的法线(因为有 480x640 点,计算每个点的法线只会创建一个不可能密集的“向量森林”;通过“每 10 个点”采样,您实际上可以看到自己是什么正在做

我使用的代码如下:

randomX = rand(1,500);
randomY = rand(1,500);
r = 5*sqrt(randomX.^2 + randomY.^2);
randomZ = sin(r) ./ r;

% resample the data:
[xx yy] = meshgrid(linspace(0,1,640), linspace(0,1,480));
F = TriScatteredInterp(randomX(:), randomY(:), randomZ(:));
zz = F(xx, yy);

%% at each point, the normal is cross product of vectors to neighbors
xyz=reshape([xx yy zz],[size(xx) 3]);
xv = 10:30:479; yv = 10:30:639; % points at which to compute normals
dx = xyz(xv, yv+1, :) - xyz(xv, yv, :);
dy = xyz(xv+1, yv, :) - xyz(xv, yv, :);

normVecs = cross(dx, dy); % here we compute the normals.
normVecs = normVecs ./ repmat(sqrt(sum(normVecs.^2, 3)), [1 1 3]);

figure;
quiver3(xx(xv, yv), yy(xv, yv), zz(xv, yv), ...
    normVecs(:,:,1), normVecs(:,:,2), normVecs(:,:,3));
axis equal
view([56 22]);

以及由此产生的情节:

在此处输入图像描述

于 2013-08-05T18:39:39.077 回答