simpleICP

迭代最近点算法在各种语言中的一个相当简单的版本的实现。

171下载

更新10月16日

从GitHub

在GitHub上查看许可证

simpleICP

simpleICP

类的一个相当简单版本的实现迭代最近点(ICP)算法各种语言。

目前,一个实现可用于:

语言 代码 主要依赖
c++ 链接 nanoflann特征cxxopts
茱莉亚 链接 NearestNeighbors.jl
Matlab 链接 统计和机器学习工具箱
倍频程 链接
Python 链接 NumPySciPy

我已经尝试优化代码的可读性,即代码结构尽可能简单,测试相当少。

c++版本可以通过cli界面使用。

另载于:

  • Matlab:在文件交换上查看simpleICP
  • Python:

ICP算法的特点

基本特征

所有语言都实现了以下基本功能:

  • 符号的用法point-to-plane距离(而不是点到点距离)作为误差度量。主要原因:
    • 更快的收敛速度,如:在这里在这里
    • 更好的最终点云对齐(假设两个点云的采样不同,即不存在真正的点对点对应关系)
  • 估计刚体变换(旋转+平移)为可动点云。最后的变换为齐次变换矩阵H:
    H = [R (0,0) (0, 1) R (0, 2) tx] [R (1,0) (1, 1) R(1、2)泰][R (2,0) (2, 1) R (2, 2) tz) [0 0 0 1)
    在哪里R旋转矩阵是和吗tx,tz是平移向量的分量。使用H时,可对可动点云进行变换:
    Xt = H*X
    在哪里X4 × n矩阵的每一列都是齐次坐标吗xyz1一个点,并且Xt是由变换后的点组成的4 × n矩阵。
  • 选择固定数量的通信在固定点云和移动点云之间。默认是对应= 1000
  • 自动拒绝可能错误的通信以…为基础
    1. 绝对偏差中位数。一个对应在以下情况下被拒绝|dist_i-median(dists)| > 3*sig_mad,在那里Sig_mad = 1.4826*mad(狂人)
    2. 用于估计法向量的平面的平整度(见下文)。平面度定义为P = (ev2-ev3)/ev1Ev1 >= ev2 >= ev3),电动汽车是特征值的协方差矩阵的点用于估计法向量。一个对应在以下情况下被拒绝P_i < min_planarity。默认是Min_planarity = 0.3
  • 在每次迭代之后收敛性判别准则被检验:如果点到平面距离的均值和标准差变化不超过min_change百分比,迭代停止。默认是Min_change = 1
  • 平面的法向量(用于计算点到面距离)是使用固定数量的邻居从固定的点云估计出来的。默认是邻居= 10
  • 点云不能完全重叠,即点云的部分重叠是允许的。这种情况的一个例子是兔子数据集,看到在这里。两个点云之间的初始重叠区域可以由参数定义max_overlap_distance。更具体地说,对应关系仅在与可动点云的最近邻居的初始距离为的不动点云的点之间选择< = max_overlap_distance

输出

所有实现都生成相同的屏幕输出。这是一个来自c++版本的示例兔子数据集:

