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 jsondef 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_path3DGS 输出的 point_cloud.plypoint_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、网格生成:

  • 识别表面高斯体
  • 生成更密集的表面点云
  • 使用泊松表面重建算法生成网格
  • 应用拉普拉斯平滑

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/80526.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenHarmony 以太网卡热插拔事件接口无效

目录 1.背景 2.解决方案 1.背景 在OpenHarmony中调用以太网热插拔时间,发现热插拔没有任何回调,如下接口 import { ethernet } from @kit.NetworkKit;ethernet.on(interfaceStateChange, (data: object) => {console.log(on interfaceSharingStateChange: + JSON.…

C++ 跨平台开发挑战与深度解决方案:从架构设计到实战优化

C 凭借其高性能与底层控制能力,在游戏引擎、嵌入式系统、工业软件等领域占据核心地位。然而,跨平台开发过程中需应对硬件架构多样性、操作系统差异性、编译工具链碎片化等复杂问题。本文将从底层架构到上层应用,系统性剖析 C 跨平台开发的核心…

什么是 ANR 如何避免它

一、什么是 ANR? ANR(Application Not Responding) 是 Android 系统在应用程序主线程(UI 线程)被阻塞超过一定时间后触发的错误机制。此时系统会弹出一个对话框提示用户“应用无响应”,用户可以选择等待或强…

数据结构(六)——树和二叉树

一、树和二叉树的定义与存储 1.树的定义 树是一种非线性的数据结构,它是由n个有限结点组成有层次关系的集合 树具有以下特点: (1)每个结点具有0个或多个子结点 (2)每个子结点只有一个父结点 &#xff…

DICOM 网络服务实现:医学影像传输与管理的技术实践

🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C++, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C++、C#等开发语言,熟悉Java常用开发技术,能熟练应用常用数据库SQL server,Oracle,mysql,postgresql等进行开发应用…

TongWeb7.0常用-D参数说明

Web容器相关启动参数配置 属性 含义 -Dtongweb.restart.interval 设置宕机后重启的时间间隔,以秒为单位。如果不设置这个参数,默认为1秒 -Dmonitor.abnormal.restart 设置服务器非正常状态时是否重启,如果不设置这个参数或者参数值不为…

软件架构评估方法全面解析

介绍 在软件开发过程中,架构设计的好坏直接影响系统的可维护性、可扩展性和性能。因此,软件架构评估(Software Architecture Evaluation)成为确保架构质量的关键步骤。本文将介绍几种主流的架构评估方法,包括ATAM、SA…

我开源了一个免费在线工具!UIED Tools

UIED Tools - 免费在线工具集合 最近更新:修改了文档说明,优化了项目结构介绍 这是设计师转开发的第一个开源项目,bug和代码规范可能有些欠缺。 这是一个功能丰富的免费在线工具集合网站,集成了多种实用工具,包括 AI …

【vue】全局组件及组件模块抽离

一、全局组件 只要是实例化过的区域都可以使用 Vue.component("组件名",{ template: 内容} ) 二、组件模块抽离 抽离就是把template的内容写到body里面,然后建立id写到变量下的template里,id变量写到component里 body{ template: …

深入理解 iOS 开发中的 `use_frameworks!`

在使用 CocoaPods 管理 iOS 项目依赖时,开发者经常会在 Podfile 文件中看到一个配置选项:use_frameworks!。本文将详细介绍这个配置选项的含义,以及如何决定是否在项目中使用它。 一、什么是 use_frameworks! 在 CocoaPods 中引入第三方库时…

《Python星球日记》 第57天:LSTM 与 GRU

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、LSTM 的门控机制1. LSTM 结构概述2. 遗忘门(Forget Gate)3. 输入门(Input Gate)4. 输出门(Output Gate)5. 记忆单元更新过程二、GRU 的简化…

Java SE所需工具与常见类型和运算符介绍

1.Java SE所需工具 1.1 JDK JDK全称为Java Develepment Kit(Java开发者工具包),包括了Java运行环境JRE(Java Runtime Envirnment)、一堆Java工具(javac/java/jdb等)和Java基础的类库(即Java A…

QT6.8安装教程

官网下载 链接: Index of /official_releases/online_installers 这个比较慢 建议去 清华大学开源软件镜像站:Index of /qt/archive/online_installers/4.9/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 根据自己什么系统选择 点击打开…

MIT XV6 - 1.3 Lab: Xv6 and Unix utilities - primes

接上文 MIT XV6 - 1.2 Lab: Xv6 and Unix utilities - pingpong primes 继续实验,实验介绍和要求如下 (原文链接 译文链接) : Write a concurrent prime sieve program for xv6 using pipes and the design illustrated in the picture halfway down this page and…

hive两个表不同数据类型字段关联引发的数据倾斜

不同数据类型引发的Hive数据倾斜解决方案 #### 一、‌原因分析‌ 当两个表的关联字段存在数据类型不一致时(如int vs string、bigint vs decimal),Hive会触发隐式类型转换引发以下问题: ‌Key值的精度损失‌:若关联字…

【JAVA】业务系统订单号,流水号生成规则工具类

设计业务系统订单号,流水号注意事项 唯一性:确保在分布式环境下ID不重复 有序性:ID随时间递增,有利于数据库索引性能 可读性:包含时间信息,便于人工识别 扩展性:支持业务前缀和类型区分 性能…

【嵌入式开发-SPI】

嵌入式开发-SPI ■ SPI简介■ SPI (Standard SPI)■ DSPI (Dual SPI)■ QSPI是 Queued SPI的简写 ■ SPI简介 SPI协议其实是包括:Standard SPI、Dual SPI和Queued SPI三种协议接口,分别对应3-wire, 4-wire…

基于HTTP头部字段的SQL注入:SQLi-labs第17-20关

前置知识:HTTP头部介绍 HTTP(超文本传输协议)头部(Headers)是客户端和服务器在通信时传递的元数据,用于控制请求和响应的行为、传递附加信息或定义内容类型等。它们分为请求头(Request Headers&…

基于Qt开发的http/https客户端

成果展示: 使用Qt开发HTTP客户端主要依赖QNetworkAccessManager、QNetworkRequest和QNetworkReply三大核心类。以下是具体实现要点及最佳实践: 一、核心类与基础流程​​ 1.QNetworkAccessManager​​ 作为HTTP请求的管理者,负责异步处理…

自适应蒙特卡洛定位-AMCL

自适应蒙特卡洛定位,简称AMCL,主要提供定位功能并以/tf形式输出 蒙特卡洛算法的基本思想:当所要求的问题是某种事件出现的概率或者是某个变量的期望值时,它们可以通过某种"试验"的方法,得到这种事件出现的概…