Open3d入门 点云拼接算法

news2024/9/22 3:59:09

图片

点云拼接(Point Cloud Stitching)是将从不同视角或位置获取的多组点云数据对齐到同一个坐标系中的过程,以形成一个完整的三维模型。这项技术在计算机视觉、机器人导航、三维重建和无人驾驶等领域有着广泛的应用。

点云配准(Point Cloud Registration)和点云拼接(Point Cloud Stitching)都是处理多组点云数据的技术。点云配准是指将不同视角或位置获取的点云数据对齐到同一个坐标系中,以确保它们在空间上正确对应;而点云拼接则是在配准的基础上,将这些对齐后的点云数据合并成一个完整的三维模型。两者的联系在于,点云拼接包含点云配准作为其关键步骤,只有准确完成配准,才能实现高质量的拼接。

发展历史

点云拼接的研究可以追溯到20世纪80年代初期,最初应用于医学成像领域。1987年,Besl和McKay提出了迭代最近点(ICP, Iterative Closest Point)算法,这是第一个广泛应用的点云拼接算法。ICP通过迭代优化过程,最小化两组点云之间的欧氏距离,实现点云的配准和拼接。

随着计算机视觉和三维激光扫描技术的发展,点云拼接技术也得到了显著提升。在2000年代中期,随着机器学习和优化算法的进步,许多改进ICP的变种算法被提出,如加权ICP、非刚性ICP等。进入21世纪后,高性能计算设备的普及使得处理大规模点云数据的算法逐渐成熟。

近年来,深度学习技术在点云处理中的应用也得到了广泛关注。PointNet、PointNet++等神经网络模型为点云配准提供了新的思路,通过学习特征表示,可以更加鲁棒地进行点云拼接。同时,SLAM(Simultaneous Localization and Mapping)技术的发展也极大地推动了实时点云拼接技术的进步。

关键算法

  1. 迭代最近点(ICP)算法:ICP算法是最经典的点云拼接算法,由Besl和McKay在1987年提出。ICP的基本步骤包括:选取初始变换矩阵、寻找最近点对、计算变换矩阵、应用变换矩阵更新点云位置,并重复上述过程直至收敛。ICP算法实现简单且收敛速度快,但对初始位置依赖较大,容易陷入局部最优。

  2. 基于特征的拼接算法:为了克服ICP算法的局限性,研究者提出了基于特征的拼接算法。这些算法首先在点云中提取关键点和特征描述符,如SIFT、SURF、SHOT等,然后通过匹配这些特征点进行初始配准,最后再通过ICP等方法进行精细对齐。基于特征的算法能够更好地处理具有重复结构或较大初始误差的点云。

  3. 鲁棒点云拼接算法:在实际应用中,点云数据常常受到噪声和外点的影响。为此,提出了一系列鲁棒点云拼接算法,如加权ICP、Trimmed ICP等。这些算法在ICP的基础上引入了加权机制或排除外点的策略,提高了拼接的鲁棒性和准确性。

  4. 深度学习方法:随着深度学习的发展,研究者开始利用神经网络进行点云拼接。PointNet、PointNet++等模型通过学习点云的特征表示,可以实现端到端的点云配准。此外,基于生成对抗网络(GAN)和变分自编码器(VAE)的模型也被用于点云拼接,取得了良好的效果。

  5. SLAM(Simultaneous Localization and Mapping)技术:SLAM技术在机器人导航和无人驾驶中得到广泛应用,其核心是实时构建环境地图并进行自身定位。SLAM技术中常用的点云拼接算法包括ORB-SLAM、LOAM等,这些算法结合了视觉、激光雷达等多种传感器数据,实现了高精度的实时点云拼接。

点云拼接技术不断发展,各类算法相互结合,使得点云拼接在复杂环境下也能取得良好的效果。随着计算资源的增加和算法的改进,点云拼接将继续在各个领域发挥重要作用。

点云拼接代码示例:

