0

포인트 클라우드를 구성한 후에 각 포인트의 법선을 얻고 자 할 때 내장 된 matlab 함수 surfnorm을 사용했지만 처리 시간이 많이 걸립니다. 그래서 누군가가 나를 도울 수 있다면 더 좋고 더 효율적인 방법입니다.surfnorm 더 효율적인 방법 Matlab

+0

어떻게 당신이 정상을 정의합니까? 그것은 "모든 삼각형의 중심에 있습니까?" 귀하의 의견에 – Floris

+0

주셔서 감사합니다! 표면의 법선을 계산하고 싶습니다.이 surfnorm (pcloud (:, : 1), pcloud (:, : 2), pcloud (:, : 3))을 사용하고 있습니다. 그러나 그것의 많은 시간을. 예, 저는 모든 삼각형의 중심에서 법선을 얻을 수 있다면 이것이 매우 도움이 될 것이라고 생각합니다! – Tak

+0

@Floris 어떤 제안이 있으시면 궁금합니다. – Tak

답변

3

다음 코드가 도움이 될지 궁금합니다. 여기에는 세 단계가 있습니다.

  1. 500 개 무작위 이격 된 지점 (X, Y)를 생성하고 I 기능
  2. 리샘플링 랜덤 포인트 TriScatteredInterp 함수를 사용하여 같은 sinc을 선택하는 대응하는 z 값 (표면의 높이)를 계산 - 이렇게하면 초기 표면에 "대략 일치"하는 균등하게 샘플링 된 격자의 점을 얻을 수 있습니다.
  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]); 

을 그리고 결과 플롯 :

enter image description here

+0

답변 해 주셔서 감사합니다! 내 XY와 Z 값을 사용하여이 솔루션을 시도했지만 https://www.dropbox.com/s/lhlqozajn5typy6/XYZ.mat에서 발견되었지만 문제는 모든 포인트에 대해 계산되지 않고 제한된 점 수를 표시하면 조언을 해줄 수 있습니다. – Tak

+1

내 코드 (및 주석)를 보면 몇 가지 점 ('xv' 및'yv'가주는 격자)에서 법선을 계산하도록 선택합니다. 플롯 된 벡터를 더 쉽게 볼 수 있습니다. 'xv'와'yv'를 완전히 조밀하게 만들면 (예 :'10 : 30 : 479' 대신에'1 : 479' 등) 제대로 작동 할 것입니다. – Floris

+0

나는 그것을 업데이트했지만 오랜 시간이 걸려서 결과를 그렸다. 또한 법선은 실제 이미지와 관련이 없습니다. 이것은 내가 이전 코멘트에서 보낸 3D 포인트의 실제 이미지입니다. 왜 이런 일이 일어나고 있는지 확실하지 않습니다. https://www.dropbox.com/s/9hqk188hoz2xbmx/data.PNG?m – Tak