最近一直在看点云配准相关的算法,在这里记录一下我试验过的配准算法。
第一弹:SAC-IA粗配准+ICP精配准

采样一致性初始配准算法(Sample Consensus Initial Aligment , SAC-IA)
此算法依赖于点特征直方图,所以在执行此算法之前,应该先计算点云的FPFH,算法的大致思路如下:
(1) 从待配准点云P中选取n个采样点,为了尽量保证所采样的点具有不同的FPFH特征,采样点两两之间的距离应满足大于预先给定最小距离阈值d。
(2) 在目标点云Q中查找与点云P中采样点具有相似FPFH特征的一个或多个点,从这些相似点中随机选取一个点作为点云P在目标点云Q中的一一对应点。
(3) 计算对应点之间刚体变换矩阵, 然后通过求解对应点变换后的“距离误差和”函数来判断当前配准变换的性能。此处的距离误差和函数多使用Huber罚函数表示, 记为,其中:

式中:mi为一预先给定值,li为第i组对应点变换之后的距离差。上述配准的最终目的是在所有变换中找到一组最优的变换,使得误差函数的值最小,此时的变换即为最终的配准变换矩阵,进一步可得到配准结果。
SAC-IA得到的变换矩阵不精确,所以它只能用于粗配准,在PCL库中的registration模块可实现SAC-IA算法。
在点数量较多时,计算FPFH特征较慢,使得SAC-IA算法效率很低,此时,需要先对点云进行下采样处理,以减少点的数量,但这会造成部分特征点丢失,使得配准准确度降低。

迭代最近点算法(Iterative Cloest Point, ICP)
ICP算法基于SVD,其大致思路如下:
(1) 将初始配准后的两片点云P′(经过坐标变换后的源点云)和Q,作为精配准的初始点集;
(2) 对源点云P’中的每一点pi,在目标点云Q中寻找距离最近的对应点qi,作为该点在目标点云中的对应点,组成初始对应点对;
(3) 初始对应点集中的对应关系并不都是正确的,错误的对应关系会影响最终的配准结果,采用方向向量阈值剔除错误的对应点对;
(4) 计算旋转矩阵R和平移向量T,使最小,即对应点集之间的均方误差最小;
(5) 设定某一阈值ε=dk-dk-1和最大迭代次数Nmax, 将上一步得到的刚体变换作用于源点云P′,得到新点云P”,计算P”和Q的距离误差,,如果两次迭代的误差小于阈值ε或者当前迭代次数大于Nmax,则迭代结束,否则将初始配准的点集更新为P”和Q,继续重复上述步骤,直至满足收敛条件。
ICP算法对参数敏感,在使用前要设置一下几个参数:
1.setMaximumIterations, 最大迭代次数,icp是一个迭代的方法,最多迭代这些次;
2. setEuclideanFitnessEpsilon, 设置收敛条件是均方误差和小于阈值,停止迭代;
3. setTransformtionEpsilon, 设置两次变化矩阵之间的差值(一般设置为1e-10即可);
4. setMaxCorrespondenaceDistance,设置对应点对之间的最大距离(此值对配准结果影响较大)。
在两点云相差较大的情况下,ICP算法容易陷入局部最优解,从而无法得到较好的匹配结果,故需要先给定一个初始变换矩阵。在pcl库中的registration模块可实现ICP算法。

完整代码如下:
实验中所用的数据为bunny模型

