(3)点云数据处理学习——KD树近邻搜索

news2024/11/23 11:27:05

1、主要参考资料

(1)kd树原理

数组索引的kdtree建立及简明快速的k近邻搜索方法

(2)open3d

爆肝5万字 Open3D 点云数据处理基础(Python版))-技术圈

(3)视频参考

【Python+Open3D处理点云数据】2.KD树近邻搜索_哔哩哔哩_bilibili

(4)其它大佬

Python软件设计基础 第九节-Open3D模型处理_惊蛰鼬神的博客-CSDN博客_python打开3d模型

2、kd树原理

(1)主要应用

kd树(k-dimensional树的简称),是一种分割k维数据空间的数据结构,主要应用于多维空间关键数据的搜索,如范围搜索和最近邻搜索。

 3、三种搜索算法

3.1K近邻搜索

(1)函数

Search_knn_vector_3d,返回查询点的K个最近邻索引列表,并将这些相邻的点存储在一个数组中

(2)参数说明

  • 给的参数例子:(pcd.points[100],100), 第一个参数为开始索引的点,第二个参数是索引的个数
  • 返回值[k, idx, _] ,其中k为索引的个数,idx为返回的点的索引 

 (3)代码例子

import open3d as o3d
import numpy as np

 
#(1)读取模型文件
pcd = o3d.io.read_point_cloud(r"D:/RGBD_CAMERA/python_3d_process/bunny.ply")
#(2)给模型一个统一的初始颜色
pcd.paint_uniform_color([0.5, 0.5, 0.5])
#(3)创建KD树
pcd_tree = o3d.geometry.KDTreeFlann(pcd)
#(4)将接下来要初始索引的点(第100个点)颜色设置位红色,RGB
pcd.colors[100] = [1, 0, 0]
#(5)开始索引 
#其中k为索引的个数,idx为返回的点的索引 
#(pcd.points[100],100), 第一个参数为开始索引的点,第二个参数是索引的个数
[k, idx, _] = pcd_tree.search_knn_vector_3d(pcd.points[100],100)

#(6)索引的结果给他们赋颜色,绿色,RGB
np.asarray(pcd.colors)[idx[1:], :] = [0, 1, 0]
#(7)最后显示一下
o3d.visualization.draw_geometries([pcd],width=1200,height=1000)

(4)效果图

3.2半径领域搜索

(1)函数

Search_radius_vector_3d,查询所有和查询点距离小于给定半径的点。

 (2)参数

  • 输入参数例子(pcd.points[1000],0.02),第一个参数为开始索引的点,第二个参数是索引的半径大小
  • 返回值[k, idx, _] ,其中k为索引的个数,idx为返回的点的索引 

(3)代码测试

import open3d as o3d
import numpy as np

 
#(1)读取模型文件
pcd = o3d.io.read_point_cloud(r"D:/RGBD_CAMERA/python_3d_process/bunny.ply")
#(2)给模型一个统一的初始颜色
pcd.paint_uniform_color([0.5, 0.5, 0.5])

# #-------------------------------------------------------------
# #(一)近邻搜索
# #-------------------------------------------------------------
# #(1)创建KD树
# pcd_tree = o3d.geometry.KDTreeFlann(pcd)
# #(2)将接下来要初始索引的点(第100个点)颜色设置位红色,RGB
# pcd.colors[100] = [1, 0, 0]
# #(3)开始索引 
# #其中k为索引的个数,idx为返回的点的索引 
# #(pcd.points[100],100), 第一个参数为开始索引的点,第二个参数是索引的个数
# [k, idx, _] = pcd_tree.search_knn_vector_3d(pcd.points[100],100)
# #(4)索引的结果给他们赋颜色,绿色,RGB
# np.asarray(pcd.colors)[idx[1:], :] = [0, 1, 0]
# #(5)最后显示一下
# o3d.visualization.draw_geometries([pcd],width=1200,height=1000)


