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

原文链接:http://ghx0x0.github.io/2014/12/30/NDT-match/

目前三维配准中用的较多的是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任务。

时间: 2024-11-06 03:08:44

NDT 算法和一些常见配准算法的相关文章

NDT(Normal Distribution Transform) 算法(与ICP对比)和一些常见配准算法

原文地址:http://ghx0x0.github.io/2014/12/30/NDT-match/ By GH 发表于 12月 30 2014 目前三维配准中用的较多的是ICP迭代算法,需要提供一个较好的初值,同时由于算法本身缺陷,最终迭代结果可能会陷入局部最优.本文介绍的是另一种比较好的配准算法,NDT配准.这个配准算法耗时稳定,跟初值相关不大,初值误差大时,也能很好的纠正过来. 绪论: 采样: 3d点云数据在离相机近处点云密度大,远处密度小,所以在下采样时采用统一的采样方法还是会保留密度不

数据结构与算法 介绍以及常见的算法排序

介绍 数据结构: 计算机存储,组织数据的结构.指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成. 线性数据结构:数组,链表 应用:队列 栈 非线性数据结构:树,图 算法: 对数据结构中数据的操作 常见的算法排序 low B三件套 #冒泡排序 #时间复杂度:O(n2) #空间复杂度:O(1) def bubble_sort(li): for i in range(len(li)-1): flag = False for j in range(len(li)-i-1):

几种常见排序算法

几种常见排序算法 几种常见排序算法 写在前面 基础介绍 初级排序算法 selection sort选择排序 insertion sort插入排序 ShellSort希尔排序 shuffing不是排序算法 merge sort归并排序 Abstract in-place merge原地归并的抽象方法 Top-down mergesort自顶向下的归并排序 Bottom-up mergesort自底向上的归并排序 quicksort 三向切分的快速排序 Heapsort堆排序 总结和比较 命题 本文

十种常见排序算法

1.常见算法分类 十种常见排序算法一般分为以下几种: (1)非线性时间比较类排序:交换类排序(快速排序和冒泡排序).插入类排序(简单插入排序和希尔排序).选择类排序(简单选择排序和堆排序).归并排序(二路归并排序和多路归并排序): (2)线性时间非比较类排序:计数排序.基数排序和桶排序. 总结: (1)在比较类排序中,归并排序号称最快,其次是快速排序和堆排序,两者不相伯仲,但是有一点需要注意,数据初始排序状态对堆排序不会产生太大的影响,而快速排序却恰恰相反. (2)线性时间非比较类排序一般要优于

【转载】算法设计之五大常用算法设计方法总结

转载自http://blog.csdn.net/zolalad/article/details/11393915 算法设计之五大常用算法设计方法总结 一.[分治法]  在计算机科学中,分治法是一种很重要的算法.字面上的解释是"分而治之",就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题--直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并.这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)--等.任

JS排序算法总结:八种算法对比

目的:掌握 排序算法的分类及不同算法复杂度的对比.搞清楚 XXX与数组初始状态无关分为几种情况: a.算法复杂度与初始状态无关: b.元素总比较次数与初始状态无关: c.元素总移动次数与初始状态无关. 1.算法分类 十种常见排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序. 线性时间非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此称为线性时间

【整理】常见排序算法及其时间复杂度总结

原文出处: 1. 白话经典算法系列之八 MoreWindows白话经典算法之七大排序总结篇 2. 面试常用算法总结--排序算法(java版) 3. 常见排序算法小结 本篇主要整理了冒泡排序,直接插入排序,直接选择排序,希尔排序,归并排序,快速排序,堆排序七种常见算法,是从上面三篇博文中摘抄整理的,非原创. 一.冒泡排序 主要思路是: 通过交换相邻的两个数变成小数在前大数在后,这样每次遍历后,最大的数就"沉"到最后面了.重复N次即可以使数组有序. 冒泡排序改进1: 在某次遍历中,如果没有

常见hash算法的原理(转)

常见hash算法的原理 散列表,它是基于快速存取的角度设计的,也是一种典型的“空间换时间”的做法.顾名思义,该数据结构可以理解为一个线性表,但是其中的元素不是紧密排列的,而是可能存在空隙. 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映射函数叫做散列函数,存放记录的数组叫做散列表. 比如我们存储70个元素,但我们可能为这70个元素申请了100个元素的空间.7

常见排序算法(一) MergeSort

算法思想灰常重要,常见的用到分治思想的算法包括快速排序,归并,二分搜搜,大整数乘法等(参考 http://blog.csdn.net/com_stu_zhang/article/details/7233761,归纳很到位) 简单用归并对一个数组排序 思路: 简单来说对一个数组,只要他的左右两部分都是有序的,那么简单合并就ok了,那么左右两部分可以进一步划分各自的左右两部分----明显就是要递归了 算法:归并排序 1. 将数组一分为二,subArray1 和subArray2 2. 归并排序sub