3DGS-to-PC:3DGS模型一键丝滑转 点云 or Mesh 【Ubuntu 20.04】【2025最新版!!】

一、引言

3D高斯泼溅(3DGS)是一种新兴的三维场景表示方法,可以生成高质量的场景重建结果。然而,要查看这些重建场景,需要特殊的高斯渲染器。大多数3D处理软件并不兼容3D高斯分布模型,但它们通常都兼容点云文件。
3DGS-to-PC项目提供了一种方法,将3DGS场景转换为
高密度点云
,以便在常用的3D软件中查看和编辑。该项目还提供了生成网格模型的功能,方便进一步处理和应用。

二、环境配置

2.1 前提条件

  • Ubuntu 20.04
  • CUDA 11.8
  • Python 3.x (建议3.8或更高版本)
  • 已安装好的3D Gaussian Splatting环境

2.2 配置3DGS-TO-PC

首先,克隆仓库到本地:

复制代码
git clone https://github.com/Lewis-Stuart-11/3DGS-to-PC
cd 3DGS-to-PC

确保原始 3D Gaussian Splatting 存储库已正确安装,因为它包含所有必需的模块/包。

然后,安装CUDA高斯点云光栅化扩展:

复制代码
pip install ./gaussian-pointcloud-rasterization

如果上述安装失败,不要担心,项目还提供了纯Python渲染器作为备选方案。

为了使用网格生成功能,需要安装Open3D:

复制代码
pip install open3d

2.3 依赖关系检查

确保以下Python包已正确安装:

复制代码
pip install numpy torch tqdm configargparse imageio matplotlib open3d

三、基本使用流程

3.1 准备3DGS模型+colmap相机参数(相机内参+相机位姿)

首先,你需要拥有一个已训练好的3D高斯分布模型。这通常是一个.ply或.splat文件。如果你还没有训练好的模型,可以使用原始的3D Gaussian Splatting仓库来从图像数据集训练一个模型。

colmap相机参数也是必要的 为了生成 transforms.json 以支持 3DGS-to-PC 在采样点云时进行颜色渲染和 mesh 重建。

sparse/0/

├── cameras.txt ✅ 相机内参

├── images.txt ✅ 相机位姿(四元数 + 平移)

├── points3D.txt ⛔ 不需要,用不到

或者:

sparse/0/

├── cameras.bin ✅

├── images.bin ✅

├── points3D.bin ⛔

准备好的 准备3DGS模型+colmap相机参数结构目录如下所示:

3.2 colmap相机参数转化生成 transforms.json

可以创建脚本进行转化处理transform_dataloader.py:

部分代码如下:

复制代码
import os
import numpy as np
import torch
import cv2
import struct
import json

def convert_sfm_pose_to_nerf(transform):
    """
    Convert camera pose from COLMAP to a transform for rendering
    """

    c2w = np.linalg.inv(transform)

    flip_mat = np.array([
                                [1, 0, 0, 0],
                                        [0, -1, 0, 0],
                                        [0, 0, -1, 0],
                                        [0, 0, 0, 1]
                                ])

    return np.matmul(c2w, flip_mat)

........................................
........................................

然后可以运行代码:

复制代码
python transform_dataloader.py --input_path data/z1/col/bond/sparse/0/ --output data/z1/tran_z1.json

执行结果如下:

即可得到标准 transforms_fixed.json,然后用它作为:

复制代码
--transform_path transforms_fixed.json

3.3 基本转换命令

最基本的点云生成命令如下:

复制代码
python gauss_to_pc.py --input_path "path//to//gaussian_splat"

但这只会生成一个基本的点云,颜色可能与原始3DGS场景不匹配。为了生成带有真实颜色的点云,你需要提供相机变换文件路径:

复制代码
python gauss_to_pc.py --input_path "path/to/gaussian_splat.ply" --transform_path "path/to/transforms.json"

transform_path可以指向transforms.json文件或COLMAP输出文件夹。

比如:

