Matlab计算点云法向量和曲率-2021-11-21

  • Post author:
  • Post category:其他


垂直于平面的直线所表示的向量为该平面的法向量。

计算点云法向量,即设定点p属于点云集合pt中的一点,搜索其k邻近个点或者r范围内的点,构成局部平面,计算该平面的法向量。


pcnormals

在MATALB2019B中包含了最邻近点计算法向量的function,用法如下

normals = pcnormals(ptCloud);
normals = pcnormals(ptCloud,k);

k是最邻近点的数量,默认是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

结果如下:

曲率计算-并计算法向量

知网中已有很多文献表明怎么做了,博主直接采用了协方差矩阵进行计算,这里就贴代码了

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

结果如下:

随后只要各位去整理成function就可以方便使用了,博主也不再上传相关资源。


此外,在博主写的双边滤波中,运用到了Reig函数function,该函数是由博主自己写的计算法向量的代码,在本代码块中,将k邻近搜索,换成r邻近搜索,就可以有同样的效果了,双边滤波链接如下:


点云去噪-双边滤波-matlab实现-2021-7-26-_~追风筝的猫的博客-CSDN博客



版权声明:本文为qq_39632121原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。