🥭Python三维体素化网格和点云计算

Python | 三维(3D) | 体素化 | 网格 | 点云 | 算法 | RGB-D图像 | 数据可视化 | 过滤 | scikit-learn | 聚类

🏈page指点迷津 | Brief

要点

  1. Python三维点云自动生成 3D 网格和表面重建,创建多个细节层次

  2. Python使用4种工具体素化网格,创建点云数据可视化

  3. Python计算RGB-D 图像的点云,点云地面检测算法,过滤点云以便下采样和去除异常值,scikit-learn聚类点云数据

  4. Python点云和网格计算更多示例:使用泊松盘采样在网格上生成蓝噪声样本,对体素网格上的点云进行下采样,从点云估计法线,计算每个顶点的网格法线

三维点云

点云是三维坐标系中的一组数据点。 这些点在空间上由 X、Y、Z​ 坐标定义,通常表示对象的包络线。 现实捕捉设备获取三个维度的外表面以生成点云。 这些通常是通过摄影测量、LiDAR、深度传感以及最近通过生成对抗网络进行的深度学习获得的。

每种技术都有一些影响数据质量和完整性的特殊性,您已经可以看到完整 360° 捕获与传统航空 LiDAR 采集之间的差异。

点云提供简单而高效的 3D 数据表示,我在下面总结了它们的主要操作、优点和缺点。

主要操作

  • 变换:您可以将点列表中的点与线性变换矩阵相乘

  • 组合:可以通过将点列表合并在一起来组合“对象”

  • 渲染:将点投影并绘制到图像平面上

优点

  • 快速渲染

  • 精确表示

  • 快速变换

缺点

  • 众多点(目标曲线,精确表示)

  • 内存消耗高

  • 有限的组合操作

虽然快速渲染和转换可以方便地直接检查点云,但它们通常不会直接集成到常用的三维应用程序中。 然而,最近的发展表明,即使在纯基于网格的渲染平台中,也有更好的支持的趋势,最近的例子是 Unreal 4 游戏引擎。

A.参阅:Python三维点云自动生成三维网格

三维模型

几乎所有的 3D 模型都可以分为两类。

  • 实体:这些模型定义了它们所代表的对象的体积。实体模型主要用于工程和医学模拟,通常使用构造实体几何或体素组件构建。

  • 壳或边界:这些模型代表表面,即对象的边界,而不是其体积。现实捕捉工作流程、游戏和电影中使用的几乎所有视觉模型都是边界表示。

实体和壳建模可以创建功能相同的对象。 它们之间的差异主要在于它们的创建和编辑方式的差异以及在各个领域的使用约定以及模型与现实之间的近似类型的差异。

三种主要策略允许通过 3D 模型描述点云。 构造实体几何、隐式曲面(参数化建模)和边界表示。 虽然构造实体几何非常有趣,但最常见的 3D 模型是边界表示。

B.参阅:Python体素化网格和点云

C.参阅:Python点云数据聚类处理

Python点云计算示例

与直接针对网格执行深度学习相比,针对点云执行深度学习要容易得多。 这是因为点云可以轻松编码到 (N,3) Numpy 数组中。 为了执行转换,我们下载一个 .obj 模型文件,将其读入 Python,并对其执行表面采样。 我们将使用 Lloyd 松弛算法,而不是使用表面的均匀采样(这可能会导致某些不利的影响),该算法的一个很好的实现封装为如下函数:

def mesh_to_pc(input_files, output_folder, n_points):
    
    Args:
        input_files (str): List of .obj file paths
        output_folder (str): Folder path where the resulting .npy files should be stored
        
    Returns:
        bool: True when file conversion is completed


    counter = 0
    
    for file in tqdm.tqdm(input_files, total=len(input_files)):
        # v is a nv by 3 NumPy array of vertices
        # f is an nf by 3 NumPy array of face indexes into v 
        # n is a nv by 3 NumPy array of vertex normals
        try:
            v, f, n = pcu.read_obj(file)
        except ValueError:
            print("Could not read: " + str(file))
            pass

        pc = pcu.sample_mesh_lloyd(v, f, n_points)
        output_file = output_folder + str(counter) + '.npy'
        np.save(output_file, pc)
        counter += 1

针对上述中的 .obj 模型,运行此命令将生成 (n_points, 3) Numpy 数组,我们将以本机 .npy 格式保存该数组。

在我们完成所有所需的网格并将其转换为点云之后,我们可以使用 Matplotlib 将它们可视化:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

input_pc = np.load(‘test.npy’)
print(input_pc.shape)
x,y,z = input_pc.T
fig = plt.figure()
ax = Axes3D(fig)
ax.scatter(x,y,z)

或者利用 PyVista,我们可以获得更好的可视化效果

import numpy as np
import pyvista as pv
input_pc = np.load(‘test.npy’)
print(input_pc.shape)
cloud = pv.PolyData(input_pc)
cloud.plot()

D.参阅:更多Python计算点云和网格示例

Last updated