Main Content

pcnormals

포인트 클라우드의 법선 추정

설명

예제

normals = pcnormals(ptCloud)는 입력값 ptCloud에 있는 각 점의 법선을 저장하는 행렬을 반환합니다. 이 함수는 6개의 이웃 점을 사용해 국소 평면을 피팅하여 각 법선 벡터를 결정합니다.

normals = pcnormals(ptCloud,k)는 국소 평면 피팅에 사용되는 점의 개수인 k를 추가로 지정합니다. 이 함수는 첫 번째 구문에 설명된 6개의 이웃 점 대신 이 값을 사용합니다.

예제

모두 축소

포인트 클라우드를 불러옵니다.

load('object3d.mat');

법선 벡터를 추정합니다.

normals = pcnormals(ptCloud);

figure
pcshow(ptCloud)
title('Estimated Normals of Point Cloud')
hold on

Figure contains an axes object. The axes object with title Estimated Normals of Point Cloud contains an object of type scatter.

x = ptCloud.Location(1:10:end,1:10:end,1);
y = ptCloud.Location(1:10:end,1:10:end,2);
z = ptCloud.Location(1:10:end,1:10:end,3);
u = normals(1:10:end,1:10:end,1);
v = normals(1:10:end,1:10:end,2);
w = normals(1:10:end,1:10:end,3);

법선 벡터를 플로팅합니다.

quiver3(x,y,z,u,v,w);
hold off

Figure contains an axes object. The axes object with title Estimated Normals of Point Cloud contains 2 objects of type scatter, quiver.

센서 위치를 향하도록 법선을 뒤집습니다. 이 단계는 곡면의 안쪽 또는 바깥쪽 방향을 결정하는 경우에만 필요합니다. 센서 중심은 x, y, z 좌표로 설정됩니다.

sensorCenter = [0,-0.3,0.3]; 
for k = 1 : numel(x)
   p1 = sensorCenter - [x(k),y(k),z(k)];
   p2 = [u(k),v(k),w(k)];
   % Flip the normal vector if it is not pointing towards the sensor.
   angle = atan2(norm(cross(p1,p2)),p1*p2');
   if angle > pi/2 || angle < -pi/2
       u(k) = -u(k);
       v(k) = -v(k);
       w(k) = -w(k);
   end
end

조정된 법선을 플로팅합니다.

figure
pcshow(ptCloud)
title('Adjusted Normals of Point Cloud')
hold on
quiver3(x, y, z, u, v, w);
hold off

Figure contains an axes object. The axes object with title Adjusted Normals of Point Cloud contains 2 objects of type scatter, quiver.

입력 인수

모두 축소

포인트 클라우드를 저장하기 위한 객체로, pointCloud 객체로 반환됩니다.

국소 평면 피팅에 사용되는 점의 개수로, 3보다 크거나 같은 정수로 지정됩니다. 이 값을 늘리면 정확도는 향상되지만 계산 시간이 느려집니다. k를 지정하지 않으면 이 함수는 6개의 이웃 점을 사용해 국소 평면을 피팅하여 각 법선 벡터를 결정합니다.

출력 인수

모두 축소

국소 평면 피팅에 사용된 법선으로, M×3 또는 M×N×3 행렬로 반환됩니다. 법선 벡터는 k 값으로 정의된 이웃 수를 사용하여 국소적으로 계산됩니다. k가 입력값이 아닌 경우 6개의 이웃 점을 사용합니다. 각 법선 벡터의 방향은 점을 얻은 방법에 따라 설정할 수 있습니다. 포인트 클라우드의 법선 추정하기 예제에서는 법선 벡터가 센서를 향할 때 방향을 설정하는 방법을 보여줍니다.

참고 문헌

[1] Hoppe, H., T. DeRose, T. Duchamp, J. Mcdonald, and W. Stuetzle. "Surface Reconstruction from Unorganized Points". Computer Graphics (SIGGRAPH 1992 Proceedings). 1992, pp. 71–78.

확장 기능

C/C++ 코드 생성
MATLAB® Coder™를 사용하여 C 코드나 C++ 코드를 생성할 수 있습니다.

버전 내역

R2015b에 개발됨