pcnormals

Оцените нормали для облака точек

Описание

пример

normals = pcnormals(ptCloud) возвращает матрицу, которая хранит нормальное для каждой точки во входе ptCloud. Функция использует шесть соседних точек, чтобы соответствовать локальной плоскости, чтобы определить каждый вектор нормали.

normals = pcnormals(ptCloud,k) дополнительно задает k, число точек используется для локального плоского подбора кривой. Функция использует это значение, а не шесть соседних точек как описано в первом синтаксисе.

Примеры

свернуть все

Загрузите облако точек.

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, функция использует шесть соседних точек, чтобы соответствовать локальной плоскости, чтобы определить каждый вектор нормали.

Выходные аргументы

свернуть все

Нормали, используемые, чтобы соответствовать локальной плоскости, возвратились как M-by-3 или M-by-N-by-3 вектор. Векторы нормали вычисляются локально с помощью шести соседних точек. Направление каждого вектора нормали может быть установлено на основе того, как вы получили точки. Оценочные Нормали примера Облака точек, показывает, как установить направление, когда векторы нормали указывают на датчик.

Ссылки

[1] Hoppe, H., Т. Дероз. Дюшан, Дж. Макдональд и В. Стуецл. "Поверхностная Реконструкция от Неорганизованных Точек". Компьютерная графика (SIGGRAPH 1 992 Продолжения). 1992, стр 71–78.

Расширенные возможности

Генерация кода C/C++
Генерация кода C и C++ с помощью MATLAB® Coder™.

Введенный в R2015b