#-------------------------------------------------------------
#(二)半径搜索
#-------------------------------------------------------------
#(1)创建KD树
pcd_tree = o3d.geometry.KDTreeFlann(pcd)
#(2)将接下来要初始索引的点(第100个点)颜色设置位红色,RGB
pcd.colors[1000] = [1, 0, 0]
#(3)开始索引 
#其中k为索引的个数,idx为返回的点的索引 
#(pcd.points[1000],0.02), 第一个参数为开始索引的点,第二个参数是索引的半径大小
[k, idx, _] = pcd_tree.search_radius_vector_3d(pcd.points[1000],0.02)
#(4)索引的结果给他们赋颜色,绿色,RGB
np.asarray(pcd.colors)[idx[1:], :] = [0, 0, 1]
#(5)最后显示一下
o3d.visualization.draw_geometries([pcd],width=1200,height=1000)

(4)效果图

 

 3.3混合搜索

(1)函数

Search_hybrid_vector_3d,最多返回k个和被查询点距离小于给定半径的最近邻点。 

(2)参数 

  • 输入参数例子(pcd.points[8000],0.03, 200),第一个参数为开始索引的点,第二个参数是索引的半径大小,第三个参数是返回最多多少个值
  • 返回值[k, idx, _] ,其中k为索引的个数,idx为返回的点的索引 

(3)代码

import open3d as o3d
import numpy as np

 
#(1)读取模型文件
pcd = o3d.io.read_point_cloud(r"D:/RGBD_CAMERA/python_3d_process/bunny.ply")
#(2)给模型一个统一的初始颜色
pcd.paint_uniform_color([0.5, 0.5, 0.5])

#-------------------------------------------------------------
#(一)近邻搜索
#-------------------------------------------------------------
#(1)创建KD树
pcd_tree = o3d.geometry.KDTreeFlann(pcd)
#(2)将接下来要初始索引的点(第100个点)颜色设置位红色,RGB
pcd.colors[100] = [1, 0, 0]
#(3)开始索引 
#其中k为索引的个数,idx为返回的点的索引 
#(pcd.points[100],100), 第一个参数为开始索引的点,第二个参数是索引的个数
[k, idx, _] = pcd_tree.search_knn_vector_3d(pcd.points[100],100)
#(4)索引的结果给他们赋颜色,绿色,RGB
np.asarray(pcd.colors)[idx[1:], :] = [0, 1, 0]
#(5)最后显示一下
# o3d.visualization.draw_geometries([pcd],width=1200,height=1000)


#-------------------------------------------------------------
#(二)半径搜索
#-------------------------------------------------------------
#(1)创建KD树
# pcd_tree = o3d.geometry.KDTreeFlann(pcd)
#(2)将接下来要初始索引的点(第100个点)颜色设置位红色,RGB
pcd.colors[1000] = [1, 0, 0]
#(3)开始索引 
#其中k为索引的个数,idx为返回的点的索引 
#(pcd.points[1000],0.02), 第一个参数为开始索引的点,第二个参数是索引的半径大小
[k, idx, _] = pcd_tree.search_radius_vector_3d(pcd.points[1000],0.02)
#(4)索引的结果给他们赋颜色,绿色,RGB
np.asarray(pcd.colors)[idx[1:], :] = [0, 0, 1]
#(5)最后显示一下
# o3d.visualization.draw_geometries([pcd],width=1200,height=1000)



#-------------------------------------------------------------
#(三)混合搜索
#-------------------------------------------------------------
#(1)创建KD树
# pcd_tree = o3d.geometry.KDTreeFlann(pcd)
#(2)将接下来要初始索引的点(第100个点)颜色设置位红色,RGB
pcd.colors[8000] = [1, 0, 0]
#(3)开始索引 
#其中k为索引的个数,idx为返回的点的索引 
#(pcd.points[1000],0.02), 第一个参数为开始索引的点,第二个参数是索引的半径大小,第三个参数是返回最多多少个值
[k, idx, _] = pcd_tree.search_hybrid_vector_3d(pcd.points[8000],0.03, 200)
#(4)索引的结果给他们赋颜色,绿色,RGB
np.asarray(pcd.colors)[idx[1:], :] = [0, 1, 1]
#(5)最后显示一下
o3d.visualization.draw_geometries([pcd],width=1200,height=1000)

