下面是一个使用 PCL 库实现的删除两个点云中相同点的 C++ 代码示例:

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

int main()
{
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud1(new pcl::PointCloud<pcl::PointXYZ>);
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud2(new pcl::PointCloud<pcl::PointXYZ>);
    
    // 读取点云数据
    pcl::io::loadPCDFile<pcl::PointXYZ>('clouds84.pcd', *cloud1);
    pcl::io::loadPCDFile<pcl::PointXYZ>('clouds85.pcd', *cloud2);

    // 创建一个点云配准对象
    pcl::IterativeClosestPoint<pcl::PointXYZ, pcl::PointXYZ> icp;
    icp.setInputSource(cloud1);
    icp.setInputTarget(cloud2);

    // 进行点云配准
    pcl::PointCloud<pcl::PointXYZ> final_cloud;
    icp.align(final_cloud);

    // 获取配准后的点云
    pcl::PointCloud<pcl::PointXYZ>::Ptr registered_cloud(new pcl::PointCloud<pcl::PointXYZ>);
    *registered_cloud = final_cloud;

    // 创建一个点云索引提取对象
    pcl::ExtractIndices<pcl::PointXYZ> extract;
    extract.setInputCloud(cloud1);
    pcl::PointIndices::Ptr indices(new pcl::PointIndices());

    // 遍历源点云中的每个点,并查找是否存在于目标点云中
    for (int i = 0; i < cloud1->size(); ++i)
    {
        pcl::PointXYZ point = cloud1->at(i);
        if (!pcl::isFinite(point)) continue;  // 跳过无效点

        std::vector<int> k_indices(1);
        std::vector<float> k_distances(1);
        if (cloud2->nearestKSearch(point, 1, k_indices, k_distances) > 0)
        {
            // 如果源点云中的点在目标点云中存在,则将其索引添加到索引列表中
            indices->indices.push_back(i);
        }
    }

    // 从源点云中提取相同点
    pcl::PointCloud<pcl::PointXYZ>::Ptr filtered_cloud(new pcl::PointCloud<pcl::PointXYZ>);
    extract.setIndices(indices);
    extract.filter(*filtered_cloud);

    // 保存结果
    pcl::io::savePCDFile('filtered_cloud.pcd', *filtered_cloud);

    return 0;
}

请注意,此代码使用了 PCL 库的 IterativeClosestPoint 类来进行点云配准,并使用 ExtractIndices 类从源点云中提取相同点。

基于PCL库删除两个点云中相同点的C++代码示例

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

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