利用matlab处理点云
本文主要分享利用matlab点云工具的相关模块来处理点云,并通过点云轮廓对点云体积进行简单的估计测量。
目录
1.主要的操作流程图
2、具体流程
2.1 点云的读入和显示
假设有一个名为pointcloud.ply的点云文件。——ply格式简介
pc = pcread(\'path\pointcloud.ply\'); %读入点云文件
pcshow(pc) %显示点云
这里需要注意.ply文件中头文件类似这样的格式:
element vertex 12
property float x
property float y
property float z
property uchar blue
property uchar green
property uchar red
其中x,y,x是三维点云的空间坐标,后面的b,g,r代表每个点的颜色,后一项目对于纹理映射和显示很重要,可以分别提取出来,随后用pcshow来显示;
pcread读入的文件后生成
Location: [850554×3 single]
Color: [850554×3 uint8]
Normal: [850554×3 single]
Count: 850554
XLimits: [6.5701 15.5542]
YLimits: [-1.5363 4.2114]
ZLimits: [-15.7035 0.2691]
我们可以提取出其中的位置和颜色来进行纹理映射并画图
figure(1)
pc_tmp(:,1) = pc.Location(:,3); %调整点云的方位的和xyz轴
pc_tmp(:,2) = pc.Location(:,1);
pc_tmp(:,3) = pc.Location(:,2);
pc_col = pc.Color
pcshow(pc_tmp,pc.Color)
这里利用CMVS/PMVS方法生成的点云数据作为例子:
2.2 点云的处理
为了求得这一建筑物的体积,通过获得这一建筑物的轮廓包络来得到其体积。主要利用matlab中的alphaShape函数和volum
alphaShape
此函数主要用于从离散的三维空间点云中提取边缘并建立对应的包络:
shp = alphaShape(x,y,z)
主要控制参数有alpha值,用于控制生产轮廓的精细程度(越小越细腻)
‘RegionThreshold’ 忽略生成包络中的小物体,压制小物体的阈值体积
‘HoleThreshold’ 填充包络中的空洞,生成完整的体积形态
- *alphaShape(x,y,z,alpha,’HoleThreshold ‘,xx,’RegionThreshold’,xx)
需要注意的是需要将点云的位置坐标转换为双精度的类型。
x=pc.Location(:,3);y=pc.Location(:,1);z=pc.Location(:,2);%get point out
x = double(x); y=double(y); z= double(z);
%获取点云坐标
alp = 5;region = 0.75;%hole = 1; region = 0.75;
shp = alphaShape(x,y,z,alp);
%生产点云的包络数据
%ref:http://cn.mathworks.com/help/matlab/ref/alphashape.html
plot(shp)
%显示点云包络
v= volume(shp);
title([\'v= \'num2str(v) ,\'m3\']) %计算体积并显示
上图为生成的点云包络(需要仔细条件参数以生成符合需求精度的包络),通过volum可计算此包络所占粗略的体积。