ICP算法简介

根据点云数据所包含的空间信息,可以直接利用点云数据进行配准。主流算法为最近迭代算法(ICP,Iterative Closest Point),该算法是根据点云数据首先构造局部几何特征,然后再根据局部几何特征进行点云数据重定位。

一、 ICP原理

假设两个点云数据集合P和G,要通过P转换到G(假设两组点云存在局部几何特征相似的部分),可以通过P叉乘四元矩阵进行旋转平移变换到G,或者SVD法将P转换到G位置,总体思想都是需要一个4x4的旋转平移矩阵。对于每次旋转平移变换后计算P的所有(采样)点到G对应(最近)点的距离,用最小二乘法(求方差)求出最小二乘误差,看是否在要求的范围内,如果最小二乘误差小于设定的值,(或迭代次数达到上限,或每次重新迭代后最小二乘误差总在一个很小的范围内不再发生变化),则计算结束,否则继续进行迭代。

粗配准优化方法:主成分分析法

精配准优化方法:基于正交投影的ICp算法改进

二、粗配准优化

PCA是一种有效的检测数据集简化分析方法,用于减少数据集的维数,同时保持数据集对方差贡献最大特征,对于点集P(x1,x2,…,xn),其中,xi是n维数据,均值和协方差矩阵分别为:

$\bar x = \frac{{\mathop \sum \nolimits_{i = 1}^n {x_i}}}{n}$

${\rm{cov}} = \frac{{\mathop \sum \nolimits_{i = 1}^n \left( {{x_i} - \bar x} \right){{\left( {{x_i} - \bar x} \right)}^T}}}{n}$

协方差矩阵cov的特征向量,即为点集P的主轴。对于三维点云数据,以均值为坐标系的原点,PCA求得的三个特征向量对应XYZ轴,建立点云的参考坐标系。

由于PCA反应了数据集对方差贡献的最大特征,相似度大的两片点云,只要把其参考坐标系调整到一致,即可达到初始配准的目的。由于可能出现坐标轴的两个方向相差180o的情况,需要建立最小包围盒来测试两片点云是否调整重合,通过坐标变换可以将数据点云包围盒变换到模型点云参考坐标系中,使两包围盒的空间位置大体一致。计算包围盒的重合体积,如果大于某一设定的容差,则两片点云大致重合,如果小于设定容差,则反转数据点云参考坐标系坐标轴再次尝试。通过坐标系调整后,即可达到点云的初始配准目的,为下一步的精确配准提供较好的初值。

三、精配准优化

通过初始配准,两片点云大致重合但是误差精度还远远达不到实际应用中的精度要求。为了使用点云间的误差达到最小,还需要对其进行精确配准。ICP算法是最常用的数据精确配准方法,算法在每次迭代的过程中,对数据点云的每一点,在模型点云中寻找欧氏距离最近点作为对应点,通过这组对应点使目标函数s2最小化:

${{\rm{s}}^2} = {\rm{min}}\mathop \sum \limits_{i = 1}^N {\left\| {{Q_i} - \left( {R{P_i} + t} \right)} \right\|^2}$

来得到最优的四维转换矩阵(包含平移和旋转),将四维变换矩阵作用到点云数据上,得到新的数据点云带入下次迭代过程。但是ICP算法具有比较明显的缺陷,要求数据点云上的每一点在模型点云上都要找到对应点,为了寻找对应点,算法需要遍历模型点云上的每一点,配准速度很慢,且容易陷入局部最优解。

由于ICP算法的时间消耗主要花费在计算对应点集上,如果能降低此步骤的时间消耗,即可以提高ICP算法效率,具体计算请参考博客点云对齐

