不同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的过程中,我们需要用到命令提示符(CMD)进行环境的配置,:本文主要介绍Python常用命令提示符使用方法的相关资料,文中通过代码介绍的... 目录一、python环境基础命令【Windows】1、检查Python是否安装2、 查看Python的安

Maven 配置中的 <mirror>绕过 HTTP 阻断机制的方法

《Maven配置中的<mirror>绕过HTTP阻断机制的方法》:本文主要介绍Maven配置中的<mirror>绕过HTTP阻断机制的方法,本文给大家分享问题原因及解决方案,感兴趣的朋友一... 目录一、问题场景:升级 Maven 后构建失败二、解决方案:通过 <mirror> 配置覆盖默认行为1. 配置示

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.

使用jenv工具管理多个JDK版本的方法步骤

《使用jenv工具管理多个JDK版本的方法步骤》jenv是一个开源的Java环境管理工具,旨在帮助开发者在同一台机器上轻松管理和切换多个Java版本,:本文主要介绍使用jenv工具管理多个JD... 目录一、jenv到底是干啥的?二、jenv的核心功能(一)管理多个Java版本(二)支持插件扩展(三)环境隔

Java中Map.Entry()含义及方法使用代码

《Java中Map.Entry()含义及方法使用代码》:本文主要介绍Java中Map.Entry()含义及方法使用的相关资料,Map.Entry是Java中Map的静态内部接口,用于表示键值对,其... 目录前言 Map.Entry作用核心方法常见使用场景1. 遍历 Map 的所有键值对2. 直接修改 Ma

Mybatis Plus Join使用方法示例详解

《MybatisPlusJoin使用方法示例详解》:本文主要介绍MybatisPlusJoin使用方法示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录1、pom文件2、yaml配置文件3、分页插件4、示例代码:5、测试代码6、和PageHelper结合6

Java中实现线程的创建和启动的方法

《Java中实现线程的创建和启动的方法》在Java中,实现线程的创建和启动是两个不同但紧密相关的概念,理解为什么要启动线程(调用start()方法)而非直接调用run()方法,是掌握多线程编程的关键,... 目录1. 线程的生命周期2. start() vs run() 的本质区别3. 为什么必须通过 st

基于Python实现一个简单的题库与在线考试系统

《基于Python实现一个简单的题库与在线考试系统》在当今信息化教育时代,在线学习与考试系统已成为教育技术领域的重要组成部分,本文就来介绍一下如何使用Python和PyQt5框架开发一个名为白泽题库系... 目录概述功能特点界面展示系统架构设计类结构图Excel题库填写格式模板题库题目填写格式表核心数据结构

C#之List集合去重复对象的实现方法

《C#之List集合去重复对象的实现方法》:本文主要介绍C#之List集合去重复对象的实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C# List集合去重复对象方法1、测试数据2、测试数据3、知识点补充总结C# List集合去重复对象方法1、测试数据

SpringBoot读取ZooKeeper(ZK)属性的方法实现

《SpringBoot读取ZooKeeper(ZK)属性的方法实现》本文主要介绍了SpringBoot读取ZooKeeper(ZK)属性的方法实现,强调使用@ConfigurationProperti... 目录1. 在配置文件中定义 ZK 属性application.propertiesapplicati