0

После построения облака точек я хочу получить нормальное значение для каждой точки, и я использовал встроенную функцию surflorm для функции matlab, но для этого требуется много времени обработки. Поэтому, если бы кто-нибудь мог помочь мне сделать это лучше и эффективнее.Функция surfnorm более эффективный способ Matlab

+0

Как вы определяете нормальный? Это «в центре каждого треугольника»? – Floris

+0

благодарит за комментарии! Я хочу вычислить нормали поверхности, я использую эту серную норму (pcloud (:,:, 1), pcloud (:,:, 2), pcloud (:,:, 3)); но он принимает много времени. Да, я думаю, что если бы я смог получить нормали в центре каждого треугольника, это было бы очень полезно! – Tak

+0

@Floris Мне интересно, если у вас есть предложения, пожалуйста? – Tak

ответ

3

Интересно, поможет ли вам следующий код. Здесь есть три шага.

  1. Создать 500 случайно расположенные точки (х, у), и вычислить соответствующее значение г (высоту поверхности), для которого я выбрал sinc как функции
  2. ресэмплировать случайные точки с использованием функции TriScatteredInterp - это позволяет мне получать точки на сетке с равномерным отображением, которые «грубо соответствуют» исходной поверхности.
  3. Вычислить нормаль к «некоторым точкам» на этой сетке (так как есть 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]); 

И полученный участок:

enter image description here

+0

Спасибо за ваш ответ! Я пробовал это решение, используя значения XY и Z, найденные здесь https://www.dropbox.com/s/lhlqozajn5typy6/XYZ.mat, но проблема в том, что норма не вычисляется для всех точек, а только нормальная ограниченная количество точек показано, так что если вы можете проконсультироваться – Tak

+1

Если вы посмотрите на мой код (и аннотации), я решил вычислить нормальный результат всего на несколько точек (сетка, заданная 'xv' и' yv'), потому что это легче видеть начерченные векторы. Если вы просто сделаете 'xv' и' yv' полностью плотными (например, '1: 479' вместо' 10: 30: 479' и т. Д.), Он должен работать. – Floris

+0

Я обновил его, но его долгое время нарисовал результат. Также нормали не имеют отношения к реальному изображению. Это фактическое изображение трехмерных точек, которые я отправил в своем предыдущем комментарии, я не уверен, почему это происходит. Https://www.dropbox.com/s/9hqk188hoz2xbmx/data.PNG?m – Tak

 Смежные вопросы

  • Нет связанных вопросов^_^