import numpy as np
import open3d as o3d
from copy import deepcopy
 
   
if __name__ == '__main__':
        file_path = 'bun000.ply'
        source = o3d.io.read_triangle_mesh(file_path)
        points1 = np.array(source.vertices) #转为矩阵
        file_path = 'bun045.ply'
        target = o3d.io.read_triangle_mesh(file_path)
        points2 = np.array(target.vertices) #转为矩阵

        threshold = 0.2 #距离阈值
        trans_init = np.array([[1.0, 0.0, 0.0, 0.0],
                                [0.0, 1.0, 0.0,   0.0],
                                [0.0, 0.0, 1.0, 0],
                                [0.0, 0.0, 0.0,   1.0]])
        #计算两个重要指标,fitness计算重叠区域(内点对应关系/目标点数)。越高越好。
        #inlier_rmse计算所有内在对应关系的均方根误差RMSE。越低越好。
        source = o3d.geometry.PointCloud()
        source.points = o3d.utility.Vector3dVector(points1)
        target = o3d.geometry.PointCloud()
        target.points = o3d.utility.Vector3dVector(points2)
        print("Initial alignment")
        icp = o3d.pipelines.registration.registration_icp(
                source, target, threshold, trans_init,
                o3d.pipelines.registration.TransformationEstimationPointToPoint())
        print(icp)
        icp_pcd = deepcopy(source)
        icp_pcd.transform(icp.transformation)
        print(icp.transformation)
        points1 = np.array(icp_pcd.points)
        points3 = np.concatenate((points1, points2), axis=0)
        con_pcd = o3d.geometry.PointCloud()
        con_pcd.points = o3d.utility.Vector3dVector(points3)
        con_pcd1 = con_pcd.uniform_down_sample(2)

        print(source)
        print(target)
        print(con_pcd)
        print(con_pcd1)

        source.paint_uniform_color([0, 1, 0])#指定显示为绿色
        target.paint_uniform_color([0, 0, 1])#指定显示为蓝色
        target.translate((0.2, 0, 0))#整体沿X轴平移
        con_pcd.paint_uniform_color([1, 0, 0])#指定显示为红色
        con_pcd.translate((0.4, 0, 0))#整体沿X轴平移
        con_pcd1.paint_uniform_color([1, 1, 0])#指定显示为红色
        con_pcd1.translate((0.6, 0, 0))#整体沿X轴平移
        
      
        o3d.visualization.draw_geometries([source, target, con_pcd, con_pcd1], #点云列表
                                        window_name="点云ICP配准",
                                        point_show_normal=False,
                                        width=800,  # 窗口宽度
                                        height=600)  # 窗口高度

图片

上述拼接实际上是将绿色的点云与蓝色的点云进行重叠拼接,得到红色的点云。当然,红色点云的密度会更高一些。而黄色的点云则是在红色点云的基础上使用均匀下采样轻量化后得到的点云。

以上内容总结自网络,如有帮助欢迎关注与转发,我们下次再见!

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

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

相关文章

Qt 制作安装包

记录使用Qt工具制作一个安装包的过程 目录 1.准备工作 1.1检查Qt Installer Frameworks是否安装 1.2.安装Qt Installer Frameworks 1.3准备release出来的exe dll等文件 2.创建打包工程所需要的文件及目录 2.1创建子目录 2.2 创建工程文件 2.3 创建config/config.xml …

5.4 软件工程-系统设计

系统设计 - 概述 设计软件系统总体结构 数据结构及数据库设计 编写概要设计文档、评审 详细设计的基本任务 真题

HDU1011——Starship Troopers(树形DP),HDU1012——u Calculate e,HDU1013——Digital Roots

目录 HDU1011——Starship Troopers(树形DP) 题目描述 运行代码 代码思路 树形DP HDU1012——u Calculate e 题目描述 运行代码 代码思路 HDU1013——Digital Roots 题目描述 超时代码 改进后依旧超时代码 运行代码 代码思路 HDU1011——…

工时记录软件选型指南

国内外主流的10款工时计算软件对比:PingCode、Worktile、Tita、易企秀、奇鱼、Teambition、Timely、Toggl Track、RescueTime、ClickUp。 在忙碌的工作中,记录和管理工时常常是令人头疼的问题。工时记录软件的选择不仅能帮你省时省力,还能大幅…

视频素材网站无水印的有哪些?热门视频素材网站分享

当我们走进视频创作的精彩世界时,一个难题常常摆在面前——那些高品质、无水印的视频素材究竟应该在哪里寻找?许多视频创作者感叹,寻找理想的视频素材难度甚至超过了寻找伴侣!但不用担心,今天我将为您介绍几个优质的视…

理解UI设计:UI设计师的未来发展机遇

UI设计师的出现是互联网时代的设计变革。随着移动互联网的快速发展,移动产品设计师非常短缺。高薪资让许多其他行业的设计师已经转向了UI设计。那么什么是UI设计呢?UI设计师负责什么?UI设计的发展趋势和就业前景如何?这些都是许多…

C++仓库管理系统

功能 代码在效果图后面 1.添加物品 2.删除物品 3.更新物品数量 4.查询物品 5.列出所有物品 6.保存并退出 注意事项:退出要输入“6”退出才能保存数据,不要直接按X关掉窗口(不会保存数据)。 效果图 源代码 编…

C语言 底层逻辑详细阐述指针(一)万字讲解 #指针是什么? #指针和指针类型 #指针的解引用 #野指针 #指针的运算 #指针和数组 #二级指针 #指针数组