复制代码
python gauss_to_pc.py --input_path data/z1/data/point_cloud/iteration_30000/point_cloud.ply --transform_path data/z1/tran_z1.json --output_path data/z1z1.ply

3.4 生成网格(Mesh)文件

要生成网格,可以使用以下命令:
python gauss_to_pc.py --input_path "path/to/gaussian_splat.ply" --transform_path "path/to/transforms.json" --generate_mesh

比如:

复制代码
python gauss_to_pc.py --input_path data/z1/data/point_cloud/iteration_30000/point_cloud.ply --transform_path data/z1/tran_z1.json --generate_mesh --mesh_output_path data/z1/mash_z1.ply


3.5 如果想同时生成点云和Mesh

需要执行以下命令:

复制代码
python gauss_to_pc.py \
  --input_path data/z1/data/point_cloud/iteration_30000/point_cloud.ply \
  --transform_path data/z1/tran_z1.json \
  --output_path output/fed0e33a-9/pointcloud.ply \
  --generate_mesh \
  --mesh_output_path output/fed0e33a-9/mesh.ply \
  --num_points 10000000 \
  --colour_quality high

3.5 关键参数说明

参数 含义 建议值
--input_path 3DGS 输出的 point_cloud.ply point_cloud.ply
--transform_path 相机姿态文件 data/z1/tran_z1.json
--num_points 生成点数(越多越细) 10000000
--colour_quality 渲染图像的分辨率 high / ultra
--generate_mesh 是否生成网格 ✅ 添加此参数
--mesh_output_path 网格保存路径 mesh.ply

四、参数详解与优化建议

4.1 核心参数解析

4.2 高级参数优化

1、点云质量优化

高质量点云生成命令示例

复制代码
python gauss_to_pc.py --input_path "path/to/model.ply" \
                       --transform_path "path/to/transforms" \
                       --num_points 20000000 \
                       --visibility_threshold 0.08 \
                       --std_distance 1.5 \
                       --colour_quality high \
                       --clean_pointcloud

参数解释:

  • --num_points: 增加点数以获得更精细的点云
  • --visibility_threshold: 适当提高可以减少噪点
  • --std_distance: 控制点与高斯中心的最大距离,降低可以使点分布更紧凑
  • --colour_quality: 设置为high或ultra可提高渲染质量
  • --clean_pointcloud: 启用异常点过滤

2、网格质量优化

复制代码
# 高质量网格生成命令示例
python gauss_to_pc.py --input_path "path/to/model.ply" \
                       --transform_path "path/to/transforms" \
                       --generate_mesh \
                       --poisson_depth 12 \
                       --laplacian_iterations 15 \
                       --visibility_threshold 0.1
参数解释:
  • --poisson_depth: 提高至12可以获得更精细的网格(不建议超过12,会导致计算量过大)
  • --laplacian_iterations: 增加至15可以获得更平滑的网格
  • --visibility_threshold: 提高至0.1可以减少网格中的噪点

处理大场景的优化:

复制代码
# 处理大场景的命令示例
python gauss_to_pc.py --input_path "path/to/model.ply" \
                       --transform_path "path/to/transforms" \
                       --camera_skip_rate 4 \
                       --colour_quality medium \
                       --bounding_box_min -10 -10 -10 \
                       --bounding_box_max 10 10 10
参数解释:
  • --camera_skip_rate: 跳过一定比例的相机以加快渲染速度
  • --colour_quality: 降低至medium可以加快渲染速度
  • --bounding_box_min/max: 限定模型的边界框,只处理特定范围内的高斯分布

五、代码核心原理解析

5.1 高斯分布到点云的转换过程

gauss_to_pc.py中的convert_3dgs_to_pc函数是整个转换过程的核心。以下是详细解析:

1、加载高斯模型和相机参数:

首先,程序会加载高斯分布模型和相机参数,这是点云生成和渲染颜色的基础。

复制代码
# 加载相机变换数据
transforms, intrinsics = load_transform_data(transform_path, skip_rate=pointcloud_settings.camera_skip_rate)