#include <pcl/registration/ia_ransac.h>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/features/normal_3d.h>
#include <pcl/features/fpfh.h>
#include <pcl/search/kdtree.h>
#include <pcl/io/pcd_io.h>
#include <pcl/filters/voxel_grid.h>
#include <pcl/filters/filter.h>
#include <pcl/registration/icp.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <time.h>using pcl::NormalEstimation;
using pcl::search::KdTree;
typedef pcl::PointXYZ PointT;
typedef pcl::PointCloud<PointT> PointCloud;//点云可视化
void visualize_pcd(PointCloud::Ptr pcd_src,PointCloud::Ptr pcd_tgt,PointCloud::Ptr pcd_final)
{//int vp_1, vp_2;// Create a PCLVisualizer objectpcl::visualization::PCLVisualizer viewer("registration Viewer");//viewer.createViewPort (0.0, 0, 0.5, 1.0, vp_1);// viewer.createViewPort (0.5, 0, 1.0, 1.0, vp_2);pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ&

SAC-IA粗配准+ICP精配准相关推荐

  1. 点云的粗配准和精配准

    1.前言 点云配准是点云处理的重要技术之一,可以用来估计物体位姿,拼接多个视角下的点云. 分别用基于采样一致性的粗配准,以及粗配准与ICP精配准结合的方法进行配准实验. 粗配准流程图如下,主要为精配准 ...

  2. 【图像配准】图像配准基础知识:入门知识、点云基础、图像配准的概念、基础和分类

    图像配准基础 入门知识.背景 点云 点云是在同一空间参考系下表达目标空间分布和目标表面特性的海量点集合,在获取物体表面每个采样点的空间坐标后,得到的是点的集合,称之为"点云"(Po ...

  3. 点云配准——经典配准算法及配准效果对比

    目录 点云配准基础知识 什么是点云配准? 点云配准的步骤 粗配准 精配准 点云配准的经典算法 ICP算法 NDT算法 3DSC算法 PFH FPFH 完全配准效果对比 点云配准基础知识 什么是点云配准 ...

  4. (点、6)精配准Iterative Closest Point(ICP)

    知乎ICP ICP算法本文具体化 精配准:给定一个初始变换,进一步优化得到更精确的变换.ICP目的是把不同坐标系中的点,通过最小化配准误差,变换到一个共同的坐标系中. 为什么需要点云配准 通过RGBD ...

  5. 【论文笔记】AVSM:结合了仿射配准和vSVF配准的医学图像配准模型

    本文是论文<Networks for Joint Affine and Non-parametric Image Registration>的阅读笔记. 文章提出了一个名为AVSM(Aff ...

  6. ARCGIS进行地理配准及影像配准并加载到谷歌地球中查看矢量地图SHP

    普通的地图图片如何能让其附有经纬度坐标和投影信息,如何能将普通的地图图片加载到诸如谷歌地球等相关的三维地球软件当中进行生产或学习使用呢,这就要用到gis当中常用的一种功能,叫做地理配准.地理配准并不复 ...

  7. 使用 ANTs 进行 MRI (结构、功能)图像配准——安装,配准详细解答

    使用 ANTs 进行 MRI 图像配准--安装,配准详细解答 一.为什么要进行配准? 二.使用 ANTs 进行配准 (1)使用 ANTs 进行结构像配准 (2)使用 ANTs 进行功能像配准 ANTs ...

  8. Path-Ranking:KBQA中path生成、召回、粗排与精排

    路径生成:通过实体链接获取到了问题中的实体,路径生成则是从实体出发,遍历KG,生成所有可能的答案路径,在过程中对路径进行剪枝. 1.路径召回 路径召回策略分为单实体和多实体两种情况.其中,多实体优先, ...

  9. 推荐搜索,召回、粗排、精排之间的漏斗考虑

    一.首先从数量上看下这几个阶段 二.粗排漏斗分析 1:学习目标 学习目标是"精排的输出"(可能只是曝光+点击,有时也会用到unpv样本),尽量保证粗排和精排的效果一样,取topk才 ...

最新文章

  1. 网页分享插件 share.js 国外常用
  2. 转:思科3750交换机堆叠技术配置向导
  3. 论文笔记:Geo-CNN
  4. python 海象运算符,Python3.8新特性-- 海象操作符
  5. 使用neo4j_知识图谱Task00:Neo4j安装配置
  6. STL常用对象,不会搞得C++跟没学一样
  7. 数据科学r语言_您应该为数据科学学习哪些语言?
  8. mysql gui 分区_一文彻底搞懂MySQL分区
  9. 分享:假如浏览器和搜索引擎不再支持外部链接跳转,优化何去何从呢?
  10. 分享一个学习cocos-html5的链接
  11. mysql c接口返回自增id_详解mysql插入数据后返回自增ID的七种方法
  12. Pytorch 一种调整学习率的思路
  13. 深入理解css之float
  14. php lt table gt 分页,帝国CMS 解决自动分页截断amp;lt;divamp;gt;等标签、末页空白问题 - Powered by 随缘小居...
  15. AD22如何添加元器件库
  16. 面试必问 K8S 的经典题目,来看看你会几个?
  17. HTML5七夕情人节表白网页制作【浪漫森林落叶钢琴紫色3D相册】HTML+CSS+JavaScript
  18. 算法设计大赛21题---三升序列(DFS)
  19. 计算机故障代码0098,P0098故障码_P0098故障码是什么故障、排除方法、怎么消除_车主指南...
  20. WINBUGS对随机波动率模型进行贝叶斯估计与比较

热门文章

  1. Lync 2010 学习(十),解决演示白板问题
  2. 在excel内处理二进制和十六进制数据
  3. 江苏省2023年普通高等学校“专转本”选拔工作实施办法的通知
  4. 狮子鱼独立版_一言难尽的狮子王
  5. 弄潮儿数据_云数据服务的弄潮儿
  6. 【JAVA转C】JAVA转C的心得以及笔记
  7. HTML flex遇到white-space:nowrap
  8. ZZULIOJ:1227: 漂亮菱形
  9. 十面向对象分析之UML核心元素之关系
  10. 怎么才能成为一名合法的无线电爱好者?