点云库PCL的使用

相关头文件:

#include <pcl/io/io.h>
#include <pcl/point_types.h>

声明和定义点云对象:

pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_ptr(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointXYZ>& cloud = *cloud_ptr;

// 更简洁写法
using MyPoint = pcl::PointXYZ;
using MyCloud = pcl::PointCloud<MyPoint>;
using MyCloudPtr = CLOUD::Ptr;

初始化点云数据PCD文件头:

cloud.width = 30720;
cloud.height = 1;
cloud.is_dense = false;
cloud.points.resize(cloud.width * cloud.height);
pcl::PointXYZRGB color_point;
for (size_t i = 0; i < cloud.points.size(); ++i) {
    cloud.points[i].x = color_point.x;
    cloud.points[i].y = color_point.y;
    cloud.points[i].z = color_point.z;
    cloud.points[i].rgb = color_point.rgb;
}

cloud.height用来判断是否为有序点云,=1则是无序点云也可以使用如下函数代替:if (!cloud.isOrganized ()),对于无序点云来说:width就是指点云中点的个数,对于有结构点云来说:width是指点云数据集一行上点的个数,立体相机或者TOF相机获得的点云数据就属于这一类。对于有结构点云的一大好处就是能知道点云中点的相邻关系,最近邻操作效率就非常高,可以大大提高PCL中相应算法的效率。但是结构点云经过某些人为操作后,会变为无结构点云,比如滤波操作等。
例如:有结构点云

cloud.width = 640; // Image-like organized structure, with 640 rows and 480 columns,

cloud.height = 480; // thus 640*480=307200 points total in the dataset

无结构点云

cloud.width = 307200;

cloud.height = 1; // unorganized point cloud dataset with 307200 points

cloud.is_dense (bool)  判断points中的数据是否是有限的(有限为true)或者说是判断点云中的点是否包含 Inf/NaN这种值(包含为false)。

points存储了数据类型为PointT的一个动态数组,例如,对于一个包含了XYZ数据的点云,points是包含了元素为pcl::PointXYZ一个vector。 相当于vector<point3f>

可视化pcd文件:

sudo apt install pcl-tools
pcl_viewer file_name.pcd

pcl_viewer窗口操作的快捷键 

p,P: switch to a point-based representation(以点为基准展示) 

w,W: switch to a wireframe-based representation (where available)(以线框为基准展示)

s,S: switch to a surface-based representation (where available)(以平面为基准展示)

j,J: take a .PNG snapshot of the current window view(将当前窗口截图为png格式,保存在bin目录下的Debug或者Release目录下)

c,C: display current camera/window parameters(显示当前相机参数)

+/-: increment/decrement overall point size(放大或缩小当前所有点的尺寸)

g,G: display scale grid (on/off)(开启标尺)

u,U: display lookup table (on/off)(开启colorbar)

r,R: [+ ALT]: reset camera [to viewpoint = {0, 0, 0} -> center_{x, y, z}](将相机平移到某个位置)

ALT + s,S: turn stereo mode on/off(打开立体模式)

ALT + f,F: switch between maximized window mode and original size(改变当前窗口的尺寸)
ALT + 0..9 [+ CTRL]: switch between different geometric handlers (where available)
      0..9 [+ CTRL]: switch between different color handlers (where available)

颜色显示:
1:随机颜色
2:从左到右(x)
3:从
### PCL点云库的功能概述 PCL(Point Cloud Library)是一个开源的跨平台C++库,专门用于处理大规模点云数据和三维几何信息。它提供了丰富的功能模块,涵盖了点云滤波、分割、配准、特征提取等多个方面[^1]。 以下是关于PCL的一些核心功能及其使用方法: --- #### 1. **点云读取与写入** PCL支持多种文件格式的点云数据读取与保存操作,常见的有`.pcd`文件格式。通过以下代码可以实现基本的点云加载与存储: ```cpp #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> // 加载PCD文件 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); if (pcl::io::loadPCDFile<pcl::PointXYZ>("test.pcd", *cloud) == -1) { std::cerr << "无法打开文件 test.pcd" << std::endl; } // 存储点云到PCD文件 pcl::io::savePCDFileASCII("output.pcd", *cloud); ``` 上述代码展示了如何加载并保存一个名为`test.pcd`的点云文件[^2]。 --- #### 2. **点云滤波** PCL提供了一系列滤波器工具,可用于去除噪声或简化点云数据。常用的滤波器包括体素网格下采样(Voxel Grid Downsample)、统计异常值移除(Statistical Outlier Removal),等等。 ##### (a)体素网格下采样 该方法通过对空间进行划分来减少点的数量。 ```cpp #include <pcl/filters/voxel_grid.h> pcl::VoxelGrid<pcl::PointXYZ> voxel_filter; voxel_filter.setInputCloud(cloud); voxel_filter.setLeafSize(0.01f, 0.01f, 0.01f); // 设置体素大小 pcl::PointCloud<pcl::PointXYZ>::Ptr filtered_cloud(new pcl::PointCloud<pcl::PointXYZ>); voxel_filter.filter(*filtered_cloud); ``` ##### (b)统计异常值移除 此方法基于邻域内的距离分布剔除离群点。 ```cpp #include <pcl/filters/statistical_outlier_removal.h> pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor_filter; sor_filter.setInputCloud(cloud); sor_filter.setMeanK(50); // 邻域点数 sor_filter.setStddevMulThresh(1.0); // 偏差阈值 pcl::PointCloud<pcl::PointXYZ>::Ptr cleaned_cloud(new pcl::PointCloud<pcl::PointXYZ>); sor_filter.filter(*cleaned_cloud); ``` 以上两段代码分别实现了点云的降噪和精简[^3]。 --- #### 3. **点云分割** PCL能够识别点云中的平面或其他特定形状区域。例如,RANSAC算法常被用来检测平面上的点集。 ```cpp #include <pcl/sample_consensus/method_types.h> #include <pcl/sample_consensus/model_types.h> #include <pcl/segmentation/sac_segmentation.h> pcl::SACSegmentation<pcl::PointXYZ> seg; seg.setOptimizeCoefficients(true); seg.setModelType(pcl::SACMODEL_PLANE); // 平面模型 seg.setMethodType(pcl::SAC_RANSAC); // RANSAC方法 seg.setMaxIterations(1000); // 迭代次数 seg.setDistanceThreshold(0.01); // 距离阈值 pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients()); pcl::PointIndices::Ptr inliers(new pcl::PointIndices()); seg.setInputCloud(cloud); seg.segment(*inliers, *coefficients); if (inliers->indices.empty()) { std::cout << "未找到任何平面" << std::endl; } else { std::cout << "找到了平面:" << coefficients->values.size() << "个系数" << std::endl; } ``` 这段代码演示了如何从点云中提取出一个平面[^4]。 --- #### 4. **点云配准** ICP(Iterative Closest Point)是一种经典的点云配准算法,在PCL中有现成的支持。 ```cpp #include <pcl/registration/icp.h> pcl::IterativeClosestPoint<pcl::PointXYZ, pcl::PointXYZ> icp; icp.setMaximumIterations(100); // 最大迭代次数 icp.setInputSource(source_cloud); // 输入源点云 icp.setInputTarget(target_cloud); // 输入目标点云 pcl::PointCloud<pcl::PointXYZ>::Ptr aligned_cloud(new pcl::PointCloud<pcl::PointXYZ>()); icp.align(*aligned_cloud); std::cout << "最终误差: " << icp.getFitnessScore() << std::endl; ``` 这里展示的是两个点云之间的刚性变换计算过程。 --- #### 5. **其他高级应用** 除了上述基础功能外,PCL还支持更复杂的场景分析任务,比如曲率估计、法线计算、聚类等。具体可参阅官方文档或相关书籍《人工智能点云处理及深度学习算法》。 --- ### 总结 PCL作为一款强大的点云处理工具包,其灵活性和扩展性使其成为研究者们不可或缺的选择之一。无论是简单的可视化还是复杂的数据挖掘,都能借助这一框架完成高效开发。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值