代码分享:点云下采样至一个固定数量点的点云

本文介绍了一种将不规则点云数据下采样至固定点数的方法,适用于深度学习前的数据预处理。通过随机抽取不重复的点云索引来实现,与pcl的voxel grid filter相比,虽简化了过程,但可能导致轮廓信息损失和点分布不均。建议结合pcl的Random Sample算法以保持点云特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景:

我获取了一些物体点云集,我想拿他们来搞深度学习。但是呢,他们每个点云的点数量不统一,无法作为网络的输入。那我们就需要对他们下采样至一个固定数量点的点云。


注:pcl的voxel grid filter可以下采样,但无法保证输出的点云的点的数量。


1. 代码:

#include <iostream>
#include <cstdlib>

#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/voxel_grid.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/common/transforms.h>

#define PI 3.1415

using namespace std;

typedef pcl::PointXYZ PointT;
typedef pcl::PointCloud<PointT> PointCloudT;
unsigned int num_out_pt = 1024*2;

PointCloudT::Ptr rotateABit(const PointCloudT::Ptr cloud_in){
    PointCloudT::Ptr cloud_transformed (new PointCloudT);
    Eigen::Matrix4f transform = Eigen::Matrix4f::Identity();
    float theta_deg = 30;
    float c = cos(theta_deg*PI / 180.0);
    float s = sin(theta_deg*PI / 180.0);
    transform(1,1) = c;
    transform(3,3) = c;
    transform(1,3) = -s;
   
### 点云下采样之随机采样算法 随机采样是一种简单高效的点云下采样方法,其核心思想是从原始点云中随机选取固定数量或比例的作为最终的结果[^3]。该方法的优在于其实现简便、运行速度快,并且能够有效减少点云的数据量而不显著改变整体结构。 #### 随机采样的工作原理 在随机采样过程中,可以通过设定样本数量或者采样比例来控制下采样后的点云密度。较小的采样数量会使得点云更加稀疏,而较大的采样数量则会使点云更密集[^1]。然而,由于采样过程具有一定的随机性,可能会导致采样后的点云分布不够均匀,这在某些对点云分布有严格要求的应用场景中是一个潜在缺陷。 #### 使用PCL库实现随机采样 以下是利用PCL(Point Cloud Library)实现随机采样的C++代码示例: ```cpp #include <iostream> #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #include <pcl/filters/random_sample.h> int main() { // 加载点云数据 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); pcl::io::loadPCDFile<pcl::PointXYZ>("input_cloud.pcd", *cloud); // 创建随机采样滤波器对象 pcl::RandomSample<pcl::PointXYZ> random_sample; random_sample.setInputCloud(cloud); // 设置采样率,例如保留50% random_sample.setSample(0.5); // 执行随机采样操作 pcl::PointCloud<pcl::PointXYZ>::Ptr filtered_cloud(new pcl::PointCloud<pcl::PointXYZ>); random_sample.filter(*filtered_cloud); // 保存并输出结果 pcl::io::savePCDFile<pcl::PointXYZ>("filtered_cloud.pcd", *filtered_cloud); std::cout << "Filtered cloud size: " << filtered_cloud->size() << std::endl; return 0; } ``` 此代码片段展示了如何加载点云文件、创建随机采样滤波器以及执行过滤操作[^3]。`setSample()`函数用于指定采样比例,也可以通过传递具体的整数值表示固定的采样数。 #### Python中的随机采样实现 (基于PCL-Py) 如果倾向于使用Python进行开发,则可以借助`pclpy`库完成类似的随机采样功能。下面是一段对应的Python代码: ```python import pclpy from pclpy import pcl import numpy as np # 加载点云数据 cloud = pcl.PointCloud.PointXYZ() reader = pcl.io.PCDReader() reader.read("/path/to/input_cloud.pcd", cloud) # 初始化随机采样滤波器 filter_ = pcl.filters.RandomSample.PointXYZ() filter_.setInputCloud(cloud) # 设定采样数量 filter_.setSample(10000) # 进行随机采样 cloud_filtered = pcl.PointCloud.PointXYZ() filter_.filter(cloud_filtered) # 将结果写入新的PCD文件 writer = pcl.io.PCDWriter() writer.write("/path/to/output_cloud.pcd", cloud_filtered, False) ``` 这段脚本同样实现了从输入点云中提取固定数量的功能[^4]。 #### Matlab中的随机采样实现 对于偏好Matlab环境的研究者来说,也有相应的方式来进行点云的随机下采样。虽然官方文档并未提供专门针对随机采样的内置函数,但可通过简单的逻辑编写自定义程序达成目标[^5]。例如: ```matlab function downsampledCloud = randomDownsample(pointCloud, numSamples) % pointCloud 是输入的点云矩阵,numSamples 表示期望抽取的数 totalPoints = size(pointCloud, 1); % 获取总数 indices = randperm(totalPoints, numSamples); % 随机生成索引 downsampledCloud = pointCloud(indices, :); % 提取对应 end ``` 调用以上函数即可轻松获取经过随机采样处理的新集。 --- ### 总结 综上所述,随机采样作为一种基础却实用的技术手段,在多种编程环境下均具备成熟的解决方案。无论是C++还是Python抑或是Matlab,开发者都可以依据实际需求灵活选用合适的工具与框架实施这一策略。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值