以下是一个使用PCL1.8.1实现ICP点到点算法的代码示例,可以输入目标点云和源点云,并输出配准后的点云文件。该示例使用斯坦福雕像点云数据作为示例,并配置了具体的文件路径。

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/registration/icp.h>

int main(int argc, char** argv)
{
    if (argc < 4)
    {
        std::cerr << "Usage: " << argv[0] << " <target_pcd> <source_pcd> <output_pcd>" << std::endl;
        return 1;
    }

    // Load target and source point clouds
    pcl::PointCloud<pcl::PointXYZ>::Ptr target_cloud(new pcl::PointCloud<pcl::PointXYZ>);
    pcl::PointCloud<pcl::PointXYZ>::Ptr source_cloud(new pcl::PointCloud<pcl::PointXYZ>);
    if (pcl::io::loadPCDFile<pcl::PointXYZ>("D:\点云文件\点云数据\规则点云\斯坦福\雕像1.pcd", *target_cloud) == -1 ||
        pcl::io::loadPCDFile<pcl::PointXYZ>("D:\点云文件\点云数据\规则点云\斯坦福\雕像2.pcd", *source_cloud) == -1)
    {
        PCL_ERROR("Failed to load point clouds\n");
        return -1;
    }

    // Perform ICP point-to-point registration
    pcl::IterativeClosestPoint<pcl::PointXYZ, pcl::PointXYZ> icp;
    icp.setInputSource(source_cloud);
    icp.setInputTarget(target_cloud);
    pcl::PointCloud<pcl::PointXYZ> output_cloud;
    icp.align(output_cloud);

    if (icp.hasConverged())
    {
        std::cout << "ICP converged with score: " << icp.getFitnessScore() << std::endl;

        // Save output point cloud
        pcl::io::savePCDFileASCII("D:\DIANYUNWENJIANJIA\icp_pcd.pcd", output_cloud);
        std::cout << "Saved output point cloud to: " << "D:\DIANYUNWENJIANJIA\icp_pcd.pcd" << std::endl;
    }
    else
    {
        std::cerr << "ICP failed to converge" << std::endl;
        return -1;
    }

    return 0;
}

其中,"D:\点云文件\点云数据\规则点云\斯坦福\雕像1.pcd""D:\点云文件\点云数据\规则点云\斯坦福\雕像2.pcd""D:\DIANYUNWENJIANJIA\icp_pcd.pcd"分别为目标点云、源点云和输出点云的文件路径。如果程序运行成功,会输出ICP收敛的得分并保存配准后的点云文件到指定路径。如果程序运行失败,会输出错误信息并返回-1。

PCL1.8.1点到点ICP算法代码示例:配准斯坦福雕像点云

原文地址: https://www.cveoy.top/t/topic/oZ0t 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录