【3D视觉原理】3-3D数据表示与转换

文章目录

  • 内容
  • 深度图和点云的数据存储
    • 体像素 - 空间均匀分割
      • 3D数据体像素存储 - 改进:存储
      • 3D数据体像素存储-代码示例
      • 从体像素数组转回点云数据
      • 体像素的应用
        • 1 快速检测空间点是否被占据
        • 2 体像素之间的逻辑运算,实现3D、 形状的组合和编辑
      • 体像素存储的优缺点
        • 运算速度快
        • 存储效率很低,尺寸分辨率和空间相互矛盾
    • 八叉树 - 空间非均匀按需分割
      • 2D数据 - 4叉树
        • 2D数据的4叉树表示
        • 2D数据的4叉树构建
        • 2D数据的4叉树构建 - 算法 改进
        • 4叉树应用 - 快速“碰撞”检测
        • 4叉树构建 - 代码示例
        • 4叉树搜索 - 代码示例
      • 3D数据 - 8叉树
        • 3D数据 - 8叉树 - 表示
        • 3D数据 - 8叉树 - 构建
        • 3D数据 - 8叉树 - 构建 - 改进
        • 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树 - 构建
        • 如何选择分割平面的方向?
        • KD树 - 构建 - 2D - 示例
        • KD树 - 构建 - 3D - 代码示例
      • KD树 - 搜索 - 最近邻
      • KD树 - 搜索 - k近邻 - Python
      • KD树 - 搜索 - k近邻 - PCL(C++实现,效率更高)
    • 三角剖分
      • 三角剖分 - 应用 - 人脸3D模型
      • 如何将随机点划分为三角形? - Delaunay 三角剖分
      • Delaunay 三角剖分
        • Delaunay 三角剖分 - 局部优化(Local Optimization Procedure,LOP)
        • Delaunay 三角剖分 - 全局优化算法Bowyer-Watson
        • Delaunay 三角剖分 - 代码实现 - Python
        • Delaunay 三角剖分 - 问题
          • 2D平面上的三角剖分用于3D曲面
          • 空间任意曲面的三角剖分
          • 深度图上的简易三角剖分
  • PLY数据文件格式
    • 基本格式内容
      • 头部内容
      • 数据部分
      • PLY数据格式 - 彩色 - 示例
  • 作业

内容

深度图和点云的数据存储(体像素、八叉树、Kd树、三角剖分)
PLY数据文件格式

深度图和点云的数据存储

【3D视觉原理】3-3D数据表示与转换_第1张图片

3D相机数据的数据存储形式是二维数组,元素值为物体距离像平面距离Z或者视线距离d。

点云数据存储形式是二维数组,但只有三列 ( X , Y , Z ) (X,Y,Z) (X,Y,Z),行存储次序任意。

体像素 - 空间均匀分割

【3D视觉原理】3-3D数据表示与转换_第2张图片

3D数据体像素存储 - 改进:存储

【3D视觉原理】3-3D数据表示与转换_第3张图片

3D数据体像素存储-代码示例

【3D视觉原理】3-3D数据表示与转换_第4张图片
【3D视觉原理】3-3D数据表示与转换_第5张图片

从体像素数组转回点云数据

【3D视觉原理】3-3D数据表示与转换_第6张图片

体像素的应用

【3D视觉原理】3-3D数据表示与转换_第7张图片

1 快速检测空间点是否被占据

将带检测空间点的坐标平移,使得原点盒体像素空间立方体最小坐标顶点对齐。

将坐标除以小立方体边长并进行舍入,得到对应体素在3D数组内的存储位置。

查询数组对应元素即可得到空间是否被占用信息。

2 体像素之间的逻辑运算,实现3D、 形状的组合和编辑

体像素存储的优缺点

运算速度快

存储效率很低,尺寸分辨率和空间相互矛盾

需要很大的空间存储3D数组。

量化的精度越高,划分的体像素的格子越多,存储空间越大。

八叉树 - 空间非均匀按需分割

体像素一使 用空间的均匀分割
八叉树一 对空间非均匀分割(按需分割)
具体讨论8叉树之前,我们先从4叉树说起
●2D数据的4叉树表示
●3D数据的8叉树表示

2D数据 - 4叉树

2D数据的4叉树表示

【3D视觉原理】3-3D数据表示与转换_第8张图片
【3D视觉原理】3-3D数据表示与转换_第9张图片

2D数据的4叉树构建

【3D视觉原理】3-3D数据表示与转换_第10张图片

2D数据的4叉树构建 - 算法 改进

如下图所示的情况,如果使用上面的方法构建4叉树,树会很深,浪费空间。针对这种情况,提出三种改进方式。

【3D视觉原理】3-3D数据表示与转换_第11张图片

4叉树应用 - 快速“碰撞”检测

【3D视觉原理】3-3D数据表示与转换_第12张图片

4叉树构建 - 代码示例

【3D视觉原理】3-3D数据表示与转换_第13张图片

4叉树搜索 - 代码示例

【3D视觉原理】3-3D数据表示与转换_第14张图片

3D数据 - 8叉树

3D数据 - 8叉树 - 表示

【3D视觉原理】3-3D数据表示与转换_第15张图片

