不同ICP方法简单对比

2024-08-24 10:12
文章标签 简单 方法 不同 对比 icp

本文主要是介绍不同ICP方法简单对比,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

不同ICP方法比较

  • 论文
  • 代码
    • trimesh中的实现
  • 测试
    • PCL 中的ICP对比
    • trimesh2 中的ICP对比

接触到一种新的ICP方法,测试看一下效果。


论文

A Symmetric Objective Function for ICP

The Iterative Closest Point (ICP) algorithm, commonly used for alignment of 3D models, has previously been defined using either a point-topoint or point-to-plane objective. Alternatively, researchers have proposed computationally-expensive methods that directly minimize the distance function between surfaces. We introduce a new symmetrized objective function that achieves the simplicity and computational efficiency of point-to-plane optimization, while yielding improved convergence speed and a wider convergence basin. In addition, we present a linearization of the objective that is exact in the case of exact correspondences. We experimentally demonstrate the improved speed and convergence basin of the symmetric objective, on both smooth models and challenging cases involving noise and partial overlap。

迭代最近点( Iterative Closest Point,ICP )算法,通常用于3D模型的对齐,以前使用点到点或点到平面的目标来定义。有研究人员提出了计算代价昂贵的方法,直接最小化曲面之间的距离函数。我们引入了一个新的对称化目标函数,它实现了点到平面优化的简单性和计算效率,产生更快的收敛速度和更宽的收敛域。此外,我们给出了在精确对应的情况下精确的目标的线性化。我们通过实验证明了对称目标在光滑模型和涉及噪声和粒子的挑战性情况下的改进速度和收敛域。

在这里插入图片描述
对于从圆弧上采样的任意点 p p p q q q,它们之间的向量 p − q p - q pq垂直于法向量之和 n p + n q np + nq np+nq 。这是对称ICP公式所利用的基本性质。

有兴趣移步原文,这里不做展开了。


代码

trimesh中的实现

/*
Szymon Rusinkiewicz
Princeton UniversityICP.cc
Iterative Closest Point alignment using covariance-weighted sampling,
adaptive outlier rejection, and symmetric point-to-plane minimization.
*/...
// Do symmetric point-to-plane alignment, returning alignxf
// as well as eigenvectors and inverse eigenvalues
static void align_symm(const vector<PtPair> &pairs, float scale,const point &centroid1, const point &centroid2,float median_dist, xform &alignxf)
{float huber_thresh = HUBER_THRESH_MULT * scale * median_dist;size_t npairs = pairs.size();float A[6][6] = { { 0 } }, b[6] = { 0 };for (size_t i = 0; i < npairs; i++) {vec p1 = scale * (pairs[i].p1 - centroid1);vec p2 = scale * (pairs[i].p2 - centroid2);vec n = pairs[i].n1 + pairs[i].n2;vec p = p1 + p2;vec c = p CROSS n;vec d = p1 - p2;float x[6] = { c[0], c[1], c[2], n[0], n[1], n[2] };float dn = d DOT n;// Huber weights, used for IRLSfloat wt = huber_thresh / max(fabs(dn), huber_thresh);for (int j = 0; j < 6; j++) {b[j] += wt * dn * x[j];for (int k = j; k < 6; k++)A[j][k] += wt * x[j] * x[k];}}// Make matrix symmetricfor (int j = 1; j < 6; j++)for (int k = 0; k < j; k++)A[j][k] = A[k][j];// Eigen-decomposition and inversefloat eval[6], einv[6];eigdc<float,6>(A, eval);for (int i = 0; i < 6; i++)einv[i] = 1.0f / (eval[i] + REGULARIZATION * eval[5]);// Solve systemeigmult<float,6>(A, einv, b);// Extract rotation and translationvec rot(b[0], b[1], b[2]), trans(b[3], b[4], b[5]);float rotangle = atan(len(rot));trans *= cos(rotangle);trans *= 1.0f / scale;xform R = xform::rot(rotangle, rot);alignxf = xform::trans(centroid1) *R * xform::trans(trans) * R *xform::trans(-centroid2);
}
...

trimesh2中的代码就是原作者自己实现的,我愿称之为优雅,实现也比较简单,重点在目标函数的构建和求解。


测试

PCL 中的ICP对比

对两个点云配准

未配准的bunny
在这里插入图片描述

P2P
在这里插入图片描述
P2L

在这里插入图片描述

SYM

在这里插入图片描述
在这里插入图片描述

trimesh2 中的ICP对比

对两个mesh配准

这是两个不同视角的bunny mesh,在原始位姿上我加了一点扰动,使其初始位姿更差,两个mesh的分界更明显,在后面的配准效果对比中,我没有输出量化指标,可以通过可视化定性比较,重点关注两个mesh的边界

未配准的bunny
在这里插入图片描述

P2P
在这里插入图片描述
P2L

在这里插入图片描述

SYM

在这里插入图片描述

two plane

在这里插入图片描述
在这里插入图片描述


总的来说,SYM-ICP效果更优,尤其针对法线比较准确的数据,能够得到很好的结果,相对来说(尤其相对于P2P-ICP)收敛更快,不容易陷入局部最优(但也存在),即其文中所说的更快的收敛速度和更广的收敛域

这篇关于不同ICP方法简单对比的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1102185

相关文章

使用python生成固定格式序号的方法详解

《使用python生成固定格式序号的方法详解》这篇文章主要为大家详细介绍了如何使用python生成固定格式序号,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录生成结果验证完整生成代码扩展说明1. 保存到文本文件2. 转换为jsON格式3. 处理特殊序号格式(如带圈数字)4

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

MySQL数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

Python版本与package版本兼容性检查方法总结

《Python版本与package版本兼容性检查方法总结》:本文主要介绍Python版本与package版本兼容性检查方法的相关资料,文中提供四种检查方法,分别是pip查询、conda管理、PyP... 目录引言为什么会出现兼容性问题方法一:用 pip 官方命令查询可用版本方法二:conda 管理包环境方法

Linux云服务器手动配置DNS的方法步骤

《Linux云服务器手动配置DNS的方法步骤》在Linux云服务器上手动配置DNS(域名系统)是确保服务器能够正常解析域名的重要步骤,以下是详细的配置方法,包括系统文件的修改和常见问题的解决方案,需要... 目录1. 为什么需要手动配置 DNS?2. 手动配置 DNS 的方法方法 1:修改 /etc/res

JavaScript对象转数组的三种方法实现

《JavaScript对象转数组的三种方法实现》本文介绍了在JavaScript中将对象转换为数组的三种实用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录方法1:使用Object.keys()和Array.map()方法2:使用Object.entr

SpringBoot中ResponseEntity的使用方法举例详解

《SpringBoot中ResponseEntity的使用方法举例详解》ResponseEntity是Spring的一个用于表示HTTP响应的全功能对象,它可以包含响应的状态码、头信息及响应体内容,下... 目录一、ResponseEntity概述基本特点:二、ResponseEntity的基本用法1. 创

java中判断json key是否存在的几种方法

《java中判断jsonkey是否存在的几种方法》在使用Java处理JSON数据时,如何判断某一个key是否存在?本文就来介绍三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目http://www.chinasem.cn录第一种方法是使用 jsONObject 的 has 方法