stop iteration! [09:42:37.827] Estimated transformation matrix H: [09:42:37.827] [ 0.990045 -0.172046 0.000965 -0.000304] [09:42:37.827] [ 0.172037 0.990039 -0.001838 -0.000220] [09:42:37.827] [ -0.000824 0.001815 1.000023 -0.000015] [09:42:37.827] [ 0.000000 0.000000 0.000000 1.000000] [09:42:37.827] Finished in 0.137 seconds!">
$ run_simpleicp.sh处理数据集"Bunny" [09:42:37.690][09:42:37.690]考虑点云的部分重叠……[09:42:37.770]在定点云的重叠区域内选择对应点…[09:42:37.770]估计选定点的法线…[09:42:37.775]开始迭代…(09:42:37.780)迭代|通讯|意味着(残差)|性病(残差)[09:42:37.780]0 | 960 | -0.0003 | 0.0025 [09:42:37.780]1 | 960 | 0.0000 | 0.0013 [09:42:37.785]2 | 903 | -0.0000 | 0.0005 [09:42:37.790]3 | 903 | -0.0000 | 0.0004 [09:42:37.794]4 | 883 | -0.0000 | 0.0003 [09:42:37.799]5 | 877 | -0.0000 | 0.0003 [09:42:37.803]6 | 869 | -0.0000 | 0.0002 [09:42:37.808]7 | 860 | -0.0000 | 0.0002 [09:42:37.813]8 | 855 | -0.0000 | 0.0002 [09:42:37.818]9 | 851 | -0.0000 | 0.0002[09:42:37.822] 10 | 849 | -0.0000 | 0.0002[09:42:37.827]收敛条件满足->停止迭代![09:42:37.827]估计变换矩阵H: [09:42:37.827] [0.990045 -0.172046 - 0.000965 -0.000304] [09:42:37.827] [0.172037 - 0.990039 -0.001838 -0.000220] [09:42:37.827] [-0.000824 0.001815 1.000023 -0.000015] [09:42:37.827] [0.000000 0.000000 0.000000 1.000000 .827] [09:42:37.827] [09:42:37.827] [0.42:37 .827] [09:42:37.827] [0.000000 0.000000 0.000000 0.000000 1.000000 .827] [09:42:37.827] [09:42:37.827] [09:42:37.827] [09:42:37.827] [09:42:37.827] [09:42:37.827] [09:42:37.827] [09:42:37.827]

测试数据集

测试数据集包含在数据子文件夹。每种语言的示例调用可以在run_simpleicp。*文件,如。run_simpleicp.py对于python版本。

数据集 pc1 (no_pts) pc2 (no_pts) 重叠
龙 pc1(100 k) pc2(100 k) 完全重叠 斯坦福3D扫描存储库
机载激光雷达 AirborneLidar pc1(1340 k) pc2(1340 k) 完全重叠 机载激光雷达飞越奥地利阿尔卑斯山
地面激光雷达 TerrestrialLidar pc1(1250 k) pc2(1250 k) 完全重叠 地面激光雷达点云的石头块
兔子 兔子 pc1(k) 21日 pc2(22 k) 部分重叠 斯坦福3D扫描存储库

基准

以下是我个人电脑上上述数据集的运行时:

数据集 c++ 茱莉亚 Matlab 八度* Python
0.16秒 3.99秒 1.34秒 95.7秒 0.89秒
机载激光雷达 3.98秒 5.38秒 15.08秒 - 5.45秒
地面激光雷达 3.62秒 5.22秒 13.24秒 - 5.68秒
兔子 0.13秒 0.38秒 0.37秒 72.8秒 0.80秒

对于所有版本,相同的输入参数(通讯邻居,…)被使用。

*不幸的是,我还没有在Octave中找到kd树的实现(它还没有在Octave中实现统计数据包)。因此,取而代之的是(非常耗时!)详尽的最近邻搜索。对于较大的数据集,由于距离矩阵不适合内存,Octave计时缺失。

参考文献

如使用此代码,请引用相关论文:

@文章{glira2015a,标题={基于ICP算法变量的ALS条调整对应框架},作者={Glira, Philipp and Pfeifer, Norbert and Briese, Christian and Ressl, Camillo},期刊={photogrammetrie - fernerkundg - geoinformation},卷={2015},号={4},页数={275—289},年份={2015},出版商={E。schweizbart 'sche Verlagsbuchhandlung}}

相关项目

  • globalICP:一个多扫描ICP的Matlab实现

引用作为

Glira, Philipp等,“基于ICP算法变体的ALS条调整对应框架”。摄影测量- Fernerkundung - Geoinformation, vol. 2015, no. 1。4、中国科学院学报(自然科学版),2015年8月,pp. 275-89, doi:10.1127/pfg/2015/0270。

查看更多样式
MATLAB版本兼容性
使用R2021b创建
与任何版本兼容
平台的兼容性
窗户 macOS Linux

社区寻宝

在MATLAB Central中找到宝藏,并发现社区如何帮助您!

开始狩猎!
版本 发表 发布说明
1.0

要查看或报告此GitHub插件中的问题,请访问GitHub库
要查看或报告此GitHub插件中的问题,请访问GitHub库