点云库PCL学习笔记 -- k-d tree 与八叉树 -- 4.基于八叉树的无序点云数据集的空间变化检测

点云库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

结果如下:

在这里插入图片描述


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值