前言
PCL点云库里点云相加实现方法很简单,直接用+=
就行,例有点云cloud0
和cloud1
pcl::PointCloud<PointT>::Ptr cloud0(new pcl::PointCloud<PointT>());
pcl::PointCloud<PointT>::Ptr cloud1(new pcl::PointCloud<PointT>());
*cloud0 += *cloud1;
此时cloud0
就是先前cloud0
和cloud1
结合后的点云,但是如果已知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
的情况,有额外需要可以自行适当增添。
总结
函数返回两点云相减的结果,需要注意的是,减数点云必须要确保为被减数点云的子集,否则该函数将没有意义。