PCL 实现点云相减

文章介绍了PCL库中如何进行点云相加和相减的操作。点云相加可以直接使用`+=`运算符,但相减则需要借助八叉树数据结构。提供了一个名为CloudSubtraction的函数,利用pcl::octree::OctreePointCloudChangeDetector来实现点云的相减,该函数要求减数点云是被减数点云的子集。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

PCL点云库里点云相加实现方法很简单,直接用+=就行,例有点云cloud0cloud1

pcl::PointCloud<PointT>::Ptr cloud0(new pcl::PointCloud<PointT>());
pcl::PointCloud<PointT>::Ptr cloud1(new pcl::PointCloud<PointT>());
*cloud0 += *cloud1;

此时cloud0就是先前cloud0cloud1结合后的点云,但是如果已知cloud0是cloud1的子集,想要知道两者相减后的结果,官方没有现成的函数。

一、PCL是什么?

点云库 (PCL) 是一个独立的、大规模的、开放的 2D/3D 图像和点云处理项目。PCL 是根据BSD 许可条款发布的,因此可免费用于商业和研究用途。

在这里插入图片描述

二、使用步骤

1.引入库

代码如下(示例):

#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/common/common.h>
#include<pcl/octree/octree.h>

2.关键函数

//实现:cloud2 = cloud0 - cloud1
//param[in]  pcl::PointCloud<pcl::PointXYZ>::Ptr& cloud1://减数点云
//param[in] pcl::PointCloud<pcl::PointXYZ>::Ptr& cloud0://被减数点云
//param[out] pcl::PointCloud<pcl::PointXYZ>::Ptr& cloud2://差点云
void CloudSubtraction(pcl::PointCloud<pcl::PointXYZ>::Ptr& cloud1, pcl::PointCloud<pcl::PointXYZ>::Ptr& cloud0, pcl::PointCloud<pcl::PointXYZ>::Ptr& cloud2) {
    float resolution = 0.10f; //八叉树分辨率,根据点云需要自行调整
    pcl::octree::OctreePointCloudChangeDetector<pcl::PointXYZ>octree(resolution); 

    //添加cloud1到八叉树中
    octree.setInputCloud(cloud1->makeShared());
    octree.addPointsFromInputCloud();

    octree.switchBuffers(); 

    //添加cloud0到八叉树中
    octree.setInputCloud(cloud0->makeShared());
    octree.addPointsFromInputCloud();

    std::vector<int>newPointIdxVector;   //存储新加入点索引的向量
    octree.getPointIndicesFromNewVoxels(newPointIdxVector);

    cloud2->width = newPointIdxVector.size();
    cloud2->height = 1;
    cloud2->is_dense = false;
    cloud2->points.resize(cloud2->width * cloud2->height);

    for (size_t i = 0; i < newPointIdxVector.size(); i++) {
        cloud2->points[i].x = cloud0->points[newPointIdxVector[i]].x;
        cloud2->points[i].y = cloud0->points[newPointIdxVector[i]].y;
        cloud2->points[i].z = cloud0->points[newPointIdxVector[i]].z;
    }
}

实现两点云相减,以点云的形式返回相减结果,此处只考虑了点类型为pcl::PointXYZ的情况,有额外需要可以自行适当增添。


总结

函数返回两点云相减的结果,需要注意的是,减数点云必须要确保为被减数点云的子集,否则该函数将没有意义。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值