@[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);
评论(1)
您还未登录,请登录后发表或查看评论