3D数据 - 8叉树 - 构建

【3D视觉原理】3-3D数据表示与转换_第16张图片

3D数据 - 8叉树 - 构建 - 改进

1 拆分的停止条件可以改成空间内点的数量小于给定正整数K。

2 拆分的停止条件可以改成节点对应空间立方体边长小于门限。

3 叶节点存放的多个点的坐标数据。

3D数据 - 8叉树 - 应用

快速“碰撞”检测
3D光线追踪
knn搜索

【3D视觉原理】3-3D数据表示与转换_第17张图片

3D数据 - 8叉树 - 代码示例 - Python

3D数据 - 8叉树 - 构建 - 代码示例 - Python

【3D视觉原理】3-3D数据表示与转换_第18张图片

3D数据 - 8叉树 - 查询 - 代码示例 - Python

【3D视觉原理】3-3D数据表示与转换_第19张图片

3D数据 - 8叉树 - 代码示例 - PCL(C++实现,效率高)

【3D视觉原理】3-3D数据表示与转换_第20张图片

Kd树(k-dimensional tree)

从4叉树到kd树

【3D视觉原理】3-3D数据表示与转换_第21张图片

KD树 - 应用 - 实现快速最近邻查找

KD树 - 构建

【3D视觉原理】3-3D数据表示与转换_第22张图片

如何选择分割平面的方向?

分割平面有三个方向可以选择:垂直于x轴,垂直于y轴,垂直于z轴。

树的不同层使用不同的方向,例如:树第一层使用垂直于x轴分割,树第二层使用垂直于y轴分割。

KD树 - 构建 - 2D - 示例

【3D视觉原理】3-3D数据表示与转换_第23张图片
【3D视觉原理】3-3D数据表示与转换_第24张图片

KD树 - 构建 - 3D - 代码示例

【3D视觉原理】3-3D数据表示与转换_第25张图片

KD树 - 搜索 - 最近邻

【3D视觉原理】3-3D数据表示与转换_第26张图片
【3D视觉原理】3-3D数据表示与转换_第27张图片

KD树 - 搜索 - k近邻 - Python

k 近邻与最近邻搜索算法思想相同,只是 k 近邻搜索中,使用优先级队列保存k个近邻。

【3D视觉原理】3-3D数据表示与转换_第28张图片

KD树 - 搜索 - k近邻 - PCL(C++实现,效率更高)

【3D视觉原理】3-3D数据表示与转换_第29张图片

三角剖分

【3D视觉原理】3-3D数据表示与转换_第30张图片

三角剖分 - 应用 - 人脸3D模型

【3D视觉原理】3-3D数据表示与转换_第31张图片

如何将随机点划分为三角形? - Delaunay 三角剖分

【3D视觉原理】3-3D数据表示与转换_第32张图片

Delaunay 三角剖分

准则:1 空圆;2 最大化最小角。

【3D视觉原理】3-3D数据表示与转换_第33张图片

Delaunay 三角剖分 - 局部优化(Local Optimization Procedure,LOP)

【3D视觉原理】3-3D数据表示与转换_第34张图片

【3D视觉原理】3-3D数据表示与转换_第35张图片

Delaunay 三角剖分 - 全局优化算法Bowyer-Watson

【3D视觉原理】3-3D数据表示与转换_第36张图片

【3D视觉原理】3-3D数据表示与转换_第37张图片

Delaunay 三角剖分 - 代码实现 - Python

【3D视觉原理】3-3D数据表示与转换_第38张图片

Delaunay 三角剖分 - 问题

2D平面上的三角剖分用于3D曲面

曲面的局部看成近似平面,将采样点投影到拟合平面上,进行三角划分。
使用近似的方法,从任一局部小三角形出发,不断“蔓延”, 期间用LOP进行局部优化。

空间任意曲面的三角剖分

结合SDF函数的marching Cube算法。

深度图上的简易三角剖分

以深度图平面上的均匀采样格点直接做三角化。

【3D视觉原理】3-3D数据表示与转换_第39张图片

注:顶点间可以拼凑成“米”字形。

PLY数据文件格式

1 用多个平面片(三角形或者四边形)描述空间几何体表面

2 有ASCII和二进制2种格式(这里只介绍ASCII格式)

3 平面片描述拆分为:

1)顶点描述;
2)构成平面片的顶点序号

基本格式内容

【3D视觉原理】3-3D数据表示与转换_第40张图片

头部内容

【3D视觉原理】3-3D数据表示与转换_第41张图片

数据部分

【3D视觉原理】3-3D数据表示与转换_第42张图片

平面的法向量方向:右手法则。平面三个坐标点的顺序即为食指绕行方向。

法向量方向会影响渲染出来3D平面的颜色。如果平面法向量朝内,渲染出的平面颜色不是彩色而是灰色。

【3D视觉原理】3-3D数据表示与转换_第43张图片

PLY数据格式 - 彩色 - 示例

【3D视觉原理】3-3D数据表示与转换_第44张图片

作业

【3D视觉原理】3-3D数据表示与转换_第45张图片

【3D视觉原理】3-3D数据表示与转换_第46张图片

你可能感兴趣的:(#,3D视觉基础,3d,人工智能,计算机视觉)