PCL——(6)八叉树Octree

本文介绍了八叉树的基本概念,构建步骤,并详细阐述了其在点云处理中的应用,包括点云压缩、空间划分与搜索、空间变化检测、占用检测、体素过滤和迭代器等,同时探讨了光线跟踪碰撞检测。
摘要由CSDN通过智能技术生成

一、八叉树简介:

  • 体素化使用空间的均匀分割
  • 八叉树对空间非均匀分割(按需分割)
    • 1D数据的2叉树表示
    • 2D数据的4叉树表示
    • 3D数据的8叉树表示
      在这里插入图片描述

二、构建步骤

(1).设定最大递归深度。
(2).找出场景的最大尺寸,并以此尺寸建立第一个立方体。
(3).依序将单位元元素丢入能被包含且没有子节点的立方体。
(4).若没达到最大递归深度,就进行细分八等份,再将该立
方体所装的单位元元素全部分担给八个子立方体。
(5).若发现子立方体所分配到的单位元元素数量不为零且跟
父立方体是一样的,则该子立方体停止细分,因为根据空
间分割理论,细分的空间所得到的分配必定较少,若是一
样数目,则再怎么切数目还是一样,会造成无穷切割的情
形。
(6).重复3,直到达到最大递归深度。
在这里插入图片描述在这里插入图片描述

三、点云八叉树应用算法:

  • 搜索操作(邻域、半径、体素搜索)
  • 降采样(体素网格/体素质心滤波器)
  • 点云压缩
  • 空间变化检测
  • 空间点密度分析
  • 占用检查/占位地图
  • 碰撞检测
  • 点云合并

3.1 Octree用于点云压缩

在下面,我们将解释如何有效地压缩单点云和点云流。在这个例子中,我们使用OpenNIGrabber捕捉点云,并使用PCL点云压缩技术进行压缩。

#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/io/openni_grabber.h>
#include <pcl/visualization/cloud_viewer.h>

#include <pcl/compression/octree_pointcloud_compression.h>

#include <stdio.h>
#include <sstream>
#include <stdlib.h>

#ifdef WIN32
# define sleep(x) Sleep((x)*1000)
#endif

class SimpleOpenNIViewer
{
   
public:
  SimpleOpenNIViewer () :
    viewer (" Point Cloud Compression Example")
  {
   
  }

  void
  cloud_cb_ (const pcl::PointCloud<pcl::PointXYZRGBA>::ConstPtr &cloud)
  {
   
    if (!viewer.wasStopped ())
    {
   
      // stringstream to store compressed point cloud
      std::stringstream compressedData;
      // output pointcloud
      pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloudOut (new pcl::PointCloud<pcl::PointXYZRGBA> ());

      // compress point cloud
      PointCloudEncoder->encodePointCloud (cloud, compressedData);

      // decompress point cloud
      PointCloudDecoder->decodePointCloud (compressedData, cloudOut);


      // show decompressed point cloud
      viewer.showCloud (cloudOut);
    }
  }

  void
  run ()
  {
   

    bool showStatistics = true;

    // for a full list of profiles see: /io/include/pcl/compression/compression_profiles.h
    pcl::io::compression_Profiles_e compressionProfile = pcl::io::MED_RES_ONLINE_COMPRESSION_WITH_COLOR;

    // instantiate point cloud compression for encoding and decoding
    PointCloudEncoder = new pcl::io::OctreePointCloudCompression<pcl::PointXYZRGBA> (compressionProfile, showStatistics);
    PointCloudDecoder = new pcl::io::OctreePointCloudCompression<pcl::PointXYZRGBA> ();

    // create a new grabber for OpenNI devices
    pcl::Grabber* interface = new pcl::OpenNIGrabber ();

    // make callback function from member function
    std::function<void(const pcl::PointCloud<pcl::PointXYZRGBA>::ConstPtr&)> f =
      [this] (const pcl::PointCloud<pcl::PointXYZRGBA>::ConstPtr& cloud) {
    cloud_cb_ (cloud); };

    // connect callback function for desired signal. In this case its a point cloud with color values
    boost::signals2::connection c = interface->registerCallback (f);

    // start receiving point clouds
    interface->start ();

    while (!viewer.wasStopped ()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值