(4)三个搜索综合显示

 

 

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

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

相关文章

12【MyBatis注解开发】

文章目录三、Mybatis注解开发3.1 快速入门3.1.1 常用注解说明3.1.2 注解实现开发3.2 注解实现一对一映射3.2.1 接口3.2.2 测试类3.3 注解实现一对多映射3.2.1 接口3.2.2 测试类三、Mybatis注解开发 3.1 快速入门 3.1.1 常用注解说明 注解功能Insert新增Update更新Delete删除…

创新指南|如何以STEPPS模型6招打造病毒式传播产品

从爆款产品到网络流行语,这种流行绝对不是依赖于运气,更不是神话。让人们喜欢读某些文章,让人们尝试某项新服务,甚至是投票竞选,这些事情的背后都有STEPPS模型的驱动,遵循或者仅仅应用STEPPS中的某几条&…

【毕业设计】21-基于单片机的智能恒温箱_温度报警装置设计(原理图+仿真+源代码+答辩论文+答辩PPT)

【毕业设计】21-基于单片机的智能恒温箱/温度报警装置设计(原理图仿真源代码答辩论文答辩PPT) 文章目录【毕业设计】21-基于单片机的智能恒温箱/温度报警装置设计(原理图仿真源代码答辩论文答辩PPT)任务书设计说明书摘要设计框架架…

Tomcat:servlet与servlet容器

前言 在介绍Tomcat之前,我们首先需要了解它的作用,简单的说,tomcat就是一个servlet容器。因此,本文首先从Web 应用程序开始讲起,逐步介绍servlet。 Web即表示网页的意思,它用于表示 Internet 主机上供外界访…

【Android App】GPS获取定位经纬度和根据经纬度获取详细地址讲解及实战(附源码和演示 超详细)

需要全部代码请点赞关注收藏后评论区留言私信~~~ 一、获取定位信息 开启定位相关功能只是将定位的前提条件准备好,若想获得手机当前所处的位置信息,还要依靠下列的3种定位工具。 (1)定位条件器Criteria 定位条件器用于设置定位的…

如何从报表控件FastReport .NET中连接到 PostgreSQL 数据库?

FastReport.NET官方版下载 Fastreport是目前世界上主流的图表控件,具有超高性价比,以更具成本优势的价格,便能提供功能齐全的报表解决方案,连续三年蝉联全球文档创建组件和库的“ Top 50 Publishers”奖。 慧都科技是Fast Repor…

Nacos注册中心和服务消费方式(服务治理)

目录 一、服务治理介绍 什么是服务治理? 二、nacos简介 三、nacos实战入门 1.搭建nacos环境 2.将商品、订单、微服务注册到nacos 四、实现服务调用的负载均衡 1.什么是负载均衡 2. DiscoveryClient实现负载均衡 3.Ribbon实现负载均衡 Ribbon支持的负载…

Nacos作为配置中心详解

前言 在单体架构的时候我们可以将配置写在配置文件中,但有⼀个缺点就是每次修改配置都需要重启服务才能生效。 当应用程序实例比较少的时候还可以维护。如果转向微服务架构有成百上千个实例,每修改⼀次配置要将全部实例重启,不仅增加了系统的…

Spring Boot FailureAnalyzer 应用场景

Spring Boot 自定义FailureAnalyzer 今天在学习Spring Boot 源码的过程中,在spring.factories 文件中无意中发现了FailureAnalyzer 这个接口。由于之前没有接触过,今天来学习一下 FailureAnalyzer 接口的作用。 在学习FailureAnalyzer之前, 我们先看以…

Spark 3.0 - 8.ML Pipeline 之决策树原理与实战

