PCL专栏目录及须知
注意:本文较长,包括PCL中大多数筛选对应点对的方法,该方法均用于提高配准的精确性和减少可能的误匹配。因方法大多简单,合并为一个文章。目录如下。
目录
本文基于寻找到对应点对之后,对寻找到的对应点对
pcl::CorrespondencesPtr correspondences(new pcl::Correspondences)做二次筛选。
如果完全不会PCL,想直接拷贝使用,文末附有完整代码。
用于下方各筛选方法测试的原始点对关系如下图。
1.根据距离筛选对应点对
1.1 原理
基于距离阈值来删除不符合指定距离条件的点云对应点对。
用户可以通过设置距离阈值来删除不符合距离阈值的点对,通常距离阈值是一个正数,表示两点之间的最大距离。如果两个点之间的距离超过了这个阈值,它们将被删除。
1.2 代码
(1)头文件
#include <pcl/registration/correspondence_rejection_distance.h> // 根据距离筛选对应点对
(2)示例代码
// 基于距离筛选对应关系
pcl::CorrespondencesPtr correspondencesRejDis(new pcl::Correspondences);
pcl::registration::CorrespondenceRejectorDistance corrRejDis;
corrRejDis.setInputCorrespondences(correspondences); // 输入对应关系
corrRejDis.setMaximumDistance(0.9); // 对应关系之间的最大距离阈值
corrRejDis.getCorrespondences(*correspondencesRejDis); // 输出筛选后的对应关系
std::cout << "对应点对数:" << correspondences->size() << std::endl;
std::cout << "基于距离筛选后剩余点对数:" << correspondencesRejDis->size() << std::endl;
1.3 结果展示
2.根据中值筛选对应点对
2.1 原理
基于对应关系之间的中值距离阈值的点对对应关系的筛选。
如果一对对应点的距离大于中值的某个倍数(阈值),则该点对对应关系将被删除,通过排除这些异常对应关系,可以提高配准的精度,降低对配准结果的干扰。
2.2 代码
(1)头文件
#include <pcl/registration/correspondence_rejection_median_distance.h> // 根据中值筛选对应点对
(2)示例代码
// 基于中值筛选对应关系
pcl::CorrespondencesPtr correspondencesRejMedianDistance(new pcl::Correspondences);
pcl::registration::CorrespondenceRejectorMedianDistance corrRejMedianDistance;
corrRejMedianDistance.setMedianFactor(1); // 中值阈值
corrRejMedianDistance.setInputCorrespondences(correspondences); // 输入对应关系
corrRejMedianDistance.getCorrespondences(*correspondencesRejMedianDistance); // 输出筛选后的对应关系
std::cout << "对应点对数:" << correspondences->size() << std::endl;
std::cout << "基于中值筛选后剩余点对数:" << correspondencesRejMedianDistance->size() << std::endl;
2.3 结果展示
3.一对一删除重复点对
3.1 原理
从现有点对中筛选出一对一的对应点关系,消除对应关系中重复匹配索引的对应点。
3.2 代码
(1)头文件
#include <pcl/registration/correspondence_r