降低点云密度的几种方法(含python代码)

news2024/10/7 12:29:06

本文只是对学习过程中的点云密度降采样的几种方法做一个记录,原文参考知乎Python点云数据处理(四)点云下采样 - 知乎 (zhihu.com)

本文介绍python点云数据处理中的点云下采样算法和关键点算法以及在点云工具箱软件中的实现。由于点云的海量和无序性,直接处理的方式在对邻域进行搜索时需要较高的计算成本。一个常用的解决方式就是对点云进行下采样,将对全部点云的操作转换到下采样所得到的点上,降低计算量。

一、均匀下采样

均匀下采样有多种不同的采样方式,其中最远点采样是较为简单的一种,首先需要选取一个种子点,并设置一个内点集合,每次从点云中不属于内点的集合找出一点距离内点最远的点,如下图,这里的距离计算方式为该点至内点所有点的最小距离。这种方式的下采样点云分布均匀,但是算法复杂度较高效率低。

点云工具箱中该功能实现依赖于Open3d库,代码如下:

import open3d as o3d

# 读取文件
pcd = o3d.io.read_point_cloud(path)  # path为文件路径

pcd_new = o3d.geometry.PointCloud.uniform_down_sample(pcd, value)
# value值的设定为整数,即value个点中选取一个点

二、体素下采样

体素下采样就是把三维空间体素化,然后在每个体素里采样一个点,通常可用中心点或最靠近中心的点作为采样点。具体方法如下:

1. 创建体素:计算点云的包围盒,然后把包围盒离散成小体素。体素的长宽高可以用户设定,也可以通过设定包围盒三个方向的格点数来求得。

2. 每个小体素包含了若干个点,取中心点或离中心点最近的点为采样点。

体素采样的特点:

  • 效率非常高
  • 采样点分布比较均匀,但是均匀性没有均匀采样高
  • 可以通过体素的尺寸控制点间距
  • 不能精确控制采样点个数

点云工具箱中该功能实现依赖于Open3d库,代码如下:

pcd_new = o3d.geometry.PointCloud.voxel_down_sample(pcd, value)
# value为体素的大小

三、曲率下采样

曲率下采样就是在点云曲率越大的地方,采样点个数越多。一种简单有效的曲率下采样实现方法如下:

1.通过该方法近似达到曲率的效果同时提高计算效率:计算每个点K邻域,然后计算点到邻域点的法线夹角值。曲率越大的地方,这个夹角值就越大。

2.设置一个角度阈值,比如5度。点的邻域夹角值大于这个阈值的点被认为是特征明显的区域,其余的为不明显区域。

3.均匀采样特征明显区域和不明显区域,采样数分别为S * (1 - U),S * U。S为目标采样数,U为采样均匀性。

该采样方法的特点:

  • 几何特征越明显的区域,采样点个数分布越多
  • 计算效率高
  • 采样点局部分布是均匀的
  • 稳定性高:通过几何特征区域的划分,使得采样结果抗噪性更强

点云工具箱中该功能实现代码如下:

def vector_angle(x, y):
	Lx = np.sqrt(x.dot(x))
	Ly = (np.sum(y ** 2, axis=1)) ** (0.5)
	cos_angle = np.sum(x * y, axis=1) / (Lx * Ly)
	angle = np.arccos(cos_angle)
	angle2 = angle * 360 / 2 / np.pi
	return angle2

knn_num = 10  # 自定义参数值(邻域点数)
angle_thre = 30  # 自定义参数值(角度值)
N = 5  # 自定义参数值(每N个点采样一次)
C = 10  # 自定义参数值(采样均匀性>N)

pcd = o3d.io.read_point_cloud(path)
point = np.asarray(pcd.points)
point_size = point.shape[0]
tree = o3d.geometry.KDTreeFlann(pcd)
o3d.geometry.PointCloud.estimate_normals(
	pcd, search_param=o3d.geometry.KDTreeSearchParamKNN(knn=knn_num))
normal = np.asarray(pcd.normals)
normal_angle = np.zeros((point_size))
for i in range(point_size):
	[_, idx, dis] = tree.search_knn_vector_3d(point[i], knn_num + 1)
	current_normal = normal[i]
	knn_normal = normal[idx[1:]]
	normal_angle[i] = np.mean(vector_angle(current_normal, knn_normal))
	
point_high = point[np.where(normal_angle >= angle_thre)]
point_low = point[np.where(normal_angle < angle_thre)]
pcd_high = o3d.geometry.PointCloud()
pcd_high.points = o3d.utility.Vector3dVector(point_high)
pcd_low = o3d.geometry.PointCloud()
pcd_low.points = o3d.utility.Vector3dVector(point_low)
pcd_high_down = o3d.geometry.PointCloud.uniform_down_sample(pcd_high, N)
pcd_low_down = o3d.geometry.PointCloud.uniform_down_sample(pcd_low, C)
pcd_finl = o3d.geometry.PointCloud()
pcd_finl.points = o3d.utility.Vector3dVector(np.concatenate((np.asarray(pcd_high_down.points),
							np.asarray(pcd_low_down.points))))

