点击上方“3D视觉工坊”,选择“星标”

干货第一时间送达

作者:丁洪凯

链接:https://zhuanlan.zhihu.com/p/107218828

本文转载自知乎,作者已授权,未经许可请勿二次转载。

1. ICP 算法简介

ICP 的经典论文:https://ieeexplore.ieee.org/document/121791

发表在 IEEE Transactions on Pattern Analysis and Machine Intelligence,此刊在工程技术大类属于1区,算是神刊了。

【大类】工程技术(1区);
【小类】COMPUTER SCIENCE, ARTIFICIAL INTELLIGENCE(1区);ENGINEERING, ELECTRICAL & ELECTRONIC(1区);
【2016-2018年平均IF】11.838;
【2017-2018年总被引】102333

进入正题......

ICP 算法的第一步就是找到 Source 点云与 Target 点云中的对应点(corresponding point sets),然后针对对应点,通过最小二乘法构建目标函数,进行迭代优化。

1.1 估计对应点(Correspondences estimation)

ICP 称为 Iterative Closest Point,顾名思义,是通过最近邻法来估计对应点的。

对 Source 点云中的一点,求解其与 Target 点云中距离最近的那个点,作为其对应点。

当然,这样操作的时间复杂度很高,为了加速计算,我们不需要计算 Target 点云中每个点到 Source 点云中一点的距离。可以设定一个阈值,当距离小于阈值时,就将其作为对应点。

还有一些其他加速求解对应点的方法,如 ANN(Approximate Nearest Neighbor)。

1.2 迭代优化

找到对应点后,我们就构建了两组对应的点集:

求欧式变换  使得:

ICP 算法基于最小二乘法进行迭代计算,使得误差平方和达到极小值:

可通过以下三个步骤进行求解:

(1)定义两组点的质心,简化目标函数

其中, 交叉项部分 在求和之后零,因此目标函数简化为:

第一项只与旋转矩阵 有关,只要获得 ,令第二项为零就能求得

(2)计算每个点的去质心坐标,计算旋转矩阵

其中,第二项 无关,只有第三项与 有关。因而,目标函数变为:

通过 Singular Value Decomposition (SVD) 来进行求解,先定义矩阵:

是一个 矩阵,对 进行 SVD 分解,得:

其中, 为奇异值组成的对角矩阵,当 满秩时, 为:

(3)计算平移矩阵

以下求解 ICP 的代码来自:高翔,视觉SLAM十四讲。

2. PCL 库中的 ICP 算法

基本使用

PCL 库中提供了如下几种点云配置算法:

  • pcl::IterativeClosestPoint< PointSource, PointTarget, Scalar >

  • pcl::GeneralizedIterativeClosestPoint< PointSource, PointTarget >

  • pcl::IterativeClosestPointWithNormals< PointSource, PointTarget, Scalar >

  • pcl::IterativeClosestPointNonLinear< PointSource, PointTarget, Scalar >

  • pcl::JointIterativeClosestPoint< PointSource, PointTarget, Scalar >

  • pcl::registration::IncrementalICP< PointT, Scalar >

其中,IterativeClosestPoint 模板类是 ICP 算法的一个基本实现,其优化求解方法基于 Singular Value Decomposition (SVD),算法迭代结束条件包括:

  • 最大迭代次数:Number of iterations has reached the maximum user imposed number of iterations (via setMaximumIterations)

  • 两次变换矩阵之间的差值:The epsilon (difference) between the previous transformation and the current estimated transformation is smaller than an user imposed value (via setTransformationEpsilon)

  • 均方误差:The sum of Euclidean squared errors is smaller than a user defined threshold (via setEuclideanFitnessEpsilon)

基本用法:

原理解析

PCL 中的 ICP 是通过Registeration 模板类实现的,其继承关系如下图所示。

ICP 点云配准的关键概念如下:

  • Keypoints 关键点:A keypoint is an interest point that has a "special property" in the scene. PCL 中的 NARF,SIFT,FAST 可以作为关键点,也可以把每一个点或部分点作为关键点;

  • Feature descriptors 特征描述子:每个关键点对应着一个特征描述子,相似的关键点有着相似的特征描述子,通常用一个向量表示;

  • Correspondences estimation 对应点估计:ICP 算法的第一步就是要找到对应点,即找到两个点云中 overlapping 的部分,分为 point matching 和  feature matching;

  • Correspondences rejection 对应点去除:去除不好的对应点可通过 RANSAC 实现,若模型点云中的一个点对应着场景点云中的若干点, 则只取距离最小的那个;

  • Transformation estimation 位姿变换估计:定义目标函数,迭代优化直到收敛。

