4 PCL无序点云检测

//  3、交换八叉树缓存,但是cloudA对应的八叉树仍在内存中
octree.switchBuffers();

其意思假若有两个格子,将A加载进去第一个格子之后,通过octree.switchBuffers()实现将A换在第二个格子中。

后续再又进行了cloudB的操作就把B放在了第一个格子中

假设A和B是相同东西,进行监测——监测A和B索引,对比相交不同的部分,即打出B中对于同样的A来说不同的异常点

所以将B点云改成A点云,最后输出为空

  1. std::vector<int> newPointIdxVector; 定义了一个整数向量 newPointIdxVector,它将用于存储从八叉树中检索到的新体素中点的索引。

  2. octree.getPointIndicesFromNewVoxels(newPointIdxVector); 调用八叉树对象 octree 的 getPointIndicesFromNewVoxels 方法,并将 newPointIdxVector 作为参数传递。这个方法会检查自上次调用 getPointIndicesFromNewVoxels(或八叉树创建时,如果这是第一次调用)以来添加到八叉树中的新体素,并将这些体素中包含的点的索引添加到 newPointIdxVector 中。

    #include <pcl/point_cloud.h>
    #include <pcl/octree/octree.h>
    #include <iostream>
    #include <vector>
    #include <ctime>
    
    using namespace pcl;
    
    #if 1
    int main(int argc, char** argv)
    {
    	srand((unsigned int)time(NULL));
    
    	// 八叉树分辨率 即体素的大小
    	float resolution = 16.0f;//正方体的边长为16mm
    
    	// 1、初始化空间变化检测对象
    	octree::OctreePointCloudChangeDetector<PointXYZ>octree(resolution);
    
    	// 2、为cloudA创建点云 ,添加点云到八叉树,建立八叉树
    	PointCloud<PointXYZ>::Ptr cloudA(new PointCloud<PointXYZ>);
    	cloudA->width = 128;
    	cloudA->height = 1;
    	cloudA->points.resize(cloudA->width * cloudA->height);
    	for (size_t i = 0; i < cloudA->points.size(); ++i)
    	{
    		cloudA->points[i].x = 64.0f * rand() / (RAND_MAX + 1.0f);
    		cloudA->points[i].y = 64.0f * rand() / (RAND_MAX + 1.0f);
    		cloudA->points[i].z = 64.0f * rand() / (RAND_MAX + 1.0f);
    	}
    	octree.setInputCloud(cloudA);//建立八叉树
    	octree.addPointsFromInputCloud();//执行更新八叉树
    
    	//  3、交换八叉树缓存,但是cloudA对应的八叉树仍在内存中
    	octree.switchBuffers();
    
    	// 4、为cloudB创建点云,添加 cloudB到八叉树
    	PointCloud<PointXYZ>::Ptr cloudB(new PointCloud<PointXYZ>);
    	cloudB->width = 128;
    	cloudB->height = 1;
    	cloudB->points.resize(cloudB->width * cloudB->height);
    	for (size_t i = 0; i < cloudB->points.size(); ++i)
    	{
    		cloudB->points[i].x = 64.0f * rand() / (RAND_MAX + 1.0f);
    		cloudB->points[i].y = 64.0f * rand() / (RAND_MAX + 1.0f);
    		cloudB->points[i].z = 64.0f * rand() / (RAND_MAX + 1.0f);
    	}
    	octree.setInputCloud(cloudB); 
    	octree.addPointsFromInputCloud();//执行更新八叉树状态
    
    
    	// 5、点云B ,相对于点云A,没有的体素点
    	std::vector<int>newPointIdxVector; // 后添加进来的点云的索引
    	octree.getPointIndicesFromNewVoxels(newPointIdxVector);
    
    	//打印输出点
    	std::cout << "Output from getPointIndicesFromNewVoxels:" << std::endl;
    	for (size_t i = 0; i < newPointIdxVector.size(); ++i)
    	{
    		std::cout << i << "# Index:" << newPointIdxVector[i]
    			<< "  Point:" << cloudB->points[newPointIdxVector[i]].x << " "
    			<< cloudB->points[newPointIdxVector[i]].y << " "
    			<< cloudB->points[newPointIdxVector[i]].z << std::endl;
    	}
    }
    
    #endif
    
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值