# 加载高斯分布数据
xyz, scales, rots, colours, opacities = load_gaussians(input_path, max_sh_degree=pointcloud_settings.max_sh_degree)

# 创建高斯对象
gaussians = Gaussians(xyz, scales, rots, colours, opacities)

2、高斯预处理:

然后,程序会对高斯进行预处理,包括计算法向量、应用透明度阈值、边界框和裁剪大型高斯等。

复制代码
# 计算高斯法向量
if pointcloud_settings.calculate_normals:
    gaussians.calculate_normals()

# 应用透明度阈值
gaussians.apply_min_opacity(pointcloud_settings.min_opacity)

# 应用边界框限制
gaussians.apply_bounding_box(pointcloud_settings.bounding_box_min, pointcloud_settings.bounding_box_max)

# 裁剪大型高斯
gaussians.cull_large_gaussians(pointcloud_settings.cull_large_percentage)

3、渲染颜色:

如果启用了颜色渲染,程序会使用给定的相机参数渲染高斯分布的颜色

复制代码
# 初始化高斯渲染器
gaussian_renderer = get_renderer(pointcloud_settings.renderer_type, gaussians.xyz, 
                                 torch.unsqueeze(torch.clone(gaussians.opacities), 1), 
                                 gaussians.colours, gaussians.covariances, 
                                 visible_gaussian_threshold=pointcloud_settings.visibility_threshold)

# 对每个相机位置进行渲染
for i in range(len(transforms)):
    img_name, transform = list(transforms.items())[i]
    transform = torch.tensor(list(transform), device=pointcloud_settings.device)
    cam_intrinsic = intrinsics[img_name]
    camera = get_camera(pointcloud_settings.renderer_type, transform, cam_intrinsic, 
                        colour_resolution=pointcloud_settings.colour_resolution)
    render, _, _ = gaussian_renderer(camera)

# 获取渲染后的高斯颜色
gaussians.colours = gaussian_renderer.get_gaussian_colours()

4、点云生成:

接下来是点云生成的核心部分,通过generate_pointcloud函数实现:

复制代码
# 生成点云
points, colours, normals = generate_pointcloud(gaussians, pointcloud_settings.num_points, 
                                              exact_num_points=pointcloud_settings.exact_num_points, 
                                              std_distance=pointcloud_settings.std_distance, 
                                              device=pointcloud_settings.device, 
                                              calculate_normals=pointcloud_settings.calculate_normals,
                                              num_sample_attempts=num_sample_attempts,
                                              quiet=pointcloud_settings.quiet)

5、网格生成(如果启用):

如果启用了网格生成,程序会根据表面高斯分布生成一个单独的点云,然后用于网格重建:

复制代码
if pointcloud_settings.generate_mesh and pointcloud_settings.render_colours:
    # 确保只包含表面高斯
    gaussians.filter_gaussians(surface_gaussian_idxs)
    
    # 设置网格点数
    total_mesh_points = min(pointcloud_settings.num_points//2, 
                            int(gaussians.xyz.shape[0]*avg_points_per_gauss_for_mesh))
    
    # 生成用于网格重建的点云
    points, colours, normals = generate_pointcloud(gaussians, total_mesh_points, 
                                                  exact_num_points=pointcloud_settings.exact_num_points, 
                                                  num_sample_attempts=num_sample_attempts,
                                                  device=pointcloud_settings.device,
                                                  quiet=pointcloud_settings.quiet)

六、针对不同数据集的优化策略

6.1 室内场景

室内场景通常包含较多复杂的几何结构和纹理细节:

复制代码
python gauss_to_pc.py --input_path "indoor_scene.ply" \
                       --transform_path "indoor_transforms" \
                       --num_points 15000000 \
                       --visibility_threshold 0.06 \
                       --std_distance 1.8 \
                       --colour_quality high \
                       --generate_mesh \
                       --poisson_depth 11

优化理由:

  • 增加点数以捕获细节
  • 适中的可见性阈值以平衡细节和噪点
  • 较高的std_distance以确保结构完整性
  • 高色彩质量以还原真实纹理
  • 适中的泊松深度以平衡细节和计算效率