主要流程如下图所示:

  • 定义关键点,能够最好地表示场景(from a set of points, identify interest points (i.e., keypoints) that best represent the scene in both datasets);

  • 针对每个关键点,计算特征描述子(at each keypoint, compute a feature descriptor);

  • 基于相似的特征和位置,估计一系列对应点(from the set of feature descriptors together with their XYZ positions in the two datasets, estimate a set of correspondences, based on the similarities between features and positions);

  • 假设数据是有噪声的,则并不是所有的对应点都是有效的,所以需要去除掉一些不好的对应点(given that the data is assumed to be noisy, not all correspondences are valid, so reject those bad correspondences that contribute negatively to the registration process);

  • 基于好的对应点,估计位姿变换(from the remaining set of good correspondences, estimate a motion transformation)。

http://pointclouds.org/documentation/tutorials/registration_api.php#registration-api

3. PCL  Demo

以下两个demo 来自 PCL Tutorial

(1)Interactive ICP(交互式 ICP)http://pointclouds.org/documentation/tutorials/interactive_icp.php#id1

效果:按一下空格键,迭代一次

(2)Incrementally register pairs of clouds(多幅点云配准)

http://pointclouds.org/documentation/tutorials/pairwise_incremental_registration.php#pairwise-incremental-registration

点云模型:https://github.com/PointCloudLibrary/data/tree/master/tutorials/pairwise

效果:按 q 键进行迭代配准,同时生成配准后的点云

参考

高翔,视觉 SLAM 十四讲

ICP(迭代最近点)算法

PCL点云库:ICP算法

Interactive Iterative Closest Point

How to incrementally register pairs of clouds

推荐阅读:

吐血整理|3D视觉系统化学习路线

那些精贵的3D视觉系统学习资源总结(附书籍、网址与视频教程)

超全的3D视觉数据集汇总

大盘点|6D姿态估计算法汇总(上)

大盘点|6D姿态估计算法汇总(下)

机器人抓取汇总|涉及目标检测、分割、姿态识别、抓取点检测、路径规划

汇总|3D点云目标检测算法

汇总|3D人脸重建算法

那些年,我们一起刷过的计算机视觉比赛

总结|深度学习实现缺陷检测

深度学习在3-D环境重建中的应用

汇总|医学图像分析领域论文

大盘点|OCR算法汇总

重磅!3DCVer-学术论文写作投稿 交流群已成立

扫码添加小助手微信,可申请加入3D视觉工坊-学术论文写作与投稿 微信交流群,旨在交流顶会(ICRA/IROS/ROBIO/CVPR/ICCV/ECCV等)、顶刊(IJCV/TPAMI/TIP等)、SCI、EI等写作与投稿事宜。

同时也可申请加入我们的细分方向交流群,目前主要有3D视觉CV&深度学习SLAM三维重建点云后处理自动驾驶、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、学术交流、求职交流等微信群,请扫描下面微信号加群,备注:”研究方向+学校/公司+昵称“,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进去相关微信群。原创投稿也请联系。

▲长按加微信群或投稿

▲长按关注公众号

3D视觉从入门到精通知识星球:针对3D视觉领域的知识点汇总、入门进阶学习路线、最新paper分享、疑问解答四个方面进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,近1000+星球成员为创造更好的AI世界共同进步,知识星球入口:

学习3D视觉核心技术,扫描查看介绍,3天内无条件退款

圈里有高质量教程资料、可答疑解惑、助你高效解决问题

