Matlab 点云读取、法向量、曲率、密度

一、读入点云

2021-7-19-点云、点云密度、在matlab中的显示与保存_matlab 点云_~追风筝的猫的博客-CSDN博客

1、读取pcd 文件 

>> uiopen('C:\Users\Albert\Desktop\pcd_image\pcd\Binary.pcd',1)
>> path='C:\Users\Albert\Desktop\pcd_image\pcd\Binary.pcd';
>> rabbit=pcread(path)

rabbit = 

  pointCloud - 属性:

     Location: [35947×3 single]
        Count: 35947
      XLimits: [-0.0947 0.0610]
      YLimits: [0.0330 0.1873]
      ZLimits: [-0.0619 0.0588]
        Color: []
       Normal: []
    Intensity: []

>> pcshow(path)


 // 显示点云
>> xyz=rabbit.Location;   
>> pcshow(xyz)

2、读取txt 文件


%% txt与csv格式的加载
% txt格式的加载则采用importdata
% 数据的格式可能是n*m,直接使用pcshow会报错
% point = improtdata('点云.txt');
% pcshow(point(:,1:3))

3、读取csv 文件

% csv格式采用readtable
% 可能是n*m的形式
% point = readtable('点云');
% 转换数据的格式,由表格的形式转换为数组
% point = table2array(point);
% pcshow(point(:,1:3))

二、计算点云的密度

>> xyz_1=double(xyz_rabbit);
>> %  将单精度的修改为 双精度的
>> [K,V]=convhull(xyz_1(:,1),xyz_1(:,2));%  K 表示的是边界的索引   V返回的是面积
>> [K,V]=convhull(xyz_1(:,1),xyz_1(:,2))%  K 表示的是边界的索引   V返回的是面积

K =

        1172
       10986
       16259
       14561
       14652
       23913
       14990
       15112
       23688
       23638
       14407
       14391
       14408
       14428
       11221
       14455
       14585
       19095
       20069
       22651
       21953
       22048
       12285
       12840
        7438
       23308
       23205
       23107
       32920
       32573
       32574
       32465
       32361
       32362
       32363
       32364
       33260
       32330
       31935
       31936
       31937
       31939
       31940
       32040
       32042
       32044
       32045
       32249
       32250
       11582
       11655
       11735
       11819
       11905
       11988
       12070
       12153
       12407
       12496
       12587
       12677
       12765
       12856
       12949
       13042
       13136
        1623
        1172


V =

    0.0178

>> len=size(xyz_1)

len =

       35947           3

>> size_le=size(xyz_1)

size_le =

       35947           3

>> %  length 和size 是点云的点数
>> [n,m]=size(xyz_1)

n =

       35947


m =

     3

>> % 表示的是点云的个数,m 表示的是维度
>> p=n/V

p =

   2.0180e+06

>> 

三、点云的法向量

原始点云图:

 法向量显示:


>> normals=pcnormals(ball);%计算点云的法向量
>> x=ball.Location(1:5:end,1);
>> y=ball.location(1:5:end,2);
未识别类 'pointCloud' 的方法、属性或字段 'location'。
 
是不是想输入:
>> y=ball.Location(1:5:end,2);
>> z=ball.Location(1:5:end,3);
>> %  normal_x  normal_y  normal_z 为法向量的三列 
>> normal_x=normals(1:5:end,1);
>> normal_y=normals(1:5:end,2);
>> normal_z=normals(1:5:end,3);
>> quiver3(x,y,z,normal_x,normal_y,normal_z)%  显示法向量

计算点云的曲率:

 

>> ptCloud = pcread(path);
>> pcshow(ptCloud)
>> % 读取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
>> 

猜你喜欢

转载自blog.csdn.net/weixin_39354845/article/details/130400426