6.2 户外场景优化

户外场景通常更加开阔,可能包含更多远处的物体:

复制代码
python gauss_to_pc.py --input_path "outdoor_scene.ply" \
                       --transform_path "outdoor_transforms" \
                       --num_points 20000000 \
                       --visibility_threshold 0.08 \
                       --std_distance 1.6 \
                       --colour_quality high \
                       --clean_pointcloud \
                       --generate_mesh \
                       --poisson_depth 10 \
                       --laplacian_iterations 12

优化理由:

  • 更多的点数以覆盖大范围场景
  • 更高的可见性阈值以减少远处的噪点
  • 启用点云清理以去除异常点
  • 适中的泊松深度和较高的平滑迭代次数以生成更平滑的远景

6.3 物体扫描优化

单个物体的扫描通常需要更精细的细节:

复制代码
python gauss_to_pc.py --input_path "object_scan.ply" \
                       --transform_path "object_transforms" \
                       --num_points 8000000 \
                       --visibility_threshold 0.04 \
                       --std_distance 1.4 \
                       --colour_quality ultra \
                       --generate_mesh \
                       --poisson_depth 12 \
                       --laplacian_iterations 8

优化理由:

  • 适当的点数(单个物体不需要太多点)
  • 较低的可见性阈值以保留细节
  • 较小的std_distance以确保点分布紧密
  • 超高色彩质量以还原精细纹理
  • 高泊松深度以捕获细节,较少的平滑迭代以保留锐边

七、常见问题和解决方案

7.1 点云噪点过多

如果生成的点云包含太多噪点,可以尝试以下方法:

1、增加可见性阈值
复制代码
--visibility_threshold 0.1
2、启用点云清理
复制代码
--clean_pointcloud
3、减小std_distance参数
复制代码
--std_distance 1.2

7.2 网格质量不佳

如果生成的网格质量不理想,可以尝试:

1、增加泊松深度参数(最大推荐值为12)

复制代码
--poisson_depth 12

2、调整拉普拉斯平滑迭代次数

复制代码
--laplacian_iterations 15  # 更平滑的表面
--laplacian_iterations 5   # 保留更多细节

3、使用边界框限制只处理模型的重要部分

复制代码
--bounding_box_min -5 -5 -5 --bounding_box_max 5 5 5

7.3 处理速度过慢

如果处理速度太慢,可以考虑以下优化:

1、减少相机数量
复制代码
--camera_skip_rate 4
2、降低渲染质量
复制代码
--colour_quality medium
3、减少总点数
复制代码
--num_points 5000000

八、性能与质量的平衡技巧

要在性能和质量之间取得平衡,可以考虑以下策略:

8.1 两阶段转换流程:

  • 首先使用较低的参数进行快速预览
  • 确定最佳参数后,再使用高质量设置进行最终转换

8.2 选择性处理:

使用边界框只处理场景中最重要的部分

复制代码
--bounding_box_min -3 -3 -3 --bounding_box_max 3 3 3

8.3 混合渲染优化:

  • 对于大场景,可以使用较低的colour_quality和较高的camera_skip_rate
  • 但保持较高的num_points以保证几何精度

8.4 分块处理:

对于超大场景,可以考虑将场景分割为多个部分,分别处理后再合并

九、高级应用场景

9.1 超大规模场景处理

对于城市级别的大场景,可以采用分块处理策略:

复制代码
# 处理第一部分
python gauss_to_pc.py --input_path "large_scene.ply" \
                       --transform_path "transforms" \
                       --bounding_box_min -100 -100 -100 \
                       --bounding_box_max 0 0 0 \
                       --output_path "part1.ply"

# 处理第二部分
python gauss_to_pc.py --input_path "large_scene.ply" \
                       --transform_path "transforms" \
                       --bounding_box_min 0 -100 -100 \
                       --bounding_box_max 100 0 0 \
                       --output_path "part2.ply"

