// 3、交换八叉树缓存,但是cloudA对应的八叉树仍在内存中
octree.switchBuffers();
其意思假若有两个格子,将A加载进去第一个格子之后,通过octree.switchBuffers()实现将A换在第二个格子中。
后续再又进行了cloudB的操作就把B放在了第一个格子中
假设A和B是相同东西,进行监测——监测A和B索引,对比相交不同的部分,即打出B中对于同样的A来说不同的异常点
所以将B点云改成A点云,最后输出为空
-
std::vector<int> newPointIdxVector;
定义了一个整数向量newPointIdxVector
,它将用于存储从八叉树中检索到的新体素中点的索引。 -
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