目录 一.引言 二.决策树基础-信息熵 三.决策树的算法基础 - ID3 算法 四.ML 中决策树的构建 1.信息增益计算 2.连续属性划分 五.ML 决策树实战 1.Libsvm 数据与加载 2.StringIndexer 3.VectorIndexer 4.构建决策树与 Pipeline 5.测试与评估 6.获取决策树 六.总结…

【学习笔记67】JavaScript中的闭包

一、认识函数的过程 1. 定义 在堆内存中开辟一段内存空间(XF001)把函数体的内容,完全百分百的照抄一份,存放在内存空间中(XF001)把内存空间的地址(XF001) 赋值给函数名2. 调用 根据函数名内存储的地址 (XF001) ,去堆内存中找到对应函数会去…

Nginx安装Openresty加载Lua代码

1、下载 VM环境:ubuntu 16 http://openresty.org/cn/download.html 我选择的是截图红框的那个版本,其他高级的版本,我编译的时候都会报错,所以选择了这个版本,大家编译失败的时候不要放弃,继续选择其他版…

【PS-8】选区

目录 矩形选框工具 先选区再按【shift】,正方形选区 选区的同时按【ALT】,从中心点选区 选区时按【shiftalt】,从中心点建立正方形选区 模式1:添加到选区 模式2:新选区 模式3: 从选区减去 模式4&am…

《C++Primer》-1-前序与基础第I部分重点

文章目录第一章 开始1. c之与其他语言的优点?2. c语言的组成3. 标准输入输出cin、cout4. include格式第二章 变量和基本类型1. 无符号数的使用注意2. 初始化注意事项3. 声明与定义4. 标识符的下划线规则5. &引用、取地址&、指针的区别6. 如何理解“因为引用…

Rainbow Brackets的配色修改和使用

修改配色:) 敲好看内!! 记得每个都要改噢! 5分别对应的是: 圆括号 方括号 波形括号 尖括号 6分别对应的是: ECB1E9 F6F0A9 78B8EF F3BBA2 A9D57E 使用方式 Ctrl 鼠标右键:高亮{}…

C++ Reference: Standard C++ Library reference: Containers: list: list: end

C官网参考链接&#xff1a;https://cplusplus.com/reference/list/list/end/ 公有成员函数 <list> std::list::end C98 iterator end(); const_iterator end() const; C11 iterator end() noexcept; const_iterator end() const noexcept; 返回结束迭代器 返回一个指向…

企业日常公关如何抵御负面信息的入侵?

如今&#xff0c;互联网时代信息传播速度极快&#xff0c;这使得宣传工作效率倍增&#xff0c;也给企业舆情管理带来一定的挑战。舆情优化搞得好&#xff0c;企业宣传工作事半功倍&#xff0c;网络舆论走向负面的话&#xff0c;则对宣传工作非常不利&#xff0c;会导致推广效果…

Echart 柱状图,X轴斜着展示

option { color: [‘#3398DB’], tooltip: { trigger: ‘axis’, axisPointer: { // 坐标轴指示器&#xff0c;坐标轴触发有效 type: ‘shadow’ // 默认为直线&#xff0c;可选为&#xff1a;‘line’ | ‘shadow’ } }, grid: { left: ‘3%’, right: ‘4%’, bottom: ‘3%’…

go-zero服务自动收集线上问题线上实战

前言 ​ 对于pprof&#xff0c;相信熟悉go语言的程序员基本都不陌生&#xff0c;一般线上的问题都是靠它可以快速定位。但是实际项目中&#xff0c;很多时候我们为了性能都不会开启它&#xff0c;但是出了问题又要靠它来分析。好在go-zero已经帮我们很好的集成进来了&#xff…

Leu-Trp-Leu-COOH,42293-99-2

编号: 122381中文名称: 三肽Leu-Trp-Leu英文名: Leu-Trp-LeuCAS号: 42293-99-2单字母: H2N-LWL-OH三字母: H2N-Leu-Trp-Leu-COOH氨基酸个数: 3分子式: C23H34N4O4平均分子量: 430.54精确分子量: 430.26等电点(PI): 6.11pH7.0时的净电荷数: -0.02平均亲水性: -2.3333333333333疏…