一分钟详解点云配准ICP方法相关推荐

  1. 一分钟详解initUndistortRectifyMap函数bug修复方法

    本文首发于微信公众号「3D视觉工坊」--一分钟详解initUndistortRectifyMap函数bug修复方法 在上一篇文章OpenCV中initUndistortRectifyMap函数存在bu ...

  2. 用pcl读ply文件_一分钟详解PCL中点云配准技术

    原文首发于微信公众号「3D视觉工坊」:一分钟详解PCL中点云配准技术 本文是对前两篇文章:点云配准(一 两两配准)以及3D点云(二 多福点云配准)的补充,希望可以在一定程度上帮助大家对点云配准理解地更 ...

  3. 一分钟详解PCL中点云配准技术

    原文首发于微信公众号「3D视觉工坊」: 一分钟详解PCL中点云配准技术 本文是对前两篇文章:

  4. 一分钟详解Git使用技巧(一)

    作者:小凡 Date:2020-01-10 来源:一分钟详解Git使用技巧(一)

  5. 云小课 | 详解华为云独享型负载均衡如何计费

    阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要:华为云独享型负载均 ...

  6. 鱼眼:一:一分钟详解鱼眼镜头标定基本原理及实现

    目录 一.目的 1.想知道:一分钟详解鱼眼镜头标定基本原理及实现 1.将其转载,避免作者删除,就没有了 二.参考 1.一分钟详解鱼眼镜头标定基本原理及实现 三.注意 四.操作:备份原文 前言 一 理论 ...

  7. 90分钟详解网络编程相关的细节处理丨 reactor丨网络io丨epoll丨C/C++丨Linux服务器开发丨后端开发丨Linux后台开发

    90分钟搞懂网络编程相关细节处理 1. 网络编程四要素 2. io多路复用 3. reactor三种基础封装方式 视频讲解如下,点击观看: 90分钟详解网络编程相关的细节处理丨 reactor丨网络i ...

  8. 点云配准各种方法总结[不定时更新]

    本文主要用来记录我在学习过程中接触到的一些或新或旧的点云配准的方法,有些方法我可能还不怎么理解,如果有错误欢迎大家指出. 2018/04/15 添加LORAX 2018/04/08 添加DO法和结合法 ...

  9. Fragment详解之二——基本使用方法

    前言:依然没有前言--文章写的太快,生活过得太有章程,前言都不知道写什么了-- 相关文章: 1.<Fragment详解之一--概述> 2.<Fragment详解之二--基本使用方法& ...

最新文章

  1. ECharts+BaiduMap+HT for Web网络拓扑图应用
  2. python 画风场 scipy_科学网-Python: 扩展库SciPy-刘洋洋的博文
  3. 重装windows后 用live cd修复ubuntu启动gurb
  4. 20170728xlVBA改转置一例
  5. TensorFlow.NET 在工业部署中的应用
  6. 作者:赵国栋(1974-),男,中关村大数据产业联盟秘书长,北京大数据研究院副院长...
  7. Atitit.事件机制 与 消息机制的联系与区别
  8. Ubuntu下部署zabbix 开源监控系统
  9. c# winForm使用Aspose.Cells读取CSV文件中文乱码问题
  10. 遥感影像单波段辐射定标处理
  11. MySQL:unknown variable #39;master-host=masterIP#39; [ERROR] Aborting
  12. 对计算机病毒防治最科学的方法是,计算机病毒防治(复习-3
  13. **海量搜索解决方案_Spring Data Solr [篇3/共3篇]*
  14. TSN 2.车载 Ethernet AVB 通信协议
  15. 第五次作业 刘惠惠 自动生成的方法存根
  16. 内存泄漏、虚拟内存、物理内存的联系
  17. 计算机的学情分析报告,计算机教学计划合集总结5篇
  18. Teemo Attacking
  19. 服务器怎么做无限耐久装备,饥荒物品无限耐久控制台指令 | 手游网游页游攻略大全...
  20. 计算机开机无自检声音,电脑启动不了,开机无自检声音,显示器不亮

热门文章

  1. [算法也疯狂]实现假装商品抢购繁忙的效果(php版)
  2. VirtualBox下安装rhel5.5 linux系统
  3. svn command line tag
  4. pcDuino 刷系统-卡刷
  5. linux软件安装不完全傻瓜手册
  6. 通用分页存储过程(转自邹建)
  7. TIDB,面向未来的数据库到底是什么?
  8. 常用正则表达式合集与工具
  9. IT行业HR:我们很缺人...
  10. String性能提升10倍的几个方法!(源码+原理分析)