构建点云后,我想获得每个点的法线,我使用了内置的 matlab 函数 surfnorm 但它需要大量的处理时间。因此,如果有人可以帮助我以更好,更有效的方式做到这一点。
问问题
1685 次
1 回答
3
我想知道以下代码是否会对您有所帮助。这里有三个步骤。
- 创建 500 个随机间隔的点 (x,y),并计算一个对应的值 z(表面的高度),我为其选择了一个
sinc
相似的函数 - 使用函数重新采样随机点
TriScatteredInterp
- 这允许我在均匀采样的网格上获得与初始表面“大致对应”的点 - 计算该网格上“某些点”的法线(因为有 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 回答