@[toc]

原项目地址

数据类型声明

using PointType = pcl::PointXYZ;
// PointVector = pcl::PointCloud.points
using PointVector = std::vector<PointType, Eigen::aligned_allocator<PointType>>;

struct BoxPointType
{
    float vertex_min[3];
    float vertex_max[3];
};

构建对象

KD_TREE<PointType> ikdtree;

KD_TREE<PointType>::Ptr kdtree_ptr(new KD_TREE<PointType>());

输入点云

pcl::PointCloud<PointType>::Ptr src(new pcl::PointCloud<PointType>);
//ikd_Tree.set_downsample_param(5); // 可选的参数,只有插入点云时,每个格子只会保留一个点,额外的点不会被插入(实测好像没用)
ikd_Tree.Build((*src).points);

增加点

PointVector cloud_increment
ikd_Tree.Add_Points(cloud_increment, false); // kd树增加点

删除点

PointVector cloud_decrement;
ikd_Tree.Delete_Points(cloud_decrement);

搜索box内的点云

BoxPointType boxpoint;
PointVector Searched_Points;
ikd_Tree.Box_Search(boxpoint, Searched_Points);

删除box中的点

vector<BoxPointType> Delete_Boxes;
ikd_Tree.Delete_Point_Boxes(Delete_Boxes);

增加box中的点(得先删除,不会无中生有)

vector<BoxPointType> Add_Boxes;
ikd_Tree.Add_Point_Boxes(Add_Boxes);

搜索半径内的点云

float radius = 7.5;
PointVector Searched_Points_radius;
ikd_Tree.Radius_Search(ball_center_pt, radius, Searched_Points_radius);

搜索最近的K个点

PointVector search_result; // 最近邻搜索到的点云
vector<float> PointDist;
ikd_Tree.Nearest_Search(ball_center_pt, K, search_result, PointDist);

取出ikd-tree中的点云

PointVector ().swap(ikd_Tree.PCL_Storage);
ikd_Tree.flatten(ikd_Tree.Root_Node, ikd_Tree.PCL_Storage, NOT_RECORD);
pcl::PointCloud<PointType>::Ptr tmp(new pcl::PointCloud<PointType>);
tmp->points = ikd_Tree.PCL_Storage;

查看ikd-tree中的点云数

ikd_Tree.validnum()
// or
ikd_Tree.size()

获得被删除的点云`

PointVector ().swap(removed_points);
ikd_Tree.acquire_removed_points(removed_points);