问题:如题

代码如下:

#include <pcl/point_cloud.h>
#include <pcl/octree/octree_pointcloud_changedetector.h>//这个文件里面缺少一个文件如下

#include <iostream>
#include <vector>
#include <ctime>

using namespace std;

int
main (int argc, char** argv)
{
srand ((unsigned int) time (NULL));

// Octree resolution - side length of octree voxels
float resolution = 32.0f;

// Instantiate octree-based point cloud change detection class
pcl::octree::OctreePointCloudChangeDetector<pcl::PointXYZ> octree(resolution);

pcl::PointCloud<pcl::PointXYZ>::Ptr cloudA (new pcl::PointCloud<pcl::PointXYZ> );//定义A点云

// Generate pointcloud data for cloudA
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);
}

//output cloudA
cout<<"cloudA: "<<endl;
for(size_t i=0;i<cloudA->points.size();++i)
{
cout<<cloudA->points[i].x<<" , "<<cloudA->points[i].y<<" , "<<cloudA->points[i].z<<endl;
}

cout<<"----------------------------------------------------------------------------------------"<<endl;
// Add points from cloudA to octree
octree.setInputCloud (cloudA);
octree.addPointsFromInputCloud ();

// Switch octree buffers: This resets octree but keeps previous tree structure in memory.
octree.switchBuffers ();

pcl::PointCloud<pcl::PointXYZ>::Ptr cloudB (new pcl::PointCloud<pcl::PointXYZ> );

// Generate pointcloud data for cloudB
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);
}
//output cloudB
cout<<"cloudB: "<<endl;
for(size_t i=0;i<cloudB->points.size();++i)
{
cout<<cloudB->points[i].x<<" , "<<cloudB->points[i].y<<" , "<<cloudB->points[i].z<<endl;
}

// Add points from cloudB to octree
octree.setInputCloud (cloudB);
octree.addPointsFromInputCloud ();

std::vector<int> newPointIdxVector;

// Get vector of point indices from octree voxels which did not exist in previous buffer
octree.getPointIndicesFromNewVoxels (newPointIdxVector);

// Output points
cout<<"-------------------------------------------------------------------"<<endl;
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;

}

解决:In usr/include/pcl-1.7/pcl/octree the header "octree_pointcloud_changedetector.h" misses an include of the header octree2buf_base.h

CHANGELOG (in "octree_pointcloud_changedetector.h") -> add ​​#include "octree2buf_base.h"​​

参考:​​​https://github.com/PointCloudLibrary/pcl/issues/2564​