首页 > 编程语言 >点云学习笔记4——点云滤波降采样后进行4PCS粗配准【四点一致集配准算法(4-Point Congruent Set)】

点云学习笔记4——点云滤波降采样后进行4PCS粗配准【四点一致集配准算法(4-Point Congruent Set)】

时间:2024-10-29 15:16:56浏览次数:6  
标签:4PCS 配准 target PointCloud source pcl 点云 include cloud

#include <iostream>
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/filters/voxel_grid.h>
#include <pcl/common/common_headers.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/filters/voxel_grid.h>
#include <pcl/filters/extract_indices.h>
#include <pcl/filters/statistical_outlier_removal.h> 
#include <pcl/registration/gicp.h>
#include <pcl/registration/icp.h> 
#include <pcl/features/normal_3d.h>
#include <pcl/kdtree/kdtree_flann.h>
#include <pcl/registration/ia_fpcs.h> 
#include <pcl/visualization/pcl_visualizer.h>
#include <boost/thread/thread.hpp>
#include <pcl/console/time.h> 

using namespace std;

int main()
{
    // 读取点云
    pcl::PointCloud<pcl::PointXYZ>::Ptr target(new pcl::PointCloud<pcl::PointXYZ>);
    pcl::io::loadPCDFile<pcl::PointXYZ>("D:\\PPCL\\pig_view1.pcd", *target);
    pcl::PointCloud<pcl::PointXYZ>::Ptr source(new pcl::PointCloud<pcl::PointXYZ>);
    pcl::io::loadPCDFile<pcl::PointXYZ>("D:\\PPCL\\pig_view2.pcd", *source);

    // 创建统计滤波器对象
    pcl::StatisticalOutlierRemoval<pcl::PointXYZ> staticOR;
    staticOR.setInputCloud(source);
    staticOR.setMeanK(20);   
    staticOR.setStddevMulThresh(5);   

    // 进行滤波
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>());
    staticOR.filter(*cloud_filtered);
    source = cloud_filtered;
    cout << "点云滤波完成!" << endl;

    // 创建统计滤波器对象
    pcl::StatisticalOutlierRemoval<pcl::PointXYZ> staticOR1;
    staticOR1.setInputCloud(target);
    staticOR1.setMeanK(20);   
    staticOR1.setStddevMulThresh(5);   

    // 进行滤波
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered1(new pcl::PointCloud<pcl::PointXYZ>());
    staticOR1.filter(*cloud_filtered1);
    target = cloud_filtered1;
    cout << "点云滤波完成!" << endl;

    // 对源点云进行VoxelGrid降采样
    pcl::VoxelGrid<pcl::PointXYZ> sor;
    sor.setInputCloud(source);
    sor.setLeafSize(0.05f, 0.05f, 0.05f); // 设置体素大小
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_source_subsampled(new pcl::PointCloud<pcl::PointXYZ>());
    sor.filter(*cloud_source_subsampled);
    target = cloud_source_subsampled;

    // 对目标点云进行VoxelGrid降采样
    sor.setInputCloud(target);
    sor.setLeafSize(0.05f, 0.05f, 0.05f); // 设置体素大小
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_target_subsampled(new pcl::PointCloud<pcl::PointXYZ>());
    sor.filter(*cloud_target_subsampled);
    target = cloud_target_subsampled;

    //PCS配准
    pcl::registration::FPCSInitialAlignment<pcl::PointXYZ, pcl::PointXYZ> fpcs;
    fpcs.setInputSource(source);
    fpcs.setInputTarget(target);
    fpcs.setApproxOverlap(0.7);         // 设置近似重叠率,值越大,算法期望的重叠区域越大
    fpcs.setDelta(0.01);                // 精度参数,值越小,算法的精度越高,但计算时间可能会增加
    fpcs.setNumberOfSamples(100);       // 采样点数量,越大,算法可能会更准确,但计算时间也会增加
    pcl::PointCloud<pcl::PointXYZ>::Ptr aligned(new pcl::PointCloud<pcl::PointXYZ>);
    fpcs.align(*aligned);               // 执行配准
    Eigen::Matrix4f final_transform = fpcs.getFinalTransformation(); // 获取变换矩阵
    // 输出变换矩阵
    cout << "变换矩阵:\n" << final_transform << endl;

    // 保存点云到文件
    pcl::io::savePCDFileBinary("D:\\PPCL\\pig_view1112.pcd", *aligned);
    cout << "配准后点云文件已经保存" << endl;

    //可视化
    pcl::visualization::CloudViewer viewer("Viewer");
    viewer.showCloud(aligned); // 直接显示点云

    while (!viewer.wasStopped()) // 循环直到用户关闭窗口
    {
    }

    return (0);
}

