原文地址:http://ghx0x0.github.io/2014/12/30/NDT-match/

By GH

发表于 12月 30 2014

目前三维配准中用的较多的是ICP迭代算法,需要提供一个较好的初值,同时由于算法本身缺陷,最终迭代结果可能会陷入局部最优。本文介绍的是另一种比较好的配准算法,NDT配准。这个配准算法耗时稳定,跟初值相关不大,初值误差大时,也能很好的纠正过来。

绪论:

  • 采样:

    • 3d点云数据在离相机近处点云密度大,远处密度小,所以在下采样时采用统一的采样方法还是会保留密度不均匀;
      一种方法是将空间划分格子,在每个格子内的点云随机取点,点数足够了即可。
    • 短波将会产生更高的分辨率和较少的镜面反射。采用多个深度相机会产生串扰的问题,尤其是镜面反射很厉害的时候。

可以采集图像深度的相机:

  1. 雷达radio
  2. 激光雷达lidar
    • 三角测量法
    • TOF飞行时间法
    • 相位差法
  3. 声呐
  4. 双目视觉
    • 双目视觉是一个被动的三角测量;
      缺点:
      A.双目视觉只有能被检测出来的特征点才能检测出深度,在低对比度的环境中,只有很少的特征点能够检测出;
      B.双目视觉的另一个缺点是岁两个相机之间的距离增大,深度精度减少,盲区增大,主要面向几米远的长距离测量。
      C.对于没有纹理的表面检测不出来。
  5. 投影光三角测量
  6. TOF深度相机
    • 实际上是采用相位偏移法测量;
      TOF深度相机相比lidar的TOF是 采集速度快,硬件便宜
      缺点是噪点很明显,并且需要标定,并且受外界光和本身主动光的影响。 而且曝光时间不容易确定

视图匹配(配准):

  1. ICP
    缺点:

     A.要剔除不合适的点对(点对距离过大、包含边界点的点对)
    B.基于点对的配准,并没有包含局部形状的信息
    C.每次迭代都要搜索最近点,计算代价高昂

    存在多种优化了的变体算法,如八叉树等

  2. IDC
     ICP的一种改进,采用极坐标代替笛卡尔坐标进行最近点搜索匹配
  3. PIC
     考虑了点云的噪音和初始位置的不确定性
  4. Point-based probabilistic registration
     需要首先建立深度图的三角面片
  5. NDT——正态分布变换:
     计算正态分布是一个一次性的工作(初始化),不需要消耗大量代价计算最近邻搜索匹配点
    概率密度函数在两幅图像采集之间的时间可以离线计算出来
  6. Gaussian fields
     和NDT正态分布变换类似,利用高斯混合模型考察点和点的距离和点周围表面的相似性
  7. Quadratic patches
  8. Likelihood-field matching——随机场匹配
  9. CRF匹配
     缺点: 运行速度慢,在3d中实时性能不好,误差大。
  10. Branch-and-bound registration
  11. Registration using local geometric features

NDT算法:

  1. 将空间(reference scan)划分成各个格子cell
  2. 将点云投票到各个格子
  3. 计算格子的正态分布PDF参数

  4. 将第二幅scan的每个点按转移矩阵T的变换

  5. 第二幅scan的点落于reference的哪个 格子,计算响应的概率分布函数

  6. 求所有点的最优值,目标函数为

PDF可以当做表面的近似表达,协方差矩阵的特征向量和特征值可以表达表面信息(朝向、平整度)
格子内少于3个点,经常会协方差矩阵不存在逆矩阵,所以只计算点数大于5的cell,涉及到下采样方法。
  • NDT的优化:
    格子参数最重要,太大导致精度不高,太小导致内存过高,并且只有两幅图像相差不大的情况才能匹配
  1. 固定尺寸
  2. 八叉树建立,格子有大有小
  3. 迭代,每次使用更精细的格子
  4. K聚类,有多少个类就有多少个cell,格子大小不一
  5. Linked-cell
  6. 三线插值 平滑相邻的格子cell导致的不连续,提高精度
    缺点:插值导致时间是普通的4倍
    优点:可以提高鲁棒性

ICP算法:

  1. 给定参考点集P和数据点集Q(在给定初始估计RT时)
  2. 对Q中的每一个点寻找P中的对应最近点,构成匹配点对
  3. 对匹配点对求欧氏距离和作为误差目标函数error
  4. 利用SVD分解求出R和T,使得error最小
  5. 将Q按照R和T旋转变化,并以此为基准回到1 重新寻找对应点对
