一、读入点云
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
>>