PCL-获取点云体素中的所有点的索引的方法

本文介绍如何通过OctreePointCloud的三个方法getPointIndex(), getPointIndicesVector(), 和getPointIndices()来获取体素化后的点云数据索引。这三种方法分别用于获取单个索引、索引向量引用及向量插入。

使用 octree 将点云体素化之后,获取体素中所有点的方法
即OctreeContainerBase中的三个方法的介绍:

getPointIndex()、getPointIndicesVector()、getPointIndices()

这三个方法都是定义在 pcl/octree/octree_container.h 文件中,源码如下:

首先在该文件中,leafDataTVector_ 是一个存储了该体素中所有点的 vector

        /** \brief Leaf node DataT vector. */
        std::vector<int> leafDataTVector_;

getPointIndex() 是一个 int 类型的方法,能够将该体素中所有点的索引的最后一个返回 

        /** \brief Retrieve point index from container. This container stores a vector of point indices.
         * \return index stored within container.
         */
        int
        getPointIndex ( ) const
        {
          return leafDataTVector_.back ();
        }

getPointIndices() 方法是 void 类型的,没有返回值,使用是需要将定义好的 vector 写进函数的参数中,调用该方法时会将该体素中所有点的索引都插入到参数中的 vector

       /** \brief Retrieve point indices from container. This container stores a 
### 使用 PCL 获取点云索引 为了获取点云数据的索引,在 PCL 中通常会采用 `VoxelGrid` 类来创建网格并进行相应的操作。该类允许设置大小,即定义每个维度上的分辨率,并能有效地减少点云的数据量。 下面是一个简单的 C++ 实现例子,用于展示如何将点云转换成表示形式,并获得各个所属的索引: ```cpp #include <pcl/point_cloud.h> #include <pcl/io/pcd_io.h> #include <pcl/filters/voxel_grid.h> int main(int argc, char** argv){ // 加载输入点云文件 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); if (pcl::io::loadPCDFile<pcl::PointXYZ>("input.pcd", *cloud) == -1) { std::cerr << "无法加载点云文件." << std::endl; return (-1); } // 创建 VoxelGrid 对象 pcl::VoxelGrid<pcl::PointXYZ> voxel_filter; // 设置输入点云 voxel_filter.setInputCloud(cloud); // 定义尺寸(单位:米) float leaf_size = 0.05f; // 叶子节边长设为5厘米 voxel_filter.setLeafSize(leaf_size, leaf_size, leaf_size); // 存储下采样后的点云 pcl::PointCloud<pcl::PointXYZ>::Ptr downsampled_cloud(new pcl::PointCloud<pcl::PointXYZ>); // 执行过滤器处理 voxel_filter.filter(*downsampled_cloud); // 输出原始数和降采样后剩余的数量 std::cout << "原始数量:" << cloud->points.size() << "; 下采样之后保留下来的数量:" << downsampled_cloud->points.size() << "." << std::endl; // 遍历每一个找到其对应的位置 for(const auto& point : *downsampled_cloud){ int ijk[3]; double min_point[3], max_point[3]; // 获得当前栅格最小最大边界坐标 voxel_filter.getCentroidIndexAt(ijk, point.x, point.y, point.z); // 将ijk转为实际的空间坐标系下的min/max值 voxel_filter.getMinMaxXYZ(min_point,max_point); printf("Point(%f,%f,%f)'s centroid index is (%d,%d,%d)\n", point.x, point.y, point.z, ijk[0], ijk[1], ijk[2]); } } ``` 此代码片段展示了怎样读取一个 `.pcd` 文件作为输入源,应用滤波器降低密度,并打印出每个剩下所处的具的位置信息[^4]。 #### 关键概念解析 - **叶子大小**: 这里指的是构成立方每条边的实际长度,它决定了最终得到多少个单元。 - **getCentroidIndexAt 方法**: 此方法接收三个浮型参数代表某一在笛卡尔坐标系里的具位置(x,y,z),返回整数值数组ijk[],指示这个特定位于哪个中心附近;注意这里的ijk并不是直接对应于xyz轴方向的距离而是离散化后的索引编号。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值