四、曲面均匀采样

曲面均匀采样的算法实现依赖于Open3d库,从三角网格曲面数据均匀采样得到点云。

点云工具箱中该功能实现依赖于Open3d库,代码如下:

ply = o3d.io.read_triangle_mesh(path)
pcd = ply.sample_points_uniformly(number_of_points = value)  # number_of_points参数为采样点数

五、泊松磁盘采样

1. 泊松磁盘采样(Poisson-Disk Sampling)性质

一个理想的 Poisson 圆盘采样点集需要满足 3 个条件:

(1) 无偏差采样性质 (采样区域的每个没有被覆盖的点都有相同的概率接受一个新的采样点);

(2) 最小距离性质 (任意两个采样点之间的距离大于给定的采样半径);

(3) 最大化性质 (采样区域被所有的采样圆盘完全覆盖).

满足这 3 个条件的采样方法称为最大化 Poisson 圆盘采样 (maximal Poisson-disk sampling, MPS).

2.Poisson-Disk Sampling伪代码如下:

function WeightedSamplingElim(samples)
   Build a K-Dtree for each samples
   Assign weights wi to each sample si
   Build a heap for si using weights wi
   While number of samples > desired
      sj <- pull the top sample from heap
      For each sample si around sj
        Remove wij from wi
        Update the heap position of si

每个sample都会被分配一个对应的权重,其权重的参数如下:

w[index] += weightFunction(point, p, d2, d_max)

其中point为每个泊松圆盘固定点,p为point周围的点,d2为周围点与point之间的距离

,d_max为设定Poisson radius距离。

点云工具箱中该功能实现依赖于Open3d库,代码如下:

pcd = tri_mesh.sample_points_poisson_disk(number_of_points=value)  # number_of_points参数为采样点数

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

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

相关文章

Java基于springboot+vue的房屋出租租房系统 前后端分离

伴随着全球信息化发展&#xff0c;行行业业都与计算机技术相衔接&#xff0c;计算机技术普遍运用于各大行业&#xff0c;房屋出租管理系统便是其中一种。实施计算机系统来管理可以降低大学生租房管理的成本&#xff0c;使整个大学生租房的发展和服务水平有显著提升。 本论文主要…

umask 设置文件权限掩码

我们在创建文件或者目录时&#xff0c;看到的权限往往和我们设置的不一样&#xff0c;原因就在于创建文件时要受到 umask的影响。 目录 一、实际情景介绍 二、文件权限掩码 1、什么是权限掩码&#xff1f; 2、权限掩码的作用过程 3、设置权限掩码的两种方式 (1) umask 命…

【java基础系列】14- Java的内部类与常用类

Java的内部类与常用类 1、内部类 1.1 内部类的分类 成员内部类静态内部类局部内部类匿名内部类 1.2 什么是内部类&#xff1f; 概念&#xff1a;在一个类的内部再定义一个完整的类。特点&#xff1a; 编译之后可生成独立的字节码文件。内部类可直接访问外部类的私有成员&a…

【HIT-OSLAB-实验报告】

文章目录前言实验 0 环境的搭建实验原理&材料实验流程建议实验1 输出硬件参数实验内容基础知识实验代码实验结果实验2 实现系统调用实验内容whoami()评分标准基础知识实验代码实验结果实验3 进程运行轨迹的跟踪实验内容基础知识实验代码实验结果结合自己的体会 从程序设计者…

Elasticsearch

一、Spring Data 1、简介 Spring Data 是一个用于简化数据库、非关系型数据库、索引库访问&#xff0c;并支持云服务的开源框架。Spring Data 可以极大的简化JPA的写法&#xff0c;可以在几乎不用写实现的情况下&#xff0c;实现对数据库的访问和操作。除了 CRUD 之外&#xff…

作业-11.29

将txt中的单词转到数据库中 #include <stdio.h> #include <sqlite3.h> #include <stdlib.h> #include <string.h> void do_insert(sqlite3* db, int id, char word[], char jieshi[]); void txt_todatabase(sqlite3* db); int main(int argc, const ch…

DevExpress FMX Data Grid全面编辑和定制

DevExpress FMX Data Grid全面编辑和定制 FMX数据网格(CTP)FireMonkey(FMX)的高性能数据网格组件&#xff0c;具有集成的主细节和数据分组支持。它被优化并构建为与RAD Studio/Delphi/CBuilder一起使用。它支持Windows、Android和macOS平台。 DevExpress FMX数据网格功能强大&a…

redis介绍和理解

官网 介绍: https://www.bilibili.com/video/BV1Fd4y1T7pD/?spm_id_from333.337.search-card.all.click&vd_source4c263677a216945c0d21ca65ee15a5f9 Redis是一个key value的数据库&#xff0c;基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库。 https://ww…

