文章目录
内容
深度图和点云的数据存储(体像素、八叉树、Kd树、三角剖分)
PLY数据文件格式
深度图和点云的数据存储
3D相机数据的数据存储形式是二维数组,元素值为物体距离像平面距离Z或者视线距离d。
点云数据存储形式是二维数组,但只有三列 ( X , Y , Z ) (X,Y,Z) (X,Y,Z),行存储次序任意。
体像素 - 空间均匀分割
3D数据体像素存储 - 改进:存储
3D数据体像素存储-代码示例
从体像素数组转回点云数据
体像素的应用
1 快速检测空间点是否被占据
将带检测空间点的坐标平移,使得原点盒体像素空间立方体最小坐标顶点对齐。
将坐标除以小立方体边长并进行舍入,得到对应体素在3D数组内的存储位置。
查询数组对应元素即可得到空间是否被占用信息。
2 体像素之间的逻辑运算,实现3D、 形状的组合和编辑
体像素存储的优缺点
运算速度快
存储效率很低,尺寸分辨率和空间相互矛盾
需要很大的空间存储3D数组。
量化的精度越高,划分的体像素的格子越多,存储空间越大。
八叉树 - 空间非均匀按需分割
体像素一使 用空间的均匀分割
八叉树一 对空间非均匀分割(按需分割)
具体讨论8叉树之前,我们先从4叉树说起
●2D数据的4叉树表示
●3D数据的8叉树表示
2D数据 - 4叉树
2D数据的4叉树表示
2D数据的4叉树构建
2D数据的4叉树构建 - 算法 改进
如下图所示的情况,如果使用上面的方法构建4叉树,树会很深,浪费空间。针对这种情况,提出三种改进方式。
4叉树应用 - 快速“碰撞”检测
4叉树构建 - 代码示例
4叉树搜索 - 代码示例
3D数据 - 8叉树
3D数据 - 8叉树 - 表示
3D数据 - 8叉树 - 构建
3D数据 - 8叉树 - 构建 - 改进
1 拆分的停止条件可以改成空间内点的数量小于给定正整数K。
2 拆分的停止条件可以改成节点对应空间立方体边长小于门限。
3 叶节点存放的多个点的坐标数据。
3D数据 - 8叉树 - 应用
快速“碰撞”检测
3D光线追踪
knn搜索
3D数据 - 8叉树 - 代码示例 - Python
3D数据 - 8叉树 - 构建 - 代码示例 - Python
3D数据 - 8叉树 - 查询 - 代码示例 - Python
3D数据 - 8叉树 - 代码示例 - PCL(C++实现,效率高)
Kd树(k-dimensional tree)
从4叉树到kd树
KD树 - 应用 - 实现快速最近邻查找
KD树 - 构建
如何选择分割平面的方向?
分割平面有三个方向可以选择:垂直于x轴,垂直于y轴,垂直于z轴。
树的不同层使用不同的方向,例如:树第一层使用垂直于x轴分割,树第二层使用垂直于y轴分割。
KD树 - 构建 - 2D - 示例
KD树 - 构建 - 3D - 代码示例
KD树 - 搜索 - 最近邻
KD树 - 搜索 - k近邻 - Python
k 近邻与最近邻搜索算法思想相同,只是 k 近邻搜索中,使用优先级队列保存k个近邻。
KD树 - 搜索 - k近邻 - PCL(C++实现,效率更高)
三角剖分
三角剖分 - 应用 - 人脸3D模型
如何将随机点划分为三角形? - Delaunay 三角剖分
Delaunay 三角剖分
准则:1 空圆;2 最大化最小角。
Delaunay 三角剖分 - 局部优化(Local Optimization Procedure,LOP)
Delaunay 三角剖分 - 全局优化算法Bowyer-Watson
Delaunay 三角剖分 - 代码实现 - Python
Delaunay 三角剖分 - 问题
2D平面上的三角剖分用于3D曲面
曲面的局部看成近似平面,将采样点投影到拟合平面上,进行三角划分。
使用近似的方法,从任一局部小三角形出发,不断“蔓延”, 期间用LOP进行局部优化。
空间任意曲面的三角剖分
结合SDF函数的marching Cube算法。
深度图上的简易三角剖分
以深度图平面上的均匀采样格点直接做三角化。
注:顶点间可以拼凑成“米”字形。
PLY数据文件格式
1 用多个平面片(三角形或者四边形)描述空间几何体表面
2 有ASCII和二进制2种格式(这里只介绍ASCII格式)
3 平面片描述拆分为:
1)顶点描述;
2)构成平面片的顶点序号
基本格式内容
头部内容
数据部分
平面的法向量方向:右手法则。平面三个坐标点的顺序即为食指绕行方向。
法向量方向会影响渲染出来3D平面的颜色。如果平面法向量朝内,渲染出的平面颜色不是彩色而是灰色。