激光雷达(LiDAR)| Open3D:第二节 邻近搜索之构建KDTree

这篇具有很好参考价值的文章主要介绍了激光雷达(LiDAR)| Open3D:第二节 邻近搜索之构建KDTree。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本节将介绍Open3D开源库:KDTree的原理及构建,将无序点云变为有序点云,实现点云的快速邻近搜索。

激光雷达(LiDAR)| Open3D:第二节 邻近搜索之构建KDTree


1.KDTree 概述

Open3D使用FLANN构建KDTrees,将无序点云变为有序点云,以便快速检索最近邻。
在激光雷达中,一般使用的是三维点云。所以,kd-tree的维度是3。
KDTree(k 维树)是一种空间分区数据结构,它将一组 k 维点存储在树结构中,从而实现高效的范围搜索最近邻搜索最近邻搜索是处理点云数据时的核心操作,可用于查找点组或要素描述符之间的对应关系,或定义一个或多个点周围的局部邻域。

具体KD-Tree原理详解参考以下文章:

  • KD-Tree原理详解:https://zhuanlan.zhihu.com/p/112246942
  • 三维点云学习(2)中-Kd-tree (k-dimensional tree):https://blog.csdn.net/weixin_41281151
    激光雷达(LiDAR)| Open3D:第二节 邻近搜索之构建KDTree
    激光雷达(LiDAR)| Open3D:第二节 邻近搜索之构建KDTree

2.KDTree 算法流程

2.1 构建KDtree

首先,读取点云并渲染为灰色便于后面显示搜索到的点云,通过o3d.geometry.KDTreeFlann函数建立树结构

pcd = o3d.io.read_point_cloud("./tree/Tree_singel.pcd")
o3d.visualization.draw_geometries([pcd],width = 700, height = 900)
pcd.paint_uniform_color([0.5, 0.5, 0.5])  # 渲染为灰色
o3d.visualization.draw_geometries([pcd],width = 700, height = 900)
pcd_tree = o3d.geometry.KDTreeFlann(pcd)  # 建立树结构

激光雷达(LiDAR)| Open3D:第二节 邻近搜索之构建KDTree

2.2 搜索相邻点

将第480000个点作为锚点并渲染成红色

pcd.colors[48000] = [1, 0, 0]  # 将该点作为锚点并渲染为红色

激光雷达(LiDAR)| Open3D:第二节 邻近搜索之构建KDTree

2.3 邻近搜索

法1:KNN最近邻近搜索

采用search_knn_vector_3d函数实现,返回锚点的 k 个最近邻的索引列表。使用np.asarray转换为 numpy 数组以批量访问点颜色,将相邻点渲染成蓝色。搜索时会跳过第一个索引,因为它是锚点本身。

# 方法1:KNN领域搜索
pcd.colors[48000] = [1, 0, 0]  # 将该点作为锚点并渲染为红色
[k, idx, _] = pcd_tree.search_knn_vector_3d(pcd.points[48000], 300)
np.asarray(pcd.colors)[idx[1:], :] = [0, 0, 1] # 渲染成蓝色

激光雷达(LiDAR)| Open3D:第二节 邻近搜索之构建KDTree

法2:RNN半径邻近搜索

采用search_radius_vector_3d函数查询到锚点的距离小于给定半径的所有点。

# 方法2:RNN半径领域搜索
pcd.colors[2500] = [1, 0, 0]  # 将该点作为锚点并渲染为红色
[k1, idx1, _] = pcd_tree.search_radius_vector_3d(pcd.points[2500], 0.2) # 半径搜索
np.asarray(pcd.colors)[idx1[1:], :] = [0, 1, 0] # 半径搜索结果并渲染为绿色
o3d.visualization.draw_geometries([pcd], width = 700, height = 900)

激光雷达(LiDAR)| Open3D:第二节 邻近搜索之构建KDTree

法3:RKNN混合搜索

采用search_hybrid_vector_3d函数实现,结合 KNN 搜索和 RNN 搜索的条件最多返回K个和锚点距离小于给定半径的最邻近点。在许多实际情况下具有性能优势,并在Open3D的许多函数中大量使用。

# 法3:混合搜索
pcd.colors[222] = [1, 0, 0]
[k2, idx2, _] = pcd_tree.search_hybrid_vector_3d(pcd.points[222], 0.5,200) # RKNN混合搜索
np.asarray(pcd.colors)[idx2[1:], :] = [0, 1, 0.8]#半径搜索结果并渲染为青色
o3d.visualization.draw_geometries([pcd], width = 700, height = 900)

激光雷达(LiDAR)| Open3D:第二节 邻近搜索之构建KDTree

总结

本节介绍采用开源点云处理库Open3D之构建KDtree树实现点云的快速邻近搜索。


激光雷达(LiDAR)| Open3D:第二节 邻近搜索之构建KDTree文章来源地址https://www.toymoban.com/news/detail-446172.html

