当前位置: 首页 > news >正文

Open3D 体素化下采样

参考笔记:Open3D: 3D点云的体素下采样技术-CSDN博客 

目录

一、算法原理

二、计算过程

三、代码实现


一、算法原理

体素化下采样是一种点云数据下采样方法,通常在点云处理任务的预处理步骤,体素化下采样分为两大步:

把点云装进体素网格

把每个体素网格中的所有点做平均,只保留一个代表点

二、计算过程

依据点云数据坐标集合,求取 \color{red}X\color{red}Y\color{red}Z 三个坐标值上的最大值 \color{red}X_{max}\color{red}Y_{max}\color{red}Z_{max} 和最小值  \color{red}X_{min}\color{red}Y_{min}\color{red}Z_{min}

根据 \color{red}X\color{red}Y\color{red}Z 三个坐标轴上的最大值、最小值求得点云的最小包围盒边长 \color{red}l_{x }\color{red}l _y\color{red}l_z,公式如下:

设置体素网格的边长 voxel_size,为了方便,记为 r

计算体素网格的数量:

D_x=\left \lfloor l_x/r\right \rfloor\\ \\ D_y=\left \lfloor l_y/r\right \rfloor\\ \\ D_z=\left \lfloor l_z/r\right \rfloor\\ \\

 其中,\color{red}D_x  指的是 \color{red}x 轴方向有多少个体素网格,\color{red}D_y\color{red}D_z 同理。所以总体素网格数量为:\color{red}D_x\times D_y\times D_z 。\left \lfloor \right \rfloor 指的是向下取整

计算每个体素网格的质心作为该体素网格的代表点,替代其他的所有点,完成下采样

        质心算法:已知一个非空体素网格 \color{red}V,包含 \color{red}m 个点,则该体素网格的质心 \color{red}P_{centroid}(x_{centroid}\;\;,y_{centroid}\;\;,z_{centroid}) 为:

注:质心说白了就是求平均值。如果点还有其他属性,比如RGB、法线等也是取平均值

三、代码实现

主要函数:

def voxel_down_sample(self, voxel_size): 

 voxel_size:体素网格的边长 


我们用经典的兔子点云做一下对比

import open3d as o3d
import numpy as nppcd = o3d.io.read_point_cloud("rabbit.txt",format="xyz")#读取点云
print("原始点云中点的个数为:", np.asarray(pcd.points).shape[0])
o3d.visualization.draw_geometries([pcd])#原始点云可视化print("使用边长为0.5的体素对点云进行下采样")
downpcd = pcd.voxel_down_sample(voxel_size=0.5)
print("体素下采样后点的个数为:", np.asarray(downpcd.points).shape[0])#可视化体素下采样后的点云
o3d.visualization.draw_geometries([downpcd], window_name="体素滤波",width=1200, height=800,left=50, top=50,mesh_show_back_face=False)

运行结果

原始点云中点的个数为: 35947
使用边长为0.5的体素对点云进行下采样
体素下采样后点的个数为: 3023
http://www.dtcms.com/a/191174.html

相关文章:

  • Python面向对象编程精解:从两大编程范式到类与对象实战
  • 前后端分离博客 Weblog 项目实战
  • 启动窗体自动输入上次内容——CAD c#二次开发
  • 50. Pow(x, n)
  • 『 测试 』软件测试全流程与Bug管理核心要点解析
  • 前端~三维地图(cesium)动态材质扩散圆环
  • 编译openssl源码
  • LLM定制新路径:微调与上下文学习的博弈与融合
  • JS中本地存储(LocalStorage)和会话存储(sessionStorage)的使用和区别
  • python使用matplotlib画图
  • 交易所功能设计的核心架构与创新实践
  • 日语学习-日语知识点小记-构建基础-JLPT-N4阶段(21):复习
  • 一般枚举题目合集
  • 【HALCON】 HALCON 教程:正确使用 `get_dict_tuple` 获取字典内容
  • gd32e230c8t6 keil6工程模板
  • loss = -F.log_softmax(logits[:, -1, :], dim=1)[0, irrational_id]
  • 快消零售AI转型:R²AIN SUITE如何破解效率困局
  • CK-S654-PA60一拖四分体式半导体电子货架专用RFID读写器|读码器接线使用说明
  • java day 11
  • acwing 1488. 最短距离 超级源点 最短路 堆优化Dijkstra
  • 03_朴素贝叶斯分类
  • The 2022 ICPC Asia Xian Regional Contest(E,L)题解
  • 鸿蒙:DevEco Studio配置ohpm时,cmd正常,在终端出现‘ohpm‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。
  • PHP 编程:现代 Web 开发的基石与演进
  • Vue.js 组件开发指南
  • vim启动的时候,执行gg
  • (3)python开发经验
  • c#中equal方法与gethashcode方法之间有何关联?
  • Linux514 rsync 解决方案环境配置
  • MySQL之基础事务