文章目录 前言 序1:什么是内存? 序2:地址是怎么产生的? 一、指针是什么 1、指针变量的创建及其意义: 2、指针变量的大小 二、指针的解引用 三、指针类型存在的意义 四、野指针 1、什么是野指针 2、野指针的成因 a、指…

Unity客户端接入原生Google支付

Unity客户端接入原生Google支付 1. Google后台配置2. 开始接入Java部分C#部分Lua部分 3. 导出工程打包测试参考踩坑注意 1. Google后台配置 找到内部测试(这个测试轨道过审最快),打包上传,这个包不需要接入支付,如果已…

机器人开源调度系统OpenTcs6-架构运行分析

系统启动 启动 Kernel:加载核心应用,初始化系统配置和状态。 启动 Plant Overview:加载图形用户界面,初始化模型和用户界面。 模型导入和配置 在 Plant Overview 中导入或创建工厂布局模型。 配置路径、位置和车辆信息。 车辆连…

用DrissionPage过某里滑块分析

最近我又在找工作了,悲哀啊~,面试官给了一道题,要求如下: 爬虫机试:https://detail.1688.com/offer/643272204627.html 过该链接的滑动验证码,拿到正确的商品信息页html,提取出商品维度的信息&a…

排序一次讲清(从冒泡到基数)

文章目录 冒泡原理代码pythonc 选择原理代码pythonc 插入原理代码pythonc 希尔原理代码pythonc 快排原理代码pythonc 归并原理代码pythonc 堆原理代码pythonc 计数原理代码pythonc 桶原理代码pythonc 基数原理代码pythonc 【待更新】 冒泡 原理 如果我们想要让数组从左至右从…

海豚调度器(DolphinScheduler)集群搭建详细笔记

海豚调度器集群搭建笔记 1.DolphinScheduler Cluster部署1.1 集群部署规划1.2 集群准备工作1.3 初始化数据库1.4 修改安装环境配置1.5 安装DolphinScheduler1.6 启停命令1.7 登录 DolphinScheduler UI 1.DolphinScheduler Cluster部署 分布式去中心化易扩展的工作流任务调度系…

【最强八股文 -- 计算机网络】TCP 四次挥手的过程及原因

第一次挥手:FIN 报文第二次挥手:ACK 报文第三次挥手:FIN 报文第四次挥手:ACK 报文 为什么需要四次挥手? 为什么需要 TIME_WAIT 状态? TIME_WAIT 的时间为什么是 2MSL?

springboot服务如何执行sql脚本文件

当sql脚本文件包含不同数据库实例sql时,遍历读取sql文件再插入时,由于是不同的数据库实例这种方式就不行了,这时就需要程序直接执行sql脚本。 springboot执行sql脚本 /*** 执行sql脚本* throws SQLException*/ private void executeSqlScri…

go-zero框架入门

go-zero框架环境的安装 goctl 若想用go-zero框架,还需要一些前置条件: 安装goctl go install github.com/zeromicro/go-zero/tools/goctllatest可以使用 goctl 命令查看是否安装成功 成功后安装protoc goctl env check --install --verbose --force…

重生奇迹MU 三代翅膀行情

在重生奇迹MU游戏中,达到400级以上的玩家都知道,重生奇迹大陆拍卖行里最值钱的物品是翅膀。翅膀可以分为一代、二代和三代翅膀,而其中价格最高的则是三代翅膀。有时候,三代翅膀的售价非常之高,甚至有市无价。这是因为三…

[论文笔记] CT数据配比方法论——1、Motivation

我正在写这方面的论文,感兴趣的可以和我一起讨论!!!!!! Motivation 1、探测原有模型的配比: 配比 与 ppl, loss, bpw, benchmark等指标 之间的关系。 2、效果稳定的配比:配比 与 模型效果 之间的规律。 Experiments 1、主语言(什么语言作为主语言,几种主语言?…

PyTorch 深度学习实践-逻辑斯蒂回归

视频指路 参考博客笔记 参考笔记二 用来分类的模型 说明:1、 逻辑斯蒂回归和线性模型的明显区别是在线性模型的后面,添加了激活函数(非线性变换) ​ 2、分布的差异:KL散度,cross-entropy交叉熵 现在损失函数衡量不是距离而是分布…

Jmeter性能测试(九)

一、Jmeter性能测试需要特别注意的地方 1、参数化 2、请求参数 3、BeanShell 预处理程序更新jmeter请求参数 4、接口中不可重复的随机数处理 5、线程组设置 6、总结 二、参数化 1、参数化配置,多个参数用英文逗号隔开 2、wallet参数化文件,不要写表头,多个参数用英文逗号…