首页 > 其他分享 >使用PCL进行点云粗配准的教程

使用PCL进行点云粗配准的教程

时间:2024-10-22 16:51:03浏览次数:9  
标签:src 配准 PCL align pcl 点云 PointCloud

点云配准是计算机视觉和机器人领域中的一个重要课题,旨在将不同来源的点云数据对齐,以构建完整的三维模型或进行环境理解。本文将介绍如何使用C++和Point Cloud Library(PCL)进行点云的粗配准。

一、点云配准简介

点云配准分为粗配准和精配准。粗配准的目标是在未知的初始位置和姿态下,将两幅点云大致对齐,为后续的精配准提供良好的初始估计。精配准则是在粗配准的基础上,利用迭代最近点(ICP)等算法进行精细调整。

二、粗配准的方法

1. 基于特征的配准

通过提取点云中的特征点(如SIFT、ORB),并计算其描述子,然后匹配特征点对,计算变换矩阵。

2. 基于全局描述子的配准

计算整个点云的全局描述子(如FPFH、SHOT),然后通过描述子的相似性进行配准。

3. 基于随机采样一致性(RANSAC)

在匹配的特征点对中使用RANSAC算法估计变换矩阵,过滤掉错误匹配。

三、使用PCL进行点云粗配准

1. 环境搭建

首先,确保已经安装了PCL库。如果尚未安装,可以参考PCL官方教程进行安装。

2. 代码实现

以下是使用PCL进行点云粗配准的示例代码。


#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/registration/sample_consensus_prerejective.h>
#include <pcl/features/normal_3d.h>
#include <pcl/features/fpfh.h>
#include <pcl/filters/uniform_sampling.h>
#include <pcl/visualization/pcl_visualizer.h>
int main()
{
    // 加载源点云和目标点云
    pcl::PointCloud<pcl::PointXYZ>::Ptr source(new pcl::PointCloud<pcl::PointXYZ>());
    pcl::PointCloud<pcl::PointXYZ>::Ptr target(new pcl::PointCloud<pcl::PointXYZ>());
    pcl::io::loadPCDFile("source.pcd", *source);
    pcl::io::loadPCDFile("target.pcd", *target);

    // 下采样
    pcl::PointCloud<pcl::PointXYZ>::Ptr src_sampled(new pcl::PointCloud<pcl::PointXYZ>());
    pcl::PointCloud<pcl::PointXYZ>::Ptr tgt_sampled(new pcl::PointCloud<pcl::PointXYZ>());
    pcl::UniformSampling<pcl::PointXYZ> us;
    us.setInputCloud(source);
    us.setRadiusSearch(0.05f);
    us.filter(*src_sampled);
    us.setInputCloud(target);
    us.filter(*tgt_sampled);

    // 计算法线
    pcl::PointCloud<pcl::Normal>::Ptr src_normals(new pcl::PointCloud<pcl::Normal>());
    pcl::PointCloud<pcl::Normal>::Ptr tgt_normals(new pcl::PointCloud<pcl::Normal>());
    pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne;
    ne.setKSearch(10);
    ne.setInputCloud(src_sampled);
    ne.compute(*src_normals);
    ne.setInputCloud(tgt_sampled);
    ne.compute(*tgt_normals);

    // 计算FPFH特征
    pcl::PointCloud<pcl::FPFHSignature33>::Ptr src_features(new pcl::PointCloud<pcl::FPFHSignature33>());
    pcl::PointCloud<pcl::FPFHSignature33>::Ptr tgt_features(new pcl::PointCloud<pcl::FPFHSignature33>());
    pcl::FPFHEstimation<pcl::PointXYZ, pcl::Normal, pcl::FPFHSignature33> fpfh;
    fpfh.setRadiusSearch(0.05f);
    fpfh.setInputCloud(src_sampled);
    fpfh.setInputNormals(src_normals);
    fpfh.compute(*src_features);
    fpfh.setInputCloud(tgt_sampled);
    fpfh.setInputNormals(tgt_normals);
    fpfh.compute(*tgt_features);

    // 配准
    pcl::SampleConsensusPrerejective<pcl::PointXYZ, pcl::PointXYZ, pcl::FPFHSignature33> align;
    align.setInputSource(src_sampled);
    align.setSourceFeatures(src_features);
    align.setInputTarget(tgt_sampled);
    align.setTargetFeatures(tgt_features);
    align.setMaximumIterations(50000); // 设置迭代次数
    align.setNumberOfSamples(3);       // 每次随机选取的点数
    align.setCorrespondenceRandomness(5); // 寻找近邻点的数量
    align.setSimilarityThreshold(0.9f);
    align.setMaxCorrespondenceDistance(2.5f * 0.05f);
    align.setInlierFraction(0.25f);

    pcl::PointCloud<pcl::PointXYZ> output;
    align.align(output);

    if (align.hasConverged())
    {
        std::cout << "配准成功!" << std::endl;
        Eigen::Matrix4f transformation = align.getFinalTransformation();
        std::cout << "估计的变换矩阵:" << std::endl << transformation << std::endl;

        // 可视化
        pcl::visualization::PCLVisualizer viewer("配准结果");
        pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> src_color(source, 255, 0, 0);
        pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> tgt_color(target, 0, 255, 0);
        viewer.addPointCloud(source, src_color, "source_cloud");
        viewer.addPointCloud(target, tgt_color, "target_cloud");
        viewer.spin();
    }
    else
    {
        std::cout << "配准失败!" << std::endl;
    }

    return 0;
}