标签:4PCS,配准,target,PointCloud,source,pcl,点云,include,cloud
From: https://blog.csdn.net/qq_64095888/article/details/143325486

相关文章

  • 点云学习笔记3——读取点云文件、进行统计滤波/直通滤波后可视化
    一、统计滤波#include<iostream>#include<pcl/point_cloud.h>#include<pcl/io/pcd_io.h>#include<pcl/point_types.h>#include<pcl/filters/voxel_grid.h>#include<pcl/common/common_headers.h>#include<pcl/visualization/c......
  • Rethinking Network Design and Local Geometry in Point Cloud:A Simple Residual ML
    此内容是论文总结,重点看思路!!文章概述本文提出了一种用于点云分析的简单残差MLP网络(PointMLP),通过省略复杂的几何特征提取器,仅采用残差MLP和轻量化的几何仿射模块,便能高效地提取点云特征,实现优异的分类性能。PointMLP在推理速度和准确性上优于许多现有方法,提供了一种更加高效的......
  • PCL 计算点云重叠区域的均值标准差
    目录一、概述1.1原理1.2实现步骤1.3应用场景二、代码实现2.1关键函数2.1.1计算均值和标准差的函数2.2完整代码三、实现效果PCL点云算法汇总及实战案例汇总的目录地址链接:PCL点云算法与项目实战案例汇总(长期更新)一、概述        在点云配准中,评估配准......
  • PCL 获取对齐点云之间的差异
    目录一、概述1.1原理1.2实现步骤1.3应用场景二、代码实现2.1关键函数2.1.1提取差异点云的函数2.1.2点云可视化函数2.2完整代码三、实现效果3.1原始点云3.2处理后点云PCL点云算法汇总及实战案例汇总的目录地址链接:PCL点云算法与项目实战案例汇总(长期更新)一、......
  • Diffusion Probabilistic Models for 3D Point Cloud Generation——点云论文阅读(8)
    此内容是论文总结,重点看思路!!文章概述该文献介绍了一种用于3D点云生成的概率模型。点云是表示3D物体和场景的常用方式,但由于其不规则的采样模式,与图像相比,点云生成更具挑战性。现有方法如GANs、流模型和自回归模型在点云生成方面取得了进展,但它们在训练稳定性、生成顺序假设和......
  • 利用彩色相机给激光点云染色
    文章目录概述核心代码效果概述在激光SLAM(SimultaneousLocalizationandMapping)中,使用彩色相机为激光点云染色是一个常见的做法。这种技术结合了激光雷达的高精度距离测量和相机的丰富色彩信息,使得生成的点云不仅包含空间位置信息,还包含颜色信息,从而更直观和细......
  • 使用PCL进行点云粗配准的教程
    点云配准是计算机视觉和机器人领域中的一个重要课题,旨在将不同来源的点云数据对齐,以构建完整的三维模型或进行环境理解。本文将介绍如何使用C++和PointCloudLibrary(PCL)进行点云的粗配准。一、点云配准简介点云配准分为粗配准和精配准。粗配准的目标是在未知的初始位置和姿......
  • 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、原理概述  对于源点云......