到了这里,关于激光雷达(LiDAR)| Open3D:第二节 邻近搜索之构建KDTree的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 使用激光雷达(LiDAR)和相机进行3D物体跟踪

    使用激光雷达(LiDAR)和相机进行3D物体跟踪

    使用相机和激光雷达进行时间到碰撞(TTC)计算 在我的先前文章中,我介绍了通过检测关键点和匹配描述符进行2D特征跟踪的主题。在本文中,我将利用这些文章中的概念,以及更多的内容,开发一个软件流水线,使用相机和激光雷达测量在3D空间中检测和跟踪对象,并使用

    2024年02月05日
    浏览(11)
  • 【Open3D】如何在CMake/C++中调用Open3D

    qquad Open3D是点云的开源处理库,支持Python或C++。其Python已有较全的教程,也可以直接使用 pip install open3d 直接进行安装,而若想在C++中调用Open3D则麻烦一些,需要满足以下条件: Open3D git源代码(本教程针对0.16.1的版本) CMake = 3.20 clang = 7 分为以下几步进行: 下载Open3D源代码

    2023年04月18日
    浏览(8)
  • open3d教程(一):open3d的安装和测试(Python版本)

    Open3d:用于3D数据处理的现代库。 Open3D 是一个开源库,支持快速开发处理 3D 数据的软件。 Open3D 前端在 C++ 和 Python 中公开了一组精心挑选的数据结构和算法。后端经过高度优化,并设置为并行化。我们欢迎来自开源社区的贡献。 Open3d的核心功能: 3D数据结构 3D数据处理算法

    2024年02月17日
    浏览(21)
  • 基于Open3D的点云处理17-Open3d的C++版本

    基于Open3D的点云处理17-Open3d的C++版本

    http://www.open3d.org/docs/latest/cpp_api.html http://www.open3d.org/docs/latest/getting_started.html#c http://www.open3d.org/docs/release/cpp_project.html#cplusplus-example-project https://github.com/isl-org/open3d-cmake-find-package https://github.com/isl-org/open3d-cmake-external-project https://github.com/isl-org/Open3D/releases Note: -DBUILD_SHARED_LIBS

    2024年02月09日
    浏览(28)
  • open3d 0.17.0的open3d.visualization.ViewControl类有bug

    在使用过程中发现 open3d.visualization.ViewControl 的如下方法,在 open3d 0.17.0 环境下不起作用,点云的显示视场还是默认配置;而在 open3d 0.16.0 环境下却正常工作。 rotate set_front set_lookat set_up set_zoom 上述测试代码在如下虚拟环境中进行过测试,均失败。 在如下虚拟环境中正常工作

    2024年02月21日
    浏览(9)
  • Open3D点云数据处理(一):VSCode配置python,并安装open3d教程

    Open3D点云数据处理(一):VSCode配置python,并安装open3d教程

    专栏地址:https://blog.csdn.net/weixin_46098577/category_11392993.html 在很久很久以前,我写过这么一篇博客,讲的是open3d点云处理的基本方法。👇 当时是 PyCharm + Anaconda + python3.8 + open3d 0.13 已经是2023年了,现在有了全新版本。目前python由当年的3.8更新到了3.11版本,open3d也从0.13来到了

    2024年02月07日
    浏览(18)
  • 【Open3D可视化——添加标签】:如何在Open3D的可视化窗口中添加文字标签?

    【Open3D可视化——添加标签】:如何在Open3D的可视化窗口中添加文字标签? Open3D是一个基于Python语言开发的跨平台开源工具包,主要用于三维数据处理和可视化。在进行三维数据可视化过程中,往往需要在场景中添加标签来标识物体、点云等信息。本文将介绍如何在Open3D的可

    2024年02月11日
    浏览(126)
  • Open3D学习笔记

    Open3D是一个开源库,它支持处理3D数据的软件的快速开发。Open3D前端在C++和Python中有一些公开的数据结构和算法。后端经过高度优化,并设置为并行化。 PCL也是3D点云数据处理的优秀开源库,在C++平台上表现较好,但是在Python上python-pcl长时间不更新,维护少,不太好用,不建

    2024年02月01日
    浏览(10)
  • 什么是open3D?

    什么是open3D?

    目录 一、说明 二、如何安装open3d?  三、显示点云数据 3.1 显示点云场景数据 3.2 体素下采样 3.3 顶点法线估计         对于点云 处理,这里介绍哦pen3d,该软件和opencv同样是interl公司的产品。         Open3D 是一个开源库,支持快速开发处理 3D 数据的软件。 Open3D 前

    2024年02月03日
    浏览(9)
  • Open3D读取文件

    Open3D读取文件

    Open3D可以读取点云文件,三角网格文件,也可以读取图片。具体方法如下: 一、点云文件操作         Open3D支持的文件格式有xyz,xyzn,xyzrgb,pts,ply,pcd等文件。读取的方式也非常简单。data = o3d.io.read_point_cloud(\\\"文件名“) 1、读写文件         函数原型如下:    

    2024年02月08日
    浏览(13)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包