slam系列1:open3d入门笔记

news2024/11/24 6:41:46

1. 读写数据

这里有很多测试用的pcd文件:
https://github.com/PointCloudLibrary/data/blob/master/tutorials/

import open3d as o3d
pcd = o3d.io.read_point_cloud("test.pcd")
o3d.io.write_point_cloud("write.pcd", pcd, True)	# 默认false,保存为Binarty;True 保存为ASICC形式
# o3d.visualization.draw_geometries([pcd]) # 传统画图法
o3d.visualization.draw_plotly_server([pcd]) # 在jupyter内展示,但是只能绘制点云

在这里插入图片描述

2. 常用工具

2.1 几何

# 读写
## 读取rgbd数据
pcd = o3d.geometry.PointCloud.create_from_rgbd_image(rgbd_image,o3d.camera.PinholeCameraIntrinsic(
		o3d.camera.PinholeCameraIntrinsicParameters.PrimeSenseDefault))
##

## 直接读取
pcd = o3d.io.read_point_cloud(...)
# 绘制法线
pcd.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid(0.1, 30))     # 执行法线估计
o3d.visualization.draw_geometries([pcd], point_show_normal = True)

# 建立KDTree用于近邻查询
pcd_tree = o3d.geometry.KDTreeFlann(pcd)
pcd.paint_uniform_color([0.5, 0.5, 0.5])
# 使用K近邻,将第1500个点最近的5000个点设置为蓝色
[num_k, idx_k, _] = pcd_tree.search_knn_vector_3d(pcd.points[1500], 1000)    # 返回邻域点的个数和索引
np.asarray(pcd.colors)= [0, 0, 1]  # 进行赋色

# 建立八叉树用于空间划分
octree = o3d.geometry.Octree(max_depth=10)
octree.convert_from_point_cloud(pcd, size_expand=0.1)
o3d.visualization.draw_geometries([octree])

# 获取体素及下采样
voxel_grid = o3d.geometry.VoxelGrid.create_from_point_cloud(pcd, voxel_size=0.2)
downpcd = pcd.voxel_down_sample(0.5)


# compute_point_cloud_distance方法为源点云中的每个点计算到目标点云中最近点的距离。
dists = pcd1.compute_point_cloud_distance(pcd2)

# pcd.get_center() 获取质心
# pcd.select_by_index() 根据下标列表获取点云子集
# pcd.get_axis_aligned_bounding_box() 获取轴线方向最小包围盒
# pcd.get_oriented_bounding_box() 获取最小包围盒
# pcd.crop_point_cloud() 进行裁剪
# 计算点云凸包
hull, _ = pcd.compute_convex_hull()
hull_ls = o3d.geometry.LineSet.create_from_triangle_mesh(hull)


2.2 滤波

统计滤波
在这里插入图片描述
半径滤波
在这里插入图片描述

# 滤波例子
num_neighbors = 20 # K邻域点的个数
std_ratio = 2.0 # 标准差乘数
# 执行统计滤波,返回滤波后的点云sor_pcd和对应的索引ind
sor_pcd, ind = pcd.remove_statistical_outlier(num_neighbors, std_ratio)
sor_pcd.paint_uniform_color([0, 0, 1])
sor_noise_pcd = pcd.select_by_index(ind,invert = True)
sor_noise_pcd.paint_uniform_color([1, 0, 0])

2.3 聚类和分割

# 聚类例子
print("->正在DBSCAN聚类...")
eps =5    # 同一聚类中最大点间距
min_points = 10   # 有效聚类的最小点数
labels = np.array(pcd.cluster_dbscan(eps, min_points, print_progress=True))
max_label = labels.max()    # 获取聚类标签的最大值 [-1,0,1,2,...,max_label],label = -1 为噪声,因此总聚类个数为 max_label + 1
print(f"point cloud has {max_label + 1} clusters")
colors = plt.get_cmap("tab20")(labels / (max_label if max_label > 0 else 1))
colors[labels < 0] = 0  # labels = -1 的簇为噪声,以黑色显示
pcd.colors = o3d.utility.Vector3dVector(colors[:, :3])
o3d.visualization.draw_plotly_server([pcd])

# 平面分割
print("->正在RANSAC平面分割...")
distance_threshold = 0.2    # 内点到平面模型的最大距离
ransac_n = 3                # 用于拟合平面的采样点数
num_iterations = 1000       # 最大迭代次数
# 返回模型系数plane_model和内点索引inliers,并赋值
plane_model, inliers = pcd.segment_plane(distance_threshold, ransac_n, num_iterations)
[a, b, c, d] = plane_model
print(f"Plane equation: {a:.2f}x + {b:.2f}y + {c:.2f}z + {d:.2f} = 0")
# 平面内点点云
inlier_cloud = pcd.select_by_index(inliers)
inlier_cloud.paint_uniform_color([0, 0, 1.0])
print(inlier_cloud)
# 平面外点点云
outlier_cloud = pcd.select_by_index(inliers, invert=True)
outlier_cloud.paint_uniform_color([1.0, 0, 0])
print(outlier_cloud)

