这个文章主要包含对点云的解释,什么是点云密度?以及点云在matlab2019b中如何加载、显示和保存、计算点云密度。
1 什么是逆向工程?
逆向工程,又称为逆向技术,是产品设计技术再现过程,即对目标产物进行逆向分析及研究,得出目标产物的组织结构、功能特性及技术规格等。逆向工程的主要目的是目标成品进行分析,逆向推导产品设计、制作流程。
2 什么是点云?
点云(Point Cloud),在逆向工程中由测量仪器获取物体表面的点的集合。
每个点云的属性主要包含:三维坐标(xyz)、强度信息(intensity)、颜色(RGB)等信息。
点云的格式包含:las、txt、pcd、ply、pts、xyz等多种格式。
3 点云数据的特点
①数据量大:采样频率高,可以在几秒内获取成千上万的点。
②数据分布不均匀:数据点密度随着离扫描仪器的距离增加而下降,且分布离散。
4 如何获取点云?
激光雷达(Light Detection and Ranging,LiDAR),全称激光探测与测距系统,是主动遥感的一种,由传感器向外发射激光,得到传感器与目标物体之间的传播距离,可分析目标地物表面的反射能量大小与反射波普幅度、频率、相位等信息,对目标定位信息进行精确解算,从而得到目标地物的三维结构信息。常见的商用仪器包含:莱卡(Leica)、瑞格(RIEGL)等。———————《激光雷达森林生态应用——理论、方法及实例》
5 可以在什么软件上加载点云?
免费软件:
CloudCompare,又称为CC,下载地址:CloudCompare - Downloads
点云魔方(PCM),微信公众号:PCM与点云处理,可以下载。
可以实现点云加载、显示、保存、栅格化、以及林业、电力线相关方面的技术实现。
商业软件:
Lidar360,Global Mapper等。
6 点云可以用来干什么?
①可以在农林业上做参数提取、生态分析、建模等。
②在建筑建模、片面分割与分析。
③文物、古建筑的建模、修复与保存。
④数字高程模型的建立与地形分析。
⑤公路与道路的测量与扩建。
⑥电力线的巡检。
1 什么是点云密度?
点云密度(Point Cloud Density),是点云的重要属性特征,反应激光点云的空间分布及密集程度,即可以直接反应目标地物的空间分布特点。和遥感影像一样,更多的点(密度高)意味着更高的分辨率,具有更多的信息,较少的点(密度低)意味着信息较少,将会影响信息的提取与处理。
2 点云密度有什么用?
点云密度越大,越可以反应设备的先进性,可以保留更多的地物细节,可以更精确的描述地物的空间特征,这对于地物信息提取、分析具有较大的优势。较少的密度则相反,提取的地物信息可能受损。除此之外,密度过大也意味着数据量很大,也在一定程度上会造成数据冗余,信息冗余,造成数据处理困难等麻烦。
3 计算点云密度
具《GB/T 36100—2018 机载激光雷达点云数据质量评价指标及计算方法-规范》中解读,点云密度为单位面积所具有点的数量,其计算方式如下:
其中ρ 表示点云密度,单位:个/m2;
n为点云总个数;
为第i个水域内点云的个数,单位:个;
A为样地面积,单位:m2;
m为水域个数,单位:个;
为第i个水域面积,单位:m2。
在已知的文献中表明,当点云的密度>3个/平方米,称为高密度,反之则为低密度,<3个/平方米,又称为稀疏型点云数据。————魏金龙,李明阳,赵邑晨,李超,李盈昌.基于稀疏型机载激光雷达数据的风景林参数估测[J].西北林学院学报,2021,36(02):164-171.
matlab自身携带的function库可以打开pcd、ply、txt、csv格式。
1 加载点云与显示点云
clear all
clc
% 清除所有变量
% 清除命令栏所有信息
%% pcd与ply格式数据加载
% 使用函数pcread,这个函数需要matlab较高的版本才有
% 同样可以加载pcd格式
ptCloud = pcread('teapot.ply');
% 加载出来为matlab的pointCloud格式(结构体struct)
% pcshow可以直接显示
pcshow(ptCloud)
% pcshow还有很多显示的用法,可以不断的尝试
% 可以通过.的形式获取到pointCloud的数据
xyz = ptCloud.Location;
% 此时的xyz为n*3格式的数组
% 同样可以采用pcshow显示
pcshow(xyz)
%% txt与csv格式的加载
% txt格式的加载则采用importdata
% 数据的格式可能是n*m,直接使用pcshow会报错
% point = improtdata('点云.txt');
% pcshow(point(:,1:3))
% csv格式采用readtable
% 可能是n*m的形式
% point = readtable('点云');
% 转换数据的格式,由表格的形式转换为数组
% point = table2array(point);
% pcshow(point(:,1:3))
上图即为加载显示的茶壶点云,为matlab的自带数据。
2 其他显示方式
clear all
clc
% scatter3 显示,需要分别读取xyz
ptCloud = pcread('teapot.ply');
% 读取pointCloud结构中的xyz值
xyz = ptCloud.Location;
% 使用scatter3显示
scatter3(xyz(:,1),xyz(:,2),xyz(:,3),'.')
% 锁定坐标轴
axis equal
% plot3也可以做到同样的事情
plot3(xyz(:,1),xyz(:,2),xyz(:,3),'.')
axis equal
3 点云的保存
clear all
clc
% 可以用pcwrite进行保存pcd、ply格式
% save保存txt格式,如果是双精型,则需要添加'-double',详细见帮助文档
% csv格式用writetable
% 这里不在做更多的演示
4 点云密度的计算
通过《GB/T 36100—2018 机载激光雷达点云数据质量评价指标及计算方法-规范》计算。
clear all
clc
% 读取matlab自带的点云文件
ptCloud = pcread('teapot.ply');
% 读取点云xyz值
xyz = ptCloud.Location;
% 凸包计算茶壶的二维占地面积
% 凸包需要双精型,读取的xyz为单精
xyz = double(xyz);
% K返回边界索引,V返回面积
[K,V] = convhull(xyz(:,1),xyz(:,2));
% size和length都可查看点云的数量,这里以size为例
% n和m返回点云的行和列
[n,m] = size(xyz);
% n行就是点云的数量
% 由于无水域区域,所以点云的密度为总数量/面积
p = n/V;
此外还有距离密度,这个即为每个离它最邻近点的距离的平均值
clear all
clc
% 读取matlab自带的点云文件
ptCloud = pcread('teapot.ply');
% 读取点云xyz值
xyz = ptCloud.Location;
% 通过knnsearch即‘k'临近计算xyz集合里面每个点离xyz集合里面的最近点
% 由于第一个搜索的点是他本身,所以k临近个数选择了2
[idx,d] = knnsearch(xyz,xyz,'k',2);
% idx是最邻近点的索引项,用不到;d是每个点离它最邻近点的距离值
% 计算平均距离,即距离密度,单位:m
p = mean(d(:,2));
5 其他备注
las格式matlab也可以加载,但是matlab本身不具有加载的function,需要在github上下载,LASreadAll等。
后续博主将不定时间持续更新,包含点云文献阅读、林业点云数据处理、点云相关知识介绍等。