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

36 篇文章 6 订阅

一、读入点云

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
>> 

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Matlab可以通过以下步骤求点云平均曲率: 1. 对点云数据进行泊松采样,以减少点数并保证采样的均匀性。 2. 使用 Delaunay 三角剖分将点云数据分成多个三角形,从而得到点云表面的几何信息。 3. 对于每个三角形,计算出其顶点的向量,从而得到整个点云表面的向量。 4. 使用向量和三角形面积计算点云表面的曲率。 5. 对每个点的曲率取平均值,从而得到点云平均曲率。 更详细的实现过程可以参考相关学术论文和代码实现。 ### 回答2: 要使用Matlab点云的平均曲率,首先需要点云数据并进行预处理。 第一步是导入点云数据。可以使用Matlab点云处理工具箱或第三方库(如PCL)来读取点云文件,并将其存储为一个点云对象。 接下来,进行点云的预处理。这包括对点云进行滤波(例如将离群点去除)和表面重建(例如将有噪声的点云转换为光滑的曲面表示)等操作。这些预处理步骤可根据具体需求进行调整。 一旦完成了点云的预处理,就可以计算点云的平均曲率了。 Matlab提供了计算曲率的函数,可以根据点云的几何特征计算每个点的曲率。常用的函数包括`pcnormals`、`pcvariance`和`pcfitplane`等。 首先,可以使用`pcnormals`函数计算点云向量。通过指定计算向量时使用的邻域大小,可以控制计算精度。 接下来,可以使用`pcvariance`函数计算点云的主曲率和主曲率方向。主曲率是曲面上最大和最小曲率的特征,而主曲率方向则是对应于主曲率向量。 最后,可以使用`pcfitplane`函数计算每个点的曲率。该函数利用最小二乘拟合局部平面,然后基于该平面的特征值计算曲率。具体而言,曲率值等于特征值之和的一半。 求得每个点的曲率后,可以将所有点的曲率并除以点的数量,得到平均曲率。 需要注意的是,点云的平均曲率是一个全局的特征,可能会受到点云密度和采样密度的影响。因此,在计算平均曲率时需要结合具体应用场景进行调整和分析。 ### 回答3: MATLAB中计算点云平均曲率可以使用曲率估计函数来实现。下面是一个简单的步骤来求解点云的平均曲率。 首先,将点云导入MATLAB中。可以使用`pcread`函数读取点云数据。假设点云存储在一个名为`ptCloud`的pcd文件中,可以使用以下命令读取点云数据: ```matlab ptCloud = pcread('ptCloud.pcd'); ``` 接下来,使用`pcnormals`函数计算每个点的向量。这将返回一个与点云大小相等的向量矩阵。 ```matlab normals = pcnormals(ptCloud); ``` 然后,使用`pccurvature`函数计算每个点的曲率值。同样,这将返回一个与点云大小相等的曲率矩阵。 ```matlab curvatures = pccurvature(ptCloud); ``` 最后,计算点云的平均曲率。可以使用`mean`函数对曲率矩阵进行求平均操作。 ```matlab average_curvature = mean(curvatures); ``` 以上就是使用MATLAB求解点云平均曲率的简单步骤。需要注意的是,这些函数在计算大型的点云时可能会较慢,可以考虑对点云进行下采样或者使用并行计算来提高计算效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值