【Java+LeetCode训练】binarySearch源码解析

二分搜索Arrays.binarySearch(int[] a,int key)源码分析【LeetCode】209. 长度最小的子数组解法1&#xff1a;前缀和 暴力解法解法2&#xff1a;前缀和 二分搜索序&#xff1a;使用Arrays工具类中的binarySearch方法进行二分搜索时&#xff0c;我们知道搜索成功会返回其下标&…

数字化餐饮| 刘大厨湘菜馆进杭州,开场及巅峰

盼了几年的刘大厨辣椒炒肉终于来杭州了&#xff0c;但我却没有吃到&#xff0c;小钱对雨科网说&#xff1a;驱车三十里&#xff0c;排队三小时都没吃上&#xff0c;原来他们是每天10点开始放号&#xff0c;11点开餐&#xff0c;去的晚就吃不到。 5月20日&#xff0c;刘大厨在杭…

5G无线技术基础自学系列 | 5G上行物理信道和信号

素材来源&#xff1a;《5G无线网络规划与优化》 一边学习一边整理内容&#xff0c;并与大家分享&#xff0c;侵权即删&#xff0c;谢谢支持&#xff01; 附上汇总贴&#xff1a;5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 5G上行的物理信道包括PRACH、PUCCH、PU…

产品经理要不要考PMP?进化你能力的阶梯!(附:新版考纲及教材)

产品经理和项目经理看起来是毫不相关的两个专业&#xff0c;那么产品经理要不要考PMP呢&#xff1f;其实是非常有必要的。 以前去面试产品经理&#xff0c;HR只会问1个问题&#xff1a;会用axure吗&#xff1f;一开始对产品经理的定义就是设计产品原型的。能设计产品原型&…

【附源码】计算机毕业设计JAVA中小学教务管理平台

【附源码】计算机毕业设计JAVA中小学教务管理平台 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JAVA …

【北京迅为】RK3568开发板android11系统固件讲解

脚本里面写入这些内容&#x1f446;&#xff0c; apt-get install uuid 后面就是包名&#xff0c;比如说安装了这些内容uuid 在安装之前先执行这个命令增加下载源&#x1f447; 这里会提示&#xff0c;需要输入 回车继续&#xff0c;还是输入 Ctrl-c取消 当然要输入回车继续…

51单片机学习笔记4 新建工程及点亮LED实战

51单片机学习笔记4 新建工程及点亮LED实战一、使用keil新建工程二、项目设置1. 点击魔术棒&#xff0c;钩选Output-Create Hex File2. 设置仿真器三、编写代码1. 尝试编译代码2. 点亮LED的代码3. GPIO引脚介绍4. GPIO内部结构P0端口&#xff1a;P1 端口四、软件仿真一、使用kei…

aws cloudformation 理解自定义资源的使用

资料 AWS::CloudFormation::CustomResourcecfn-response module 自定义资源的逻辑 cloudformation只能对aws service进行部署和配置&#xff0c;但是用户可能需要使用第三方产品&#xff0c;此时需要通过自定义资源将其纳入到cloudformation的管理中。通过编写自定义逻辑&am…

为什么我们提供了新的公共镜像库

众所周知&#xff0c;建木在项目初期就已经完成了“自举”&#xff0c;就是使用建木完成自身的全部CI/CD/CO等自动化流程。 另外&#xff0c;由于建木本身和官方支持的节点都是打包为镜像发布到Docker Hub上&#xff0c;结果最近半年我们频繁碰到如下场景。 场景一 “CI服务的…

flink程序执行管理-1.13

1. 版本说明 本文档内容基于 flink-1.13.x&#xff0c;其他版本的整理&#xff0c;请查看本人博客的 flink 专栏其他文章。 2. 执行配置 StreamExecutionEnvironment 包含 ExecutionConfig 对象&#xff0c;该对象允许程序指定运行时的配置值。改变默认值可以影响所有的任务…

【Nginx 原理】进程模型、HTTP 连接建立和请求处理过程、高性能、高并发、事件处理模型、模块化体系结构

Nginx 原理 Nginx 以其高性能&#xff0c;稳定性&#xff0c;丰富的功能&#xff0c;简单的配置和低资源消耗而闻名。 Nginx进程模型 Nginx 是一个多进程的模型&#xff0c;主要分为一个 Master 进程、多个 Worker 进程。 Master 进程&#xff1a; 管理 Worker 进程。 对外…

TKE 超级节点,Serverless 落地的最佳形态

陈冰心&#xff0c;腾讯云产品经理&#xff0c;负责超级节点迭代与客户拓展&#xff0c;专注于 TKE Serverless 产品演进。 背景 让人又爱又恨的 Serverless Serverless 炙手可热&#xff0c;被称为云原生未来发展的方向。信通院报告显示&#xff1a;在核心业务中使用 Server…