Función detallada de la función matlab pcnormals()

Explicación oficial: 

pcnormals - Estimar normales para nube de puntos
    Esta función de MATLAB devuelve una matriz que almacena una normal para cada
    punto en la entrada ptCloud.

    normales = pcnormals(ptCloud)
    normales = pcnormals(ptCloud,k)

    输入参数
        ptCloud: objeto para almacenar la nube de puntos
            pointCloud object
        k: número de puntos utilizados para el ajuste del plano local
            entero mayor o igual a 3

    输出参数
        normals - Normales utilizadas para adaptarse a un plano local
            M-by-3 | M-por-N-por-3

traducir:

Estimar normales de nubes de puntos
Esta función de MATLAB devuelve una matriz que almacena las normales para cada punto en el ptCloud de entrada.

normal = pcnormals(ptCloud)
normales = pcnormals(ptCloud,k)

Parámetro de entrada
ptCloud: el objeto que almacena la nube de puntos
pointCloud object
k: el número de puntos utilizados para el ajuste del plano local, un
número entero mayor o igual a 3

Parámetros de salida
normal: la normal utilizada para ajustarse al plano local
m × 3 | m × n × 3

k es el número de vecinos más cercanos, el valor predeterminado es 8.

clear
% 加载茶壶的点云
ptCloud = pcread('teapot.ply');
% 计算法向量,6个邻近点
normals = pcnormals(ptCloud);
% 读取x
x = ptCloud.Location(1:5:end,1);
% 读取y
y = ptCloud.Location(1:5:end,2);
% 读取z
z = ptCloud.Location(1:5:end,3);
% uvw为法向量的三列
u = normals(1:5:end,1);
v = normals(1:5:end,2);
w = normals(1:5:end,3);
pcshow(ptCloud)
hold on
% 显示法向量
quiver3(x,y,z,u,v,w);
hold off

 

Cálculo de curvatura: y calcule el vector normal directamente utilizando la matriz de covarianza para el cálculo

clear
% 读取茶壶点云
ptCloud = pcread('teapot.ply');
% 读取xyz
a = ptCloud.Location;
%vec储存法向量
vec = zeros(size(a));
%q储存曲率
q = zeros(length(a),1);
 
k = 8;
% 搜索每个点的最邻近点
neighbors = knnsearch(a(:,1:3),a(:,1:3), 'k', k+1);
for i = 1:length(a)
    curtemp = neighbors(i,2:end);
    indpoint = a(curtemp,:);
    % 计算协方差并提取特征
    [v, c] = eig(cov(indpoint));
    %特征值按照升序排列1<2<3
    c = diag(c)';
    %计算特征值的总和
    z = sum(c);
    %计算曲率,用最小特征值除/特征值总和,这也是特征归一化
    p1 = c(:,1)/z;
    q(i,:) = abs(p1);
    %最小特征值对应的列向量就是法向量,dot是交叉相乘
    vec(i,:) = v(:,1)';
end
 
% 读取x
x = ptCloud.Location(1:5:end,1);
% 读取y
y = ptCloud.Location(1:5:end,2);
% 读取z
z = ptCloud.Location(1:5:end,3);
% uvw为法向量的三列
u = vec(1:5:end,1);
v = vec(1:5:end,2);
w = vec(1:5:end,3);
pcshow(ptCloud)
hold on
% 显示法向量
quiver3(x,y,z,u,v,w);
hold off

 

Supongo que te gusta

Origin blog.csdn.net/Vertira/article/details/131832876
Recomendado
Clasificación