NDT 耗时稳定,跟初值相关不大,初值误差大时,也能很好的纠正过来;
ICP耗时多,容易陷入局部最优; 可以根据格子cell的PDF的协方差矩阵计算特征向量特征值,每个格子有球形状、平面、线型三种类型,根据朝向作以统计,得到局部或者一幅图像的特征直方图

文章来自于Martin Magnusson的The Three-Dimensional Normal-Distributions Transform— an Efficient Representation for Registration,Surface Analysis, and Loop Detection。 作者详细介绍了NDT在各个条件下的配准效果及与其他配准方法的详细实验对比,并利用NDT算法配准矿洞内三维场景,同时完成SLAM任务。

NDT(Normal Distribution Transform) 算法(与ICP对比)和一些常见配准算法的更多相关文章

  1. NDT 算法和一些常见配准算法

    原文链接:http://ghx0x0.github.io/2014/12/30/NDT-match/ 目前三维配准中用的较多的是ICP迭代算法,需要提供一个较好的初值,同时由于算法本身缺陷,最终迭代结 ...

  2. NDT(Normal Distributions Transform)算法原理与公式推导

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

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

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

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

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

  5. ICP(迭代最近点)算法

    图像配准是图像处理研究领域中的一个典型问题和技术难点,其目的在于比较或融合针对同一对象在不同条件下获取的图像,例如图像会来自不同的采集设备,取自不同的时间,不同的拍摄视角等等,有时也需要用到针对不同对 ...

  6. 正态分布(Normal distribution)又名高斯分布(Gaussian distribution)

    正态分布(Normal distribution)又名高斯分布(Gaussian distribution),是一个在数学.物理及project等领域都很重要的概率分布,在统计学的很多方面有着重大的影 ...

  7. 论文阅读 Characterization of Multiple 3D LiDARs for Localization and Mapping using Normal Distributions Transform

    Abstract 在这个文章里, 我们细致的比较了10种不同的3D LiDAR传感器, 用了一般的 Normal Distributions Transform (NDT) 算法. 我们按以下几个任务 ...

  8. Generalized normal distribution and Skew normal distribution

    Density Function The Generalized Gaussian density has the following form: where  (rho) is the " ...

  9. ICP算法(Iterative Closest Point迭代最近点算法)

    标签: 图像匹配ICP算法机器视觉 2015-12-01 21:09 2217人阅读 评论(0) 收藏 举报 分类: Computer Vision(27) 版权声明:本文为博主原创文章,未经博主允许 ...

随机推荐

  1. php的laravel框架快速集成微信登录

    最终的解决方案是:https://github.com/liuyunzhuge/php_weixin_provider,详细的介绍请往下阅读. 本文面向的是php语言laravel框架的用户,介绍的是 ...

  2. Angular2 小贴士 Name

    Angular2 正式版已经发布了一个月了,我也是通过各种方式在进行验证是否可以满足我们的需求,今天我就发现了一个问题.现在我们来一起说明一下,这个可能不算是bug,而应该需要我们记住就可以了. 我们 ...

  3. TeamCity : Build 基本配置

    前文中我们在 TeamCity 中创建了一个项目 HelloApp,并在这个项目中创建了一个名为 HelloAppDailyBuild 的Build 用来编译 demo 程序.本文我们将详细介绍 Bu ...

  4. 【QuickHit项目实例】

    关于java面向对象QuickHit项目实例 Game类:用来得到随机出现的字符串(随机打印的字符串,然后玩家进行输入字符串) public class Game { private String s ...

  5. 『.NET Core CLI工具文档』(十)dotnet-build

    说明:本文是个人翻译文章,由于个人水平有限,有不对的地方请大家帮忙更正. 原文:dotnet-build 翻译:dotnet-build 名称 dotnet-build -- 生成项目和所有的依赖 概 ...

  6. .NET框架解决的问题

    面向对象开发环境 自动垃圾收集 互操作性 不需要COM 简化部署 类型安全 基类库

  7. asp.net获取数据库连接字符串

    1.添加引用 using System.Configuration; 2.代码 string strConnectionString=ConfigurationManager.AppSettings[ ...

  8. 数据结构:堆排序 (python版) 小顶堆实现从大到小排序 | 大顶堆实现从小到大排序

    #!/usr/bin/env python # -*- coding:utf-8 -*- ''' Author: Minion-Xu 小堆序实现从大到小排序,大堆序实现从小到大排序 重点的地方:小堆序 ...

  9. Mybatis的choose when otherwise

    <select id="getCount" resultType="int"> select count(1) from <choose> ...

  10. logstash+elasticsearch+kibana管理日志(安装)

    logstash1.先安装jdk2.wget https://download.elastic.co/logstash/logstash/logstash-2.4.0.tar.gz tar -xzvf ...