3. 代码解析

  • 加载点云数据:使用pcl::io::loadPCDFile函数加载源和目标点云。
  • 下采样:使用pcl::UniformSampling对点云进行下采样,以减少计算量。
  • 法线估计:使用pcl::NormalEstimation计算每个点的法线,为特征计算做准备。
  • 特征提取:使用pcl::FPFHEstimation计算FPFH特征描述子。
  • 配准算法:使用pcl::SampleConsensusPrerejective进行基于RANSAC的粗配准。
  • 结果可视化:使用pcl::visualization::PCLVisualizer显示配准结果。

四、注意事项

  • 参数调优:配准的效果与算法参数密切相关,需要根据数据情况调整参数。
  • 数据质量:噪声和不完整的数据会影响配准效果,预处理步骤如滤波和去噪很重要。
  • 初始估计:有时候提供一个初始的变换估计会加速配准过程。

五、总结

本文介绍了如何使用PCL库在C++中实现点云的粗配准。通过下采样、法线估计、特征提取和配准算法的组合,我们可以初步对齐两幅点云,为后续的精细配准奠定基础。

参考资料

标签:src,配准,PCL,align,pcl,点云,PointCloud
From: https://blog.csdn.net/qq_45728381/article/details/143162095

相关文章

  • LIDAR3607.2 & LIDAR360mls7.2 雷达点云数据处理软件使用
    LiDAR360是一款强大的激光雷达点云数据处理和分析平台,拥有超过10种先进的点云数据处理算法,可同时处理超过300G点云数据。平台包含丰富的编辑工具和自动航带拼接功能,可为地形、林业、矿山和电力行业(参考LiPowerline5.1软件)提供应用。地形模块包含用于标准地形产品生产的一系列......
  • PointWeb: Enhancing Local Neighborhood Features for Point Cloud Processing——点
    此内容是论文总结,重点看思路!!文章概要本文研究如何有效聚合局部特征,提高点云数据的识别性能,提出了一种新的处理点云的方法PointWeb,旨在从局部邻域中提取上下文特征。与之前的方法不同,PointWeb通过密集连接局部邻域中的每个点,从而基于该区域的特性来调整每个点的特征。主要创......
  • PCL Trimmed ICP实现点云精配准(抄袭狗别再抄错版)
    目录一、算法原理1、原理概述2、参考文献二、代码实现三、结果展示看到这个抄袭狗:莫将晚霞落黄昏,抄都能把代码抄错,我觉得挺丢人的。所以给出正确的代码供各位免费抄袭,不过别再抄错了,很丢人的好吧!!!一、算法原理1、原理概述  对于源点云......
  • Windows 10系统下 VS 2017配置PCL 1.8.1 成功版
    一、下载pcl-翻墙打开以下网站https://github.com/PointCloudLibrary/pcl/releases/tag/pcl-1.8.11.将此页面下滑,找到下图两个文件下载2.下载的两个文件放到一个文件夹中2.打开下载好的以下文件PCL-1.8.1-AllInOne-msvc2017-win64.exe二、安装点云库1.点击下载的PC......
  • TPAMI 2024 | 用于点云分割领域适应的组合语义混合
    题目:CompositionalSemanticMixforDomainAdaptationinPointCloudSegmentation用于点云分割领域适应的组合语义混合作者:CristianoSaltori;FabioGalasso;GiuseppeFiameni;NicuSebe;FabioPoiesi;ElisaRicci源码链接:https://github.com/saltoricristiano......
  • PCL 渐进式形态学滤波
    文章目录一、简介二、实现代码三、实现效果参考资料一、简介如果不太了解点云数学形态学的基本理论,可以先阅读这篇文章:https://blog.csdn.net/dayuhaitang1/article/details/123172437。形态学中的窗口结构一直存在着这样的问题:如果窗口结构元尺寸过小,则无法去......
  • PCL 计算点云AABB包围盒
    目录一、概述1.1原理1.2实现步骤1.3应用场景二、代码实现2.1关键函数2.1.1计算AABB2.1.2可视化AABB2.2完整代码三、实现效果PCL点云算法汇总及实战案例汇总的目录地址链接:PCL点云算法与项目实战案例汇总(长期更新)一、概述        点云的包围盒(Boundi......
  • CGAL类柱面(管状)点云曲面生成+两端封口
    #include<CGAL/Exact_predicates_inexact_constructions_kernel.h>#include<CGAL/Surface_mesh.h>#include<CGAL/boost/graph/copy_face_graph.h>#include<CGAL/boost/graph/Face_filtered_graph.h>#include<CGAL/Advancing_front_surface......
  • httpCLient请求工具类封装
    1、okhttp工具类依赖:<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><depe......
  • PCL rpath解决so动态库依赖
    依赖库搜索流程动态库或可执行文件,是如何找到它所依赖的库的?是按以下目录顺序来搜索:theRPATHbinaryheader(setatbuild-time)ofthelibrarycausingthelookup(ifany)theRPATHbinaryheader(setatbuild-time)oftheexecutabletheLD_LIBRARY_PATH......