simpleICP
类的一个相当简单版本的实现迭代最近点(ICP)算法各种语言。
目前,一个实现可用于:
语言 | 代码 | 主要依赖 |
---|---|---|
c++ | 链接 | nanoflann,特征,cxxopts |
茱莉亚 | 链接 | NearestNeighbors.jl |
Matlab | 链接 | 统计和机器学习工具箱 |
倍频程 | 链接 | |
Python | 链接 | NumPy,SciPy |
我已经尝试优化代码的可读性,即代码结构尽可能简单,测试相当少。
c++版本可以通过cli界面使用。
另载于:
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
X
4 × n矩阵的每一列都是齐次坐标吗x
,y
,z
,1
一个点,并且Xt
是由变换后的点组成的4 × n矩阵。 - 选择固定数量的通信在固定点云和移动点云之间。默认是
对应= 1000
。 - 自动拒绝可能错误的通信以…为基础
- 的绝对偏差中位数。一个对应
我
在以下情况下被拒绝|dist_i-median(dists)| > 3*sig_mad
,在那里Sig_mad = 1.4826*mad(狂人)
。 - 用于估计法向量的平面的平整度(见下文)。平面度定义为
P = (ev2-ev3)/ev1
(Ev1 >= 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扫描存储库 | |
机载激光雷达 | pc1(1340 k) | pc2(1340 k) | 完全重叠 | 机载激光雷达飞越奥地利阿尔卑斯山 | |
地面激光雷达 | 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
倍频程
版本 | 发表 | 发布说明 | |
---|---|---|---|
1.0 |
要查看或报告此GitHub插件中的问题,请访问GitHub库。
要查看或报告此GitHub插件中的问题,请访问GitHub库。