# 隐藏点去除
print("->正在剔除隐藏点...")
diameter = np.linalg.norm(np.asarray(pcd.get_max_bound()) - np.asarray(pcd.get_min_bound()))
print("定义隐藏点去除的参数")
camera = [0, 0, diameter]       # 视点位置
radius = diameter * 100         # 噪声点云半径,The radius of the sperical projection
_, pt_map = pcd.hidden_point_removal(camera, radius)    # 获取视点位置能看到的所有点的索引 pt_map
# 可视点点云
pcd_visible = pcd.select_by_index(pt_map)
pcd_visible.paint_uniform_color([0, 0, 1])	# 可视点为蓝色
print("->可视点个数为:", pcd_visible)
# 隐藏点点云
pcd_hidden = pcd.select_by_index(pt_map, invert = True)
pcd_hidden.paint_uniform_color([1, 0, 0])	# 隐藏点为红色
print("->隐藏点个数为:", pcd_hidden)
print("->正在可视化可视点和隐藏点点云...")
o3d.visualization.draw_plotly_server([pcd_visible, pcd_hidden])

2.4 曲面重建

目前实现了如下几种:
在这里插入图片描述

mesh, densities  = o3d.geometry.TriangleMesh.create_from_point_cloud_poisson(pcd, depth=8)
mesh  = o3d.geometry.TriangleMesh.create_from_point_cloud_alpha_shape(pcd,8)

我们对比一下效果
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2.5 空间变换

# 平移
pcd.translate((tx,ty,tz),relative=True)
# 旋转
R1 = pcd.get_rotation_matrix_from_xyz((0,np.pi/2,0))
pcd.rotate(R1)   

# 点云缩放
pcd.scale(0.5,center=(1,1,1))	

# 一般变换:4×4变换矩阵,前3行3列为旋转矩阵,第4列前3行为平移向量,右下角为缩放系数。
pcd_scale2.transform(T)

在这里插入图片描述

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

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

相关文章

SF6气体密度监测仪市场研究:主要企业的市场份额已超过37.13%

SF6气体密度监测仪是一种专用于监测和测量六氟化硫&#xff08;SF6&#xff09;气体密度的设备。SF6气体因其优异的绝缘性能和灭弧能力&#xff0c;被广泛应用于电力行业&#xff0c;尤其是在气体绝缘金属封闭开关设备&#xff08;GIS&#xff09;和断路器等关键设备中。随着电…

Java 函数式编程(1 万字)

此笔记来自于B站黑马程序员 good Java 历史版本及其优势 函数式编程, Stream API 一.函数伊始函数、函数对象 函数对象 行为参数法 延迟执行 a-lambda b-方法引用 复习小测 Math::random () -> Math.random()Math::sqrt (double number) -> Math.sqrt(number)Student:…

喜大普奔!eBay英国站取消个人卖家几乎所有销售费用!

二手电商市场竞争愈发激烈&#xff0c;eBay开始放大招了&#xff01;为什么说是取消个人卖家的几乎所有销售费用呢&#xff1f;一起来了解一下—— eBay英国站个人卖家无需支付最终交易费或监管运营费&#xff0c;这大大减轻了个人卖家的交易成本。不过需要注意的是&#xff0…

后端开发——规则引擎简介(Drools)

目录 什么是规则引擎&#xff1f;规则引擎带来的好处;Drools案例规则引擎的工作原理及应用场景常见的规则引擎及对比工作流引擎与规则引擎有什么不同 什么是规则引擎&#xff1f; 规则引擎&#xff0c;听起来高大上&#xff0c;其实可以理解为一种帮助你做“决策”的工具。你可…

使用浏览器原生API实现录屏功能

好早之前写了个小deme,本来都忘了,现在无意中又翻出来了,所以也来记录一下吧! 废话不说了,直接上代码了: <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content=&q…

byte[]/InputStream/MultipartFile之间进行转换

前言 问题产生&#xff1a; 最近开发项目的时候&#xff0c;遇到了文件上传对象转换的问题 -> 我在对接抖音开放平台的时候&#xff0c;有一个图片上传的接口&#xff0c;需要将byte[]转为MultipartFile 对象&#xff0c;但是发现根本没有这样的工具类&#xff0c;后面翻阅…

无人机之巡航控制篇

一、巡航控制的基本原理 无人机巡航控制的基本原理是通过传感器检测无人机的飞行状态和环境信息&#xff0c;并将其反馈给控制器。控制器根据反馈信息和任务需求&#xff0c;计算出无人机的控制指令&#xff0c;并将其发送给执行机构。执行机构根据控制器的控制指令&#xff0c…

数据结构与算法——Java实现 33.堆排序

