三维数据的结构:
了解Octree原理,了解k-d Tree和的作用:(这两个含义还需要进一步了解)
Kdtree是一种划分k维数据空间的数据结构,在一个K维数据集合上构建一棵Kdtree代表了对该K维数据集合构成的K维空间的一个划分,即树中的每个结点就对应了一个K维的超矩形区域。主要用于多维空间关键数据的搜索。
Octree是一种用于描述三维空间的树状数据结构。八叉树的每个节点表示一个正方体的体积元素,每个节点有八个子节点,将八个子节点所表示的体积元素加在一起就等于父节点的体积。能够很好的压缩点云节省存储空间。
自己思考:最邻近问题:对于点云中的点,怎么去找离它比较近的点?
获取邻域点的两种方法:KNN和RNN
第一种:KNN
我的理解:A是要查找的点,黑色点相当是数据库中的点,图中是找离A色点最近的2个点,显示出来就是图中的红色点。K就是要自定义的数量。
第二种:RNN
以上述黑点A为圆心,以所选值为半径画圆,圆内的点就是所要找的点
空间八叉树结构:
八叉树(四叉树)作为空间对象的一种组织方式,能够根据单位的密集度,对空间进行划分,从而避免查找对象时,循环所有对象。八叉树的原理较为简单:当满足切分条件时,将三维空间等分为8份,分配空间对象。
八叉树近邻搜索:
每个节点包含:
- 自身节点坐标最大值和最小值
- 是否是叶子节点的标志。不是子节点的包含子节点的索引
八叉树近邻搜索:
判断待查询的点是否在树中,在树中的话,找到其所属的子节点
点云的相交、求异:
思路:
1、首先确定 max d
2、遍历待求异点云,寻找最近邻点
3、与最近邻点距离d小于dmax,认为是相同区域的点,将点删除;若大于dmax,则认为是不同点,保留该点
练习:计算点云的平均距离遍历点云,计算最近点的距离并累加平均和
1.单位体积/面积的点数量
2.点云之中点的平均距离
思路:
首先要知道点云密度衡量方式这个知识点(以高程方向为法相方向,单位面积上点云中点的平均数量 )
import open3d as o3d
import numpy as np
#无效值包括空值和无限值。空值一般用NaN表示。
# open3d中对应的剔除函数为remove_non_finite_points。
# 当remove_nan为True时,剔除空值。当remove_infinite为True时表示去除无限值。
pc = o3d.io.read_point_cloud("piano.ply",remove_nan_points=True,remove_infinite_points=True)
# 建立八叉树
k_dTree = o3d.geometry.KDTreeFlann(pc)
#得到点个数
points = np.array(pc.points)
pointNum=points.shape[0]
distSum=0
k=2
#遍历点云
for i in range(0, pointNum):
# k返回点个数
# idx 返回点索引
# dist 返回点距离
[k, idx, dist] = k_dTree.search_knn_vector_3d(pc.points[i],k)
distSum+=dist[1]
distSum/=pointNum
print("点云之间的平均距离是",distSum,"m")
o3d.visualization.draw_geometries([pc],
window_name="Ray",
point_show_normal=False,
width=800, # 窗口宽度,高度
height=600)