PCL学习笔记

PCL的结构和内容:

PCL完全是一个模块化的现代C++模板库。其基于以下第三方库:Boost、Eigen、FLANN、VTK、CUDA、OpenNI、QHull,实现点云相关的获取、滤波、分割、配准、检索、特征提取、识别、追踪、曲面重建、可视化等。
- Boost:用于共享指针和线程;
- Eigen:用于矩阵、向量等数据操作;
- FLANN:用于在KD树模块中快速近邻搜索;
- VTK:在可视化模块中用于3D点云渲染和可视化;

为了进一步简化和开发,PCL被分成一系列较小的代码库:
- libpcl filters:采样、去除离群点、特征提取、拟合估计等过滤器。
- libpcl features:实现多种三维特征的筛选,如:曲面法线、曲率、边界点估计等。
- libpcl I/O:实现数据的输入和输出操作。
- libpcl surface:实现表面重建技术,如网格重建,凸包重建。
- libpcl register:实现点云配准方法,如ICP等。
- libpclkeypoints:实现不同的关键点提取方法。
- libpcl range:实现支持不同点云数据集生成的范围图像。

常用到的一些函数和点云操作:

I/O操作

pcl支持obj,pcd,ply等多种格式的点云输入和输出,如下:

#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
// 从文件中读入点云
typedef pcl::PointXYZRGB PointT;
pcl::PointCloud<PointT>::Ptr cloud(new pcl::PointCloud<PointT>);

std::string dir = "E:\\datas\\";
std::string filename = "0kinect_1pcl.pcd";

if (pcl::io::loadPCDFile<PointT>((dir + filename), *cloud) == -1)
{
    //* load the file 
    PCL_ERROR("Couldn't read PCD file \n");
    return (-1);
}

// 保存点云为pcd的二进制格式文件
pcl::io::savePCDFileBinary((dir + "handled_" + filename), *handled_cloud);

可视化

  • 单个窗口显示
#include <pcl/visualization/cloud_viewer.h>
pcl::visualization::CloudViewer viewer("Display");
viewer.showCloud(cloud);

while (! viewer.wasStopped())
{


}
  • 多个窗口显示
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("Display"));


int v1(0);
viewer->createViewPort(0, 0, 0.5, 1, v1);
viewer->setBackgroundColor(0, 0, 0, v1);
viewer->addText("0kinect_1pcl" , 10, 10, "v1 text", v1);
pcl::visualization::PointCloudColorHandlerRGBField <PointT> rgb(cloud);
viewer->addPointCloud<PointT>(cloud, rgb, "cloud", v1);


int v2(0);
viewer->createViewPort(0.5, 0, 1, 1, v2);
viewer->setBackgroundColor(0, 0, 0, v2);
viewer->addText("handled_0kinect_1pcl" , 10, 10, "v2 sftext", v2);
pcl::visualization::PointCloudColorHandlerRGBField <PointT> handled_rgb(handled_cloud);
viewer->addPointCloud<PointT>(handled_cloud, handled_rgb, "handled_cloud", v2);


viewer->initCameraParameters();
viewer->spin();
  • 更新点云并显示
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("Display"));
viewer->addPointCloud<pcl::PointXYZRGB>(cloud);
viewer->spinOnce();
while()
{
    //cloud更新
    viewer->updatePointCloud(cloud);
    viewer->spinOnce();
}

刚体变换

#include<pcl/registration/ndt.h>
// 旋转平移点云B
Eigen::Matrix4f RT;             // 旋转平移矩阵
RT <<
    0.937433421612, - 0.003769298084, - 0.348144203424, 0.286217689514,
    -0.018016768619, 0.998076498508 ,- 0.059319011867, 0.055899277329,
    0.347698122263 ,0.061880055815, 0.935562312603 ,0.052540421486,
    0.000000000000, 0.000000000000, 0.000000000000, 1.000000000000;
pcl::transformPointCloud(*cloudB, *cloudB, RT);

滤波

  • 降采样
  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值