ICP点云配准原理及优化的更多相关文章

  1. FPFH+ICP点云配准

    A, UniformSampling降噪 B, ISS计算关键点, FPFH特征 在FeatureCloud::setInputCloud中读入点云,并调用processInput进行处理: proc ...

  2. 使用正态分布变换(Normal Distributions Transform)进行点云配准

    正态分布变换算法是一个配准算法,它应用于三维点的统计模型,使用标准优化技术来确定两个点云间的最优的匹配,因为其在配准过程中不利用对应点的特征计算和匹配,所以时间比其他方法快.下面是PCL官网上的一个例 ...

  3. PCL点云配准(1)

    在逆向工程,计算机视觉,文物数字化等领域中,由于点云的不完整,旋转错位,平移错位等,使得要得到的完整的点云就需要对局部点云进行配准,为了得到被测物体的完整数据模型,需要确定一个合适的坐标系,将从各个视 ...

  4. 3D点云配准算法简述

    ​蝶恋花·槛菊愁烟兰泣露 槛菊愁烟兰泣露,罗幕轻寒,燕子双飞去. 明月不谙离恨苦,斜光到晓穿朱户. 昨夜西风凋碧树,独上高楼,望尽天涯路. 欲寄彩笺兼尺素.山长水阔知何处? --晏殊 导读: 3D点云 ...

  5. CVPR2020:训练多视图三维点云配准

    CVPR2020:训练多视图三维点云配准 Learning Multiview 3D Point Cloud Registration 源代码和预训练模型:https://github.com/zgo ...

  6. MeshLab中进行点云配准

    MeshLab是一个开源.可移植和可扩展的三维几何处理系统,主要用于交互处理和非结构化编辑三维三角形网格.它支持多种文件格式: import:PLY, STL, OFF, OBJ, 3DS, COLL ...

  7. 点云配准的端到端深度神经网络:ICCV2019论文解读

    点云配准的端到端深度神经网络:ICCV2019论文解读 DeepVCP: An End-to-End Deep Neural Network for Point Cloud Registration ...

  8. 3D点云重建原理及Pytorch实现

    3D点云重建原理及Pytorch实现 Pytorch: Learning Efficient Point Cloud Generation for Dense 3D Object Reconstruc ...

  9. 【实战分享】又拍云 OpenResty / Nginx 服务优化实践

    2018 年 11 月 17 日,由 OpenResty 主办的 OpenResty Con 2018 在杭州举行.本次 OpenResty Con 的主题涉及 OpenResty 的新开源特性.业界 ...

随机推荐

  1. list双向链表容器(常用的方法总结)

    特别注意,由于list对象的结点并不要求在一段连续的内存中,所以,对于迭代器,只能通过++或者--的操作将迭代器移动到后继或者前驱结点元素处.而不能对迭代器进行+n或者-n的操作,这点与vector等 ...

  2. 使用EntityManager批量保存数据

    @PersistenceContext EntityManager em; 从别的系统中定期同步某张表的数据,由于数据量较大,采用批量保存 JPA EntityManager的四个主要方法 ① pub ...

  3. //{{AFX_MSG、//{{AFX_VIRTUAL、//{{AFX_MSG_MAP、//{{AFX_DATA_INIT

    说明:这篇日志我不知道怎么命名好,虽然内容很少,但是讲的关键字很多,如果你有幸打开这篇日志,不妨往下看看 背景:我们使用 VC++6.0 开发MFC应用程序,初学者一定会为那么多行的注释代码感到头痛, ...

  4. Java基础——JSP(三)

    一. JavaBean 是一种特殊的java类,它遵从一定的设计模式,开发工具和其他组件可以根据这种模式来调用javaBean.它是使用一种符合某些命名方法和设计规范的java类. -- 这个类是可序 ...

  5. 【CentOS】设置服务开机自动启动

    CentOS安装好apache.mysql等服务器程序后,并没有设置成开机自动启动的,为避免重启后还要手动开启web等服务器,还是做下设置好,其实设置很简单,用chkconfig命令就行了. 例如,要 ...

  6. RocketMQ 消息存储

    消息存储 主要的存储文件: 1.消息文件(commitLog) 2.消息消费队列文件(consumeQueue) 3.Hash索引文件(IndexFile) 4.检测点文件(checkpoint) 5 ...

  7. Logback 日志持久化

    Logback是log4j的增强版,比log4j更具灵活,其提供了将日志输出到数据库的功能,本文将介绍如何将指定的日志输出到mysql中. 一.自定义log标志 由于Logback原生的配置会将所有的 ...

  8. JavaScript弹出窗口方法

    本文实例汇总了常用的JavaScript弹出窗口方法,供大家对比参考,希望能对大家有所帮助.详细方法如下: 1.无提示刷新网页: 大家有没有发现,有些网页,刷新的时候,会弹出一个提示窗口,点“确定”才 ...

  9. 微信小程序点击图片放大预览

    微信小程序点击图片放大预览使用到 wx.previewImage 接口,可以放大.上/下一张 上代码 wxml代码 <view class='content-img' wx:if="{ ...

  10. org.springframework.web.util.NestedServletException Handler processing failed; n

    因为谷歌的lists不支持或使用, 所有要改成java的list工具 谷歌list使用: import com.google.common.collect.Lists; .... Lists.newA ...