深入浅出(十六)pcl库

PCL是一个开源的三维点云处理库,提供了点云滤波、特征提取、表面重建等功能,常用于计算机视觉、机器人和自动驾驶等领域。文章介绍了PCL的下载、安装,以及点云数据的创建、可视化和基本应用,包括VoxelGrid滤波、法线估计和SACSegmentation的物体分割。
摘要由CSDN通过智能技术生成

1. pcl简介

PCL(Point Cloud Library)是一种用于处理三维点云数据的开源库,它提供了许多用于点云处理和分析的功能和算法。这些功能包括点云滤波、特征提取、配准、分割、表面重建等。PCL 提供了丰富的 C++ 类库和工具,使用户能够轻松地处理和操作三维点云数据。该库在计算机视觉、机器人学、自动驾驶等领域具有广泛的应用。

PCL 提供了丰富的功能和算法,可以应用于许多领域,包括但不限于:

  1. 点云处理:PCL 提供了各种点云处理算法,如滤波、配准、分割等,可以用于点云数据的预处理和清洗。
  2. 三维重建:利用 PCL 的表面重建算法,可以从点云数据中生成三维模型,适用于建筑重建、物体建模等领域。
  3. 物体识别与跟踪:PCL 提供了一些用于物体识别与跟踪的算法,可以用于机器人视觉、自动驾驶等应用。
  4. 地图构建:结合激光雷达等传感器数据,利用 PCL 可以构建环境地图,用于导航和定位。
  5. 特征提取与描述:PCL 提供了各种特征提取算法,可以从点云数据中提取出各种特征,并用于目标识别、物体匹配等任务。

1.1 pcl下载

  1. PCL官网:http://www.pointclouds.org/

2. pcl的安装及部署

3. pcl应用实例

3.1 点云

点云的格式

//点云数据
pcl::PointCloud<pcl::PointXYZRGB>::Ptr rgb_clound(new pcl::PointCloud<pcl::PointXYZRGB>);

点云的创建

//创建点云数据
void creatCloud(pcl::PointCloud<pcl::PointXYZRGB>::Ptr &rgb_clound) {
    
}

点云可视化

#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/visualization/cloud_viewer.h>
#define Random(x) (rand() % x)
//窗口显示点云
void showCloudPointXYZRGB(const pcl::PointCloud<pcl::PointXYZRGB>::Ptr &rgb_clound) {
    boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer1(new pcl::visualization::PCLVisualizer("3D Viewer"));
    viewer1->addPointCloud<pcl::PointXYZRGB>(rgb_clound);
    viewer1->setBackgroundColor(0, 0, 0); // 设置点云大小
    viewer1->addCoordinateSystem(0);
    //可选 可修改背景颜色
    while (!viewer1->wasStopped())
    {
        viewer1->spinOnce(100);//调用内部渲染函数,重新渲染输出时间最大不查过time=100
    }
}
void showCloudPointXYZ(std::vector<pcl::PointCloud<pcl::PointXYZ>>& cloud_clusters) {
	pcl::PointCloud<pcl::PointXYZRGB>::Ptr pointXYZRBG(new pcl::PointCloud<pcl::PointXYZRGB>);
	pcl::PointXYZRGB point;
	cout << "End show particle size:" << cloud_clusters.size() << endl;
	for (int i = 0; i < cloud_clusters.size(); i++) {
		int color_B = rand() % 255; 
		int color_G = rand() % 255; 
		int color_R = rand() % 255; 
		//int color_B = Random(255);
		//int color_G = Random(255);
		//int color_R = Random(255);
		for (int j = 0; j < cloud_clusters[i].size(); j++) {
			point.x = cloud_clusters[i].points[j].x;
			point.y = cloud_clusters[i].points[j].y;
			point.z = cloud_clusters[i].points[j].z;
			point.r = color_R;
			point.g = color_G;
			point.b = color_B;
			pointXYZRBG->push_back(point);
		}
	}
	showCloudPointXYZRGB(pointXYZRBG);
}

参考文献
1.PCL 读取点云文件+下采样点云+可视化点云+获取点云xyz坐标边界值:https://blog.csdn.net/a13956621590/article/details/115874031

3.2 pcl基本应用

当然,以下是一些基于PCL的简单代码示例,展示了如何在C++中使用PCL库进行点云处理的几个基本应用。这些代码示例仅供参考,你可以根据自己的需求进行进一步的定制和优化。

  1. 点云滤波(使用Voxel Grid滤波器)
    Voxel Grid滤波器可以对点云进行下采样,减少数据量。
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/voxel_grid.h>

int main(int argc, char** argv)
{
  // 读取点云数据
  pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
  pcl::io::loadPCDFile<pcl::PointXYZ>("input.pcd", *cloud);

  // 创建滤波器对象
  pcl::VoxelGrid<pcl::PointXYZ> sor;
  sor.setInputCloud(cloud);
  sor.setLeafSize(0.01f, 0.01f, 0.01f);
  pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>);
  sor.filter(*cloud_filtered);

  // 保存滤波后的点云数据
  pcl::io::savePCDFile<pcl::PointXYZ>("output.pcd", *cloud_filtered);

  return (0);
}
  1. 特征提取(使用Normal Estimation)
    Normal Estimation可以计算点云中每个点的法线。
#include <pcl/features/normal_3d.h>

int main()
{
  pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
  pcl::io::loadPCDFile<pcl::PointXYZ>("input.pcd", *cloud);

  // 创建法线估计对象
  pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne;
  ne.setInputCloud(cloud);

  // 创建KdTree对象
  pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>());
  ne.setSearchMethod(tree);

  // 输出参数
  pcl::PointCloud<pcl::Normal>::Ptr cloud_normals(new pcl::PointCloud<pcl::Normal>);
  ne.setRadiusSearch(0.03);
  ne.compute(*cloud_normals);

  // cloud_normals->points.size() 应与 cloud->points.size() 一致
}
  1. 物体识别与跟踪(使用SACSegmentation)
    SACSegmentation可以用于平面和对象的分割。
#include <pcl/segmentation/sac_segmentation.h>

int main()
{
  pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
  pcl::io::loadPCDFile<pcl::PointXYZ>("input.pcd", *cloud);

  pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients);
  pcl::PointIndices::Ptr inliers(new pcl::PointIndices);

  // 创建分割对象
  pcl::SACSegmentation<pcl::PointXYZ> seg;
  seg.setOptimizeCoefficients(true);
  seg.setModelType(pcl::SACMODEL_PLANE);
  seg.setMethodType(pcl::SAC_RANSAC);
  seg.setMaxIterations(1000);
  seg.setDistanceThreshold(0.01);

  seg.setInputCloud(cloud);
  seg.segment(*inliers, *coefficients);

  // inliers->indices 包含找到的平面的索引
}

以上代码只是PCL功能的冰山一角,PCL提供的功能远不止这些。可以通过阅读PCL的官方文档和示例代码,进一步了解如何使用PCL进行三维点云数据的处理和分析。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小老鼠不吃猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值