使用PCL 1.8.1版本点云pcd文件求RANSAC拟合直线并将直线内点可视化的C++代码

下面是使用PCL 1.8.1版本进行RANSAC直线拟合并将直线内点可视化的C++代码示例:

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/sample_consensus/ransac.h>
#include <pcl/sample_consensus/sac_model_line.h>
#include <pcl/filters/extract_indices.h>

int main()
{
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    if (pcl::io::loadPCDFile<pcl::PointXYZ>( 'input.pcd', *cloud) == -1)
    {
        PCL_ERROR("Couldn't read the input file.
");
        return -1;
    }

    pcl::visualization::PCLVisualizer viewer("RANSAC Line Fitting");
    viewer.setBackgroundColor(0.0, 0.0, 0.0);
    viewer.addPointCloud<pcl::PointXYZ>(cloud, "cloud");

    // RANSAC parameters
    pcl::SampleConsensusModelLine<pcl::PointXYZ>::Ptr model(new pcl::SampleConsensusModelLine<pcl::PointXYZ>(cloud));
    pcl::RandomSampleConsensus<pcl::PointXYZ> ransac(model);
    ransac.setDistanceThreshold(0.01);  // Distance threshold for line fitting
    ransac.computeModel();

    // Get inliers
    pcl::PointIndices::Ptr inliers(new pcl::PointIndices);
    ransac.getInliers(inliers);

    // Extract inlier points
    pcl::ExtractIndices<pcl::PointXYZ> extract;
    pcl::PointCloud<pcl::PointXYZ>::Ptr inlierPoints(new pcl::PointCloud<pcl::PointXYZ>);
    extract.setInputCloud(cloud);
    extract.setIndices(inliers);
    extract.setNegative(false);
    extract.filter(*inlierPoints);

    // Visualize inlier points
    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> red(inlierPoints, 255, 0, 0);
    viewer.addPointCloud<pcl::PointXYZ>(inlierPoints, red, "inliers");

    while (!viewer.wasStopped())
    {
        viewer.spinOnce();
    }

    return 0;
}

请确保你已经在项目中包含了PCL的头文件,并将输入点云文件命名为'input.pcd'。这个示例从PCD文件中加载点云数据,然后使用RANSAC算法拟合直线模型,在可视化窗口中显示拟合的直线和直线内的点云。

注意:这只是一个简单的示例代码,如果你的点云数据有噪声或者存在多个直线,你可能需要调整RANSAC算法的参数来获得更准确的结果。

PCL点云RANSAC直线拟合及内点可视化C++代码

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

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