刻意去找的东西&#xff0c;往往是找不到的。 天下万物的来和去&#xff0c;都有它的时间。 —— 24.10.10 使用堆进行排序 算法描述 1.heapify 建立大顶堆&#xff08;所有结点的父元素大于子元素&#xff09; 2.将堆顶与堆底交换(最大元素被交换到堆底)&#xff0c;缩小并…

Python测试框架--Allure

严格意义上讲 Allure 不算是测试框架&#xff0c;但是它是生成漂亮测试报告的开源工具&#xff0c;搭配 Pytest 测试框架食用更搭。 也就是说 Allure 是在 Pytest 执行完生成的测试数据的基础上&#xff0c;对测试数据进行处理统计&#xff0c;生成格式统一、美观的测试报告。 …

java反射Class类的api

目录 Class类 1.构造器相关 1&#xff09;Constructor getConstructor(Class... parameterTypes): 2&#xff09;Constructor[] getConstructors(): 3&#xff09;Constructor getDeclaredConstructor(Class... parameterTypes): 4&#xff09;Constructor[] getDeclaredConstr…

国外火出圈儿的PM御用AI编程工具Bolt.new效果干不过国产的CodeFlying?号称全新定义全栈开发流程?

不知道大家最近有没有发现国外的很多AI都在挤破脑袋想去提升大模型的编程能力&#xff0c; 离我们最近的是上周Openai 发布的全新模型GPT-4o-Canvas&#xff0c; 拥有超强的代码编写能力。 另外还有LlamaCoder、Cursor、Claude artifacts、Replit... 光是今年一年就推出了好…

深入理解Transformer的笔记记录(精简版本)---- Transformer

自注意力机制开启大规模预训练时代 1 从机器翻译模型举例 1.1把编码器和解码器联合起来看待的话,则整个流程就是(如下图从左至右所示): 1.首先,从编码器输入的句子会先经过一个自注意力层(即self-attention),它会帮助编码器在对每个单词编码时关注输入句子中的的其他单…

xtu oj 四位数

样例输入# 2 1990 1111样例输出# 5 0 分离整数与合并 AC代码 #include<stdio.h> //判断四个数码是否相等 int Judge(int n){int flag1;int gn%10,sn/10%10,bn/100%10,qn/1000;if(gs&&gb&&gq)flag0;return flag; } int main(){int T;scanf("%d…

AI无人直播风口,云微客替你抓住了

现在很多老板都在找风口&#xff0c;其实风口就是我们大家看得见、摸得着的东西&#xff0c;就比如说近期比较火热的直播带货就属于是一个风口。可能很多老板会说直播、短视频之类的风口过于高科技&#xff0c;搞不来也搞不懂&#xff0c;跟自己好像没太大关系。 其实不然&…

嵌入式开发:STM32 硬件 CRC 使用

测试平台&#xff1a;STM32G474系列 STM32硬件的CRC不占用MCU的资源&#xff0c;计算速度快。由于硬件CRC需要配置一些选项&#xff0c;配置不对就会导致计算结果错误&#xff0c;导致使用上没有软件计算CRC方便。但硬件CRC更快的速度在一些有时间资源要求的场合还是非…

【二叉搜索树】1 leetcode 98 验证二叉搜索树

1 题目描述 题目链接&#xff1a;验证二叉搜索树 2 题目解析 搜索二叉树的特点就是&#xff0c; 中序遍历之后的值是有序的。 根据这个性质&#xff0c;可以对树进行中序遍历&#xff0c;将遍历的结果存入到vector中最后判断vector中的值的顺序。如果是从小到大有序的&…

变色龙算法(CSA)的MATLAB代码复现

目录 1 变色龙算法优化BP神经网络代码复现 2 变色龙算法优化支持向量机代码复现 3 变色龙算法优化长短期记忆神经网络代码复现 1 变色龙算法优化BP神经网络代码复现 1&#xff09;单输出回归预测&#xff1a;单输出回归预测&#xff1a;变色龙算法优化BP神经网络模型&#…

MinIO分片上传超大文件(纯服务端)

目录 一、MinIO快速搭建1.1、拉取docker镜像1.2、启动docker容器 二、分片上传大文件到MinIO2.1、添加依赖2.2、实现MinioClient2.3、实现分片上传2.3.0、初始化MinioClient2.3.1、准备分片上传2.3.2、分片并上传2.3.2.1、设置分片大小2.3.2.2、分片 2.3.3、分片合并 三、测试3…

Windows命令行执行cmake

生成Win32 工程并编译 cmake ../../ -G "Visual Studio 16 2019" -A Win32set pathC:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin;%path%msbuild VideoNetOptimization.sln /p:ConfigurationRelWithDebInfo /p:PlatformWin3…

MSYS2+GCC 安装与应用保姆手册

msys2 提供可在Windows下使用 GCC 编译器&#xff1b;并且&#xff0c;借助 Linux 包管理功能&#xff0c;可轻松下载丰富的可在Windows下直接使用的 C/C 开发包&#xff0c;包括编译好的二进制包。 网络库asio、准标准库boost、zip解压缩、json格式处理、引擎 SDL……十八般兵…