点云库PCL学习笔记 -- k-d tree 与八叉树 -- 4.基于八叉树的无序点云数据集的空间变化检测
基于八叉树的无序点云数据集的空间变化检测代码octree_change_detection.cpp
#include <pcl/point_cloud.h>
#include <pcl/octree/octree_pointcloud_changedetector.h>
#include <iostream>
#include <vector>
#include <ctime>
int
main (int argc, char** argv)
{
srand ((unsigned int) time (NULL));
//八叉树分辨率 即体素的大小
float resolution = 32.0f;
//始化空间变化检测对象
pcl::octree::OctreePointCloudChangeDetector<pcl::PointXYZ> octree (resolution);
//创建了一个名为cloudA的指针,储存XYZ类型的点云数据
pcl::PointCloud<pcl::PointXYZ>::Ptr cloudA (new pcl::PointCloud<pcl::PointXYZ> );
//为 cloudA 创建点云,并用随机数对其进行赋值
cloudA->width = 128;
cloudA->height = 1;
cloudA->points.resize (cloudA->width * cloudA->height);
for (std::size_t i = 0; i < cloudA->size (); ++i)
{
(*cloudA)[i].x = 64.0f * rand () / (RAND_MAX + 1.0f);
(*cloudA)[i].y = 64.0f * rand () / (RAND_MAX + 1.0f);
(*cloudA)[i].z = 64.0f * rand () / (RAND_MAX + 1.0f);
}
//添加点云A到八叉树,构建八叉树
octree.setInputCloud (cloudA); //设置输入点云A
octree.addPointsFromInputCloud (); //从输入点云构建八叉树
//交换八叉树缓存,但是 cloudA 对应的八叉树仍在内存中
octree.switchBuffers ();
//创建了一个名为 cloudB 的指针,储存XYZ类型的点云数据
pcl::PointCloud<pcl::PointXYZ>::Ptr cloudB (new pcl::PointCloud<pcl::PointXYZ> );
//为 cloudB 创建点云,并用随机数对其进行赋值
cloudB->width = 128;
cloudB->height = 1;
cloudB->points.resize (cloudB->width * cloudB->height);
for (std::size_t i = 0; i < cloudB->size (); ++i)
{
(*cloudB)[i].x = 64.0f * rand () / (RAND_MAX + 1.0f);
(*cloudB)[i].y = 64.0f * rand () / (RAND_MAX + 1.0f);
(*cloudB)[i].z = 64.0f * rand () / (RAND_MAX + 1.0f);
}
//添加点云B到八叉树,构建八叉树
octree.setInputCloud (cloudB); //设置输入点云B
octree.addPointsFromInputCloud (); //从输入点云构建八叉树
std::vector<int> newPointIdxVector; //存储新加点的索引向量
//获取前一 cloudA 对应的八叉树在 cloudB 对应八叉树中没有的体素(点集)
octree.getPointIndicesFromNewVoxels (newPointIdxVector);
//打印所有结果点的坐标
std::cout << "Output from getPointIndicesFromNewVoxels:" << std::endl;
for (std::size_t i = 0; i < newPointIdxVector.size (); ++i)
std::cout << i << "# Index:" << newPointIdxVector[i]
<< " Point:" << (*cloudB)[newPointIdxVector[i]].x << " "
<< (*cloudB)[newPointIdxVector[i]].y << " "
<< (*cloudB)[newPointIdxVector[i]].z << std::endl;
}
设置编译文件CMakeLists.txt
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
project(octree_change_detection)
find_package(PCL 1.2 REQUIRED)
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})
add_executable (octree_change_detection octree_change_detection.cpp)
target_link_libraries (octree_change_detection ${PCL_LIBRARIES})
编译
mkdir build
cd build/
cmake ..
make
执行程序
cd ..
./build/octree_change_detection
结果如下: