После построения облака точек я хочу получить нормальное значение для каждой точки, и я использовал встроенную функцию surflorm для функции matlab, но для этого требуется много времени обработки. Поэтому, если бы кто-нибудь мог помочь мне сделать это лучше и эффективнее.Функция surfnorm более эффективный способ Matlab
ответ
Интересно, поможет ли вам следующий код. Здесь есть три шага.
- Создать 500 случайно расположенные точки (х, у), и вычислить соответствующее значение г (высоту поверхности), для которого я выбрал
sinc
как функции - ресэмплировать случайные точки с использованием функции
TriScatteredInterp
- это позволяет мне получать точки на сетке с равномерным отображением, которые «грубо соответствуют» исходной поверхности. - Вычислить нормаль к «некоторым точкам» на этой сетке (так как есть 480x640 точек, вычисление нормали в каждой точке будет просто создавать невероятно плотный «лес векторов», путем выборки «каждый десятый пункт», вы действительно можете видеть, что делаете
код я был следующим:
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]);
И полученный участок:
Спасибо за ваш ответ! Я пробовал это решение, используя значения XY и Z, найденные здесь https://www.dropbox.com/s/lhlqozajn5typy6/XYZ.mat, но проблема в том, что норма не вычисляется для всех точек, а только нормальная ограниченная количество точек показано, так что если вы можете проконсультироваться – Tak
Если вы посмотрите на мой код (и аннотации), я решил вычислить нормальный результат всего на несколько точек (сетка, заданная 'xv' и' yv'), потому что это легче видеть начерченные векторы. Если вы просто сделаете 'xv' и' yv' полностью плотными (например, '1: 479' вместо' 10: 30: 479' и т. Д.), Он должен работать. – Floris
Я обновил его, но его долгое время нарисовал результат. Также нормали не имеют отношения к реальному изображению. Это фактическое изображение трехмерных точек, которые я отправил в своем предыдущем комментарии, я не уверен, почему это происходит. Https://www.dropbox.com/s/9hqk188hoz2xbmx/data.PNG?m – Tak
Как вы определяете нормальный? Это «в центре каждого треугольника»? – Floris
благодарит за комментарии! Я хочу вычислить нормали поверхности, я использую эту серную норму (pcloud (:,:, 1), pcloud (:,:, 2), pcloud (:,:, 3)); но он принимает много времени. Да, я думаю, что если бы я смог получить нормали в центре каждого треугольника, это было бы очень полезно! – Tak
@Floris Мне интересно, если у вас есть предложения, пожалуйста? – Tak