# 使用外部工具如CloudCompare或MeshLab合并点云

9.2 在视频数据集上的应用

对于从视频序列中获取的3DGS模型,可以尝试以下策略:

1、提高camera_skip_rate参数,因为视频中相邻帧的相机位置通常非常接近:

复制代码
--camera_skip_rate 10

2、根据视频质量调整colour_quality:

复制代码
高清视频:--colour_quality high
普通视频:--colour_quality medium

3、对于具有运动模糊的视频数据集,可能需要更高的visibility_threshold:

复制代码
--visibility_threshold 0.12

9.3 点云后处理

生成点云后,还可以使用外部工具进行后处理:

  • CloudCompare:用于点云编辑、滤波和网格生成
  • MeshLab:用于点云处理和高级网格生成
  • Blender:用于艺术化编辑和渲染

9.4 参数总结

1、点云数量 (num_points):

  • 小场景/物体:5-10百万
  • 中等场景:10-15百万
  • 大场景:15-30百万

2、可见性阈值 (visibility_threshold):

  • 保留细节:0.03-0.05
  • 平衡设置:0.05-0.08
  • 减少噪点:0.08-0.12

3、标准距离 (std_distance):

  • 紧密分布:1.2-1.5
  • 标准分布:1.5-2.0
  • 松散分布:2.0-2.5

4、色彩质量 (colour_quality):

  • 快速预览:low
  • 标准质量:medium
  • 高质量渲染:high
  • 展示级别:ultra

十、总结

10.1 常见问题排查:

  • CUDA错误: 确保您的PyTorch版本与CUDA版本兼容。
  • 内存不足: 减少--num_points和--colour_quality。
  • 网格质量差: 增加--poisson_depth和--visibility_threshold,并考虑使用--clean_pointcloud。
  • 处理速度慢: 使用--camera_skip_rate和降低--colour_quality,确保使用CUDA渲染器。
  • 颜色不正确: 确保提供了正确的--transform_path。

10.2 项目原理解释

3DGS-to-PC项目的工作原理是将3D高斯分布(一种新型的场景表示方法)转换为更通用的点云或网格格式。

1、高斯分布表示: 3D高斯分布通过均值(位置)、协方差(形状和方向)以及颜色来表示3D空间中的体素。

2、点云生成过程:

  • 计算每个高斯体的大小
  • 按比例分配点数
  • 从每个高斯分布中采样点
  • 使用相机视角渲染颜色
  • 应用过滤器去除噪点

3、网格生成:

  • 识别表面高斯体
  • 生成更密集的表面点云
  • 使用泊松表面重建算法生成网格
  • 应用拉普拉斯平滑
相关推荐
爱凤的小光4 小时前
图漾相机——Sample_V2示例程序(待补充)
3d·图漾相机
懒羊羊我小弟7 小时前
使用 ECharts GL 实现交互式 3D 饼图:技术解析与实践
前端·vue.js·3d·前端框架·echarts
龙湾开发14 小时前
计算机图形学编程(使用OpenGL和C++)(第2版)学习笔记 09.天空和背景
c++·笔记·学习·3d·图形渲染
施努卡机器视觉1 天前
Alpha3DCS公差分析系统_国产替代的3D精度管控方案-SNK施努卡
3d
那年一路北1 天前
多视图密集对应学习:细粒度3D分割的自监督革命
3d
sunbyte1 天前
Three.js + React 实战系列 - 职业经历区实现解析 Experience 组件✨(互动动作 + 3D 角色 + 点击切换动画)
javascript·react.js·3d
球球和皮皮1 天前
Babylon.js学习之路《一、初识 Babylon.js:什么是 3D 开发与 WebGL 的完美结合?》
javascript·3d·前端框架·ar·vr
前端小崔1 天前
从零开始学习three.js(15):一文详解three.js中的纹理映射UV
前端·javascript·学习·3d·webgl·数据可视化·uv
狂奔solar1 天前
TAPIP3D:持久3D几何中跟踪任意点
3d