首页 > pcl_filters模块api代码解析

pcl_filters模块api代码解析

招募一起学习的小伙伴,加入我们群聊中,定期分享论文,以及工程相关的问题,讨论分享。根据自己的爱好,加入不同的点云交流群,我们期待有学习点云深度学习,点云PCL,cloudcompare,以及GDAL,Open3D相关的研究人员加入我们。加入方式:后台发送微信群,按要求备注即可。

       pcl_filters库包含3D点云数据的离群点和噪声点去除等功能。PCL中主要的滤波器有直通滤波器,体素格滤波器,统计滤波器,半径滤波器 等。不同特性的滤波器构成了较为完整的点云前处理族,并组合使用完成任务。实际上,滤波手段的选择和采集方式是密不可分的。

       点云滤波,顾名思义,就是滤掉噪声。原始采集的点云数据往往包含大量散列点、孤立点, 在获取点云数据时 ,由于设备精度,操作者经验环境因素带来的影响,以及电磁波的衍射特性,被测物体表面性质变化和数据拼接配准操作过程的影响,点云数据中讲不可避免的出现一些噪声。在点云处理流程中滤波处理作为预处理的第一步,对后续的影响比较大,只有在滤波预处理中, 将噪声点 ,离群点,孔洞,数据压缩等按照后续处理定制,才能够更好的进行配准,特征提取,曲面重建,可视化等后续应用处理.,其类似于信号处理中的滤波。

     1. 点云不是函数,无法建立横纵坐标之间的关系

     2. 点云在空间中是离散的,不像图像信号有明显的定义域

     3. 点云在空间中分布广泛,建立点与点之间的关系较为困难

     4. 点云滤波依赖于集合信息而非数值信息

 点云滤波方法主要有:

1. 直通滤波器 pcl::PassThrough pass

2. 体素格滤波器 pcl::VoxelGrid sor;

3. 统计滤波器    pcl::StatisticalOutlierRemoval sor;

4. 半径滤波器    pcl::RadiusOutlierRemoval outrem;

5. 双边滤波  pcl::BilateralFilter bf;

6. 高斯滤波    pcl::filters::GaussianKernel< PointInT, PointOutT >  

7. 立方体滤波 pcl::CropBox< PointT>    

8. 封闭曲面滤波 pcl::CropHull< PointT>   

9. 空间剪裁:

       pcl::Clipper3D

        pcl::BoxClipper3D

        pcl::CropBox

        pcl::CropHull 

10. 卷积滤波:实现将两个函数通过数学运算产生第三个函数,可以设定不同的卷积核

       pcl::filters::Convolution

        pcl::filters::ConvolvingKernel

11. 随机采样一致滤波等,通常组合使用完成任务。

PCL中总结了几种需要进行点云滤波处理情况

  (1)  点云数据密度不规则需要平滑

  (2) 因为遮挡等问题造成离群点需要去除

  (3) 大量数据需要下采样

  (4) 噪声数据需要去除

对应的方案如下:

  (1)按照给定的规则限制过滤去除点

  (2) 通过常用滤波算法修改点的部分属性

  (3)对数据进行下采样

class  pcl::ApproximateVoxelGrid< PointT >

对点云进行网格化下采样滤波处理

向上滑动阅览

void gridSampleApprox (const CloudConstPtr &cloud, Cloud &result, double leaf_size)

{

  pcl::ApproximateVoxelGrid grid;

  grid.setLeafSize (static_cast (leaf_size), static_cast (leaf_size),  static_cast (leaf_size));

  grid.setInputCloud (cloud);

  grid.filter (result);

}

class  pcl::BilateralFilter< PointT >

实现点云的双边滤波功能,具体理论可以查看论文

C. Tomasi and R. Manduchi. Bilateral Filtering for Gray and Color Images. In Proceedings of the IEEE International Conference on Computer Vision, 1998

该类的实现利用的并非XYZ字段的数据进行, 而是利用强度数据进行双边滤波算法的实现, 所以在使用该类时点云的类型必须有强度字段,否则无法进行双边滤波处理,双边滤波算法是通过取临近采样点和加权平均来修正当前采样点的位置,从而达到滤波效果,同时也会有选择剔除与当前采样点“差异”太大的相邻采样点,从而保持原特征的目的

class  pcl::BoxClipper3D< PointT >

实现空间裁剪

以下几个函数实现空间剪裁:

        pcl::Clipper3D

        pcl::BoxClipper3D

        pcl::CropBox

        pcl::CropHull 剪裁并形成封闭曲面

class  pcl::ConditionalRemoval< PointT >

ConditionalRemoval过滤满足特定条件的数据。可以一次删除满足对输入的点云设定的一个或多个条件指标的所有的数据点,删除点云中不符合用户指定的一个或者多个条件的数据点,用户必须为ConditionalRemoval提供条件。有两种类型的条件:ConditionAnd和ConditionOr。 

向上滑动阅览

#include

  //创建条件限定的下的滤波器

  // 创建点云对象 指针

  pcl::PointCloud::Ptr cloud (new pcl::PointCloud);

  pcl::PointCloud::Ptr cloud_filtered (new pcl::PointCloud);

  // 源点云读取获取后

  //创建条件定义对象

  pcl::ConditionAnd::Ptr range_cond (new pcl::ConditionAnd());   

  //为条件定义对象添加比较算子

  range_cond->addComparison (pcl::FieldComparison::ConstPtr (new

        pcl::FieldComparison ("z", pcl::ComparisonOps::GT, 0.0)));   

  //添加在Z字段上大于(pcl::ComparisonOps::GT great Then)0的比较算子

  range_cond->addComparison (pcl::FieldComparison::ConstPtr (new

        pcl::FieldComparison ("z", pcl::ComparisonOps::LT, 0.8)));   

  //添加在Z字段上小于(pcl::ComparisonOps::LT Lower Then)0.8的比较算子

  // 曲率条件

  // 创建条件定义对象  曲率

  // pcl::ConditionOr::Ptr range_cond (new pcl::ConditionOr () );

  // range_cond->addComparison (pcl::FieldComparison::ConstPtr (// 曲率 大于

  new pcl::FieldComparison ("curvature", pcl::ComparisonOps::GT, threshold))

    );

  

  // 创建滤波器并用条件定义对象初始化

      pcl::ConditionalRemoval condrem;//创建条件滤波器

      condrem.setCondition (range_cond); //并用条件定义对象初始化            

      condrem.setInputCloud (cloud);     //输入点云

      condrem.setKeepOrganized(true);    //设置保持点云的结构

      // 执行滤波

      condrem.filter(*cloud_filtered);  //大于0.0小于0.8这两个条件用于建立滤波器

class  pcl::filters::Convolution< PointIn, PointOut >

卷积滤波:实现将两个函数通过数学运算产生第三个函数,

该类提供点云的行,列和单独的卷积操作。只有有组织后者是有序的点云才允许使用列和单独的卷积。

可以设定不同的卷积核,有以下几种操作

       pcl::filters::Convolution

        pcl::filters::ConvolvingKernel

        pcl::filters::GaussianKernel< PointInT, PointOutT >

        pcl::filters::GaussianKernelRGB< PointInT, PointOutT >

 pcl::PointCloud::Ptr input_cloud (new pcl::PointCloud);

  pcl::PointCloud::Ptr kernel_cloud (new pcl::PointCloud);

  pcl::PointCloud::Ptr output_cloud (new pcl::PointCloud);

  /*example 1 : Gaussian Smoothing*/

  kernel.sigma_ = 2.0;

  kernel.kernel_size_ = 3;

  kernel.gaussianKernel (*kernel_cloud);

  convolution.kernel_ = *kernel_cloud;

  convolution.convolve (*output_cloud, *input_cloud);

class  pcl::ExtractIndices< PointT >

从点云中提取一组索引。

向上滑动阅览

案例1 :

pcl::ExtractIndices eifilter (true); // Initializing with true will allow us to extract the removed indices

eifilter.setInputCloud (cloud_in);

eifilter.setIndices (indices_in);

eifilter.filter (*cloud_out);

// The resulting cloud_out contains all points of cloud_in that are indexed by indices_in

indices_rem = eifilter.getRemovedIndices ();

// The indices_rem array indexes all points of cloud_in that are not indexed by indices_in

eifilter.setNegative (true);

eifilter.filter (*indices_out);

// Alternatively: the indices_out array is identical to indices_rem

eifilter.setNegative (false);

eifilter.setUserFilterValue (1337.0);

eifilter.filterDirectly (cloud_in);

// This will directly modify cloud_in instead of creating a copy of the cloud

// It will overwrite all fields of the filtered points by the user value: 1337

案例2:

基于某一分割算法提取点云中的一个子集

#include

#include

// 设置ExtractIndices的实际参数

pcl::ExtractIndices extract;        //创建点云提取对象

// 创建点云索引对象 

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

// 分割点云

// 为了处理点云包含的多个模型,在一个循环中执行该过程并在每次模型被提取后,保存剩余的点进行迭代

seg.setInputCloud (cloud_filtered);// 设置源 滤波后的点云

seg.segment (*inliers, *coefficients);// 输入分割系数得到 分割后的点云 索引inliers

// 提取索引 Extract the inliers

extract.setInputCloud (cloud_filtered);

extract.setIndices (inliers);

extract.setNegative (false);

extract.filter (*cloud_p);// 按索引提取 点云

class   pcl::FrustumCulling< PointT >

在相机的位姿和视野给出的平截头体内进行点云滤波。

pcl::PointCloud ::Ptr source;

// .. read or fill the source cloud

pcl::FrustumCulling fc;

fc.setInputCloud (source);

fc.setVerticalFOV (45);

fc.setHorizontalFOV (60);

fc.setNearPlaneDistance (5.0);

fc.setFarPlaneDistance (15);

Eigen::Matrix4f camera_pose;

// .. read or input the camera pose from a registration algorithm.

fc.setCameraPose (camera_pose);

pcl::PointCloud target;

fc.filter (target);

class   pcl::GridMinimum< PointT >

      在给定的点云上进行2D网格,并对数据进行下采样。

class  pcl::LocalMaximum< PointT >

      通过消除局部最大的点来对点云进行下采样。

class   pcl::MedianFilter< PointT >

中值滤波器

  pcl::MedianFilter fbf;

  fbf.setInputCloud (cloud_in);

  fbf.setMaxAllowedMovement (max_allowed_movement_);

  fbf.setWindowSize (window_size_);

  fbf.filter (*cloud_out);

class   pcl::NormalRefinement< NormalT >

法向量重定义(可以做实验验证,原本杂乱的法向量经过处理后会具有一致性),该类通过迭代地更新其邻域中所有法线的(加权)均值的每个法线来细化一组已经估计的法线。目的是重复使用与估计原始法线时相同的点对应关系,以避免重复最近邻搜索。

向上滑动阅览

// Input point cloud

pcl::PointCloud cloud;

// Fill cloud...

// Estimated and refined normals

pcl::PointCloud normals;

pcl::PointCloud normals_refined;

// Search parameters

const int k = 5;

std::vector > k_indices;

std::vector > k_sqr_distances;

// Run search

pcl::search::KdTree search;

search.setInputCloud (cloud.makeShared ());

search.nearestKSearch (cloud, std::vector (), k, k_indices, k_sqr_distances);

// Use search results for normal estimation

pcl::NormalEstimation ne;

for (unsigned int i = 0; i < cloud.size (); ++i)

{

NormalT normal;

ne.computePointNormal (cloud, k_indices[i]

normal.normal_x, normal.normal_y, normal.normal_z, normal.curvature);

pcl::flipNormalTowardsViewpoint (cloud[i], cloud.sensor_origin_[0], cloud.sensor_origin_[1], cloud.sensor_origin_[2],

normal.normal_x, normal.normal_y, normal.normal_z);

normals.push_back (normal);

}

// Run refinement using search results

pcl::NormalRefinement nr (k_indices, k_sqr_distances);

nr.setInputCloud (normals.makeShared ());

nr.filter (normals_refined);

class  pcl::PassThrough< PointT >

如果使用线结构光扫描的方式采集点云,必然物体沿z向分布较广,但x,y向的分布处于有限范围内。 此时可使用直通滤波器,确定点云在x或y方向上的范围,可较快剪除离群点,达到第一步粗处理的目的。

向上滑动阅览

// 创建点云对象 指针

    pcl::PointCloud::Ptr cloud (new pcl::PointCloud);

    pcl::PointCloud::Ptr cloud_filtered (new pcl::PointCloud);

    // 原点云获取后进行滤波

    pcl::PassThrough pass;// 创建滤波器对象

    pass.setInputCloud (cloud);//设置输入点云

    pass.setFilterFieldName ("z");//滤波字段名被设置为Z轴方向

    pass.setFilterLimits (0.0, 1.0);//可接受的范围为(0.0,1.0)

    //pass.setFilterLimitsNegative (true);//设置保留范围内 还是 过滤掉范围内

    pass.filter (*cloud_filtered); //执行滤波,保存过滤结果在cloud_filtered

class  pcl::ProjectInliers< PointT >

使用Point Cloud中的模型和一组inlier指数将它们投影到单独的PointCloud中。使用参数化模型投影点云,如何将点投影到一个参数化模型上(平面或者球体等),参数化模型通过一组参数来设定,对于平面来说使用其等式形式。在PCL中有特定存储常见模型系数的数据结构。

向上滑动阅览

#include

  #include

  #include

  #include         //模型系数头文件

  #include  //投影滤波类头文件

  // 创建点云对象 指针

  pcl::PointCloud::Ptr cloud (new pcl::PointCloud);

  pcl::PointCloud::Ptr cloud_projected (new pcl::PointCloud);

  // 源点云读取 获取 后

    //随机创建点云并打印出来

    cloud->width  = 5;

    cloud->height = 1;

    cloud->points.resize (cloud->width * cloud->height);

    for (size_t i = 0; i < cloud->points.size (); ++i)

    {

      cloud->points[i].x = 1024 * rand () / (RAND_MAX + 1.0f);

      cloud->points[i].y = 1024 * rand () / (RAND_MAX + 1.0f);

      cloud->points[i].z = 1024 * rand () / (RAND_MAX + 1.0f);

    }

  // 填充ModelCoefficients的值,使用ax+by+cz+d=0平面模型,其中 a=b=d=0,c=1 也就是X——Y平面

    //定义模型系数对象,并填充对应的数据 创建投影滤波模型重会设置模型类型 pcl::SACMODEL_PLANE

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

    coefficients->values.resize (4);

    coefficients->values[0] = coefficients->values[1] = 0;

    coefficients->values[2] = 1.0;

    coefficients->values[3] = 0;

    // 创建投影滤波模型ProjectInliers对象,使用ModelCoefficients作为投影对象的模型参数

    pcl::ProjectInliers proj;     //创建投影滤波对象

    proj.setModelType (pcl::SACMODEL_PLANE);     //设置对象对应的投影模型  平面模型

    proj.setInputCloud (cloud);                  //设置输入点云

    proj.setModelCoefficients (coefficients);    //设置模型对应的系数

    proj.filter (*cloud_projected);              //投影结果存储

  // 输出

   std::cerr << "Cloud after projection: " << std::endl;

    for (size_t i = 0; i < cloud_projected->points.size (); ++i)

      std::cerr << "    " << cloud_projected->points[i].x << " "

                          << cloud_projected->points[i].y << " "

                          << cloud_projected->points[i].z << std::endl;

class  pcl::VoxelGrid< PointT >

      如果使用高分辨率相机等设备对点云进行采集,往往点云会较为密集。 过多的点云数量会对后续分割工作带来困难。体素格滤波器可以达到向下采样同时不破坏点云本身几何结构的功能。点云几何结构 不仅是宏观的几何外形,也包括其微观的排列方式,比如横向相似的尺寸,纵向相同的距离。 随机下采样虽然效率比体素滤波器高,但会破坏点云微观结构.

      使用体素化网格方法实现下采样,即减少点的数量 减少点云数据,并同时保存点云的形状特征,在提高配准,曲面重建,形状识别等算法速度中非常实用,PCL是实现的VoxelGrid类通过输入的点云数据创建一个三维体素栅格,容纳后每个体素内用体素中所有点的重心来近似显示体素中其他点,这样该体素内所有点都用一个重心点最终表示,对于所有体素处理后得到的过滤后的点云, 这种方法比用体素中心(注意中心和重心)逼近的方法更慢,但是对于采样点对应曲面的表示更为准确。

向上滑动阅览

// 创建点云对象 指针

    pcl::PCLPointCloud2::Ptr cloud (new pcl::PCLPointCloud2 ());

    pcl::PCLPointCloud2::Ptr cloud_filtered (new pcl::PCLPointCloud2 ());

    // 源点云读取 获取 后

      pcl::VoxelGrid sor;  //创建滤波对象

      sor.setInputCloud (cloud);                //设置需要过滤的点云(指针) 给滤波对象

      sor.setLeafSize (0.01f, 0.01f, 0.01f);    //设置滤波时创建的体素体积为1cm的立方体

      sor.filter (*cloud_filtered);             //执行滤波处理,存储输出

class  pcl::VoxelGridOcclusionEstimation< PointT >

估计场景中的遮挡空间。具体查看论文:

John Amanatides and Andrew Woo, A Fast Voxel Traversal Algorithm for Ray Tracing

class  pcl::StatisticalOutlierRemoval< PointT >

    统计滤波器用于去除明显离群点(离群点往往由测量噪声引入)。其特征是在空间中分布稀疏,可以理解为:每个点都表达一定信息量,某个区域点越密集则可能信息量越大。噪声信息属于无用信息,信息量较小。所以离群点表达的信息可以忽略不计。考虑到离群点的特征,则可以定义某处点云小于某个密度,既点云无效。计算每个点到其最近的k(设定)个点平均距离。则点云中所有点的距离应构成高斯分布。给定均值与方差,可剔除n个∑之外的点

      激光扫描通常会产生密度不均匀的点云数据集,另外测量中的误差也会产生稀疏的离群点,此时,估计局部点云特征(例如采样点处法向量或曲率变化率)时运算复杂,这会导致错误的数值,反过来就会导致点云配准等后期的处理失败。

    解决办法:对每个点的邻域进行一个统计分析,并修剪掉一些不符合标准的点。具体方法为在输入数据中对点到临近点的距离分布的计算,对每一个点,计算它到所有临近点的平均距离(假设得到的结果是一个高斯分布,其形状是由均值和标准差决定),那么平均距离在标准范围之外的点,可以被定义为离群点并从数据中去除。

具体查看论文:

R. B. Rusu, Z. C. Marton, N. Blodow, M. Dolha, and M. Beetz. Towards 3D Point Cloud Based Object Maps for Household Environments Robotics and Autonomous Systems Journal (Special Issue on Semantic Knowledge), 2008.

向上滑动阅览

// 创建点云对象 指针

    pcl::PointCloud::Ptr cloud (new pcl::PointCloud);

    pcl::PointCloud::Ptr cloud_filtered (new pcl::PointCloud);

    // 创建滤波器,对每个点分析的临近点的个数设置为50 ,并将标准差的倍数设置为1  这意味着如果一个点的距离超出了平均距离一个标准差以上,则该点被标记为离群点,并将它移除,存储起来

    pcl::StatisticalOutlierRemoval sor;//创建滤波器对象

    sor.setInputCloud (cloud);                        //设置待滤波的点云

    sor.setMeanK (50);                                //设置在进行统计时考虑查询点临近点数

    sor.setStddevMulThresh (1.0);                     //设置判断是否为离群点的阀值

    sor.filter (*cloud_filtered);                     //存储

class  pcl::ShadowPoints< PointT, NormalT >

去除出现在边缘不连续处的鬼点

class  pcl::SamplingSurfaceNormal< PointT >

将输入空间划分为网格,直到每个网格包含最多N个点,并在每个网格内随机采样点,使用每个网格的N个点来计算法线。在网格内采样的所有点都被赋予相同的法线。以上两个模块的代码来自于 libpointmatcher (https://github.com/ethz-asl/libpointmatcher)

class  pcl::RandomSample< PointT >

具有均匀概率的随机采样类。具体可查看论文

Faster Methods for Random Sampling

向上滑动阅览

CentroidPoint centroid;

centroid.add (pcl::PointXYZ (1, 2, 3);

centroid.add (pcl::PointXYZ (5, 6, 7);  

  //这里是在centroid点集中加两个点

pcl::PointXYZ c1; 

centroid.get (c1);   //直接使用get函数获取该点集的在每个字段的均值

// 得到的结果是: c1.x == 3, c1.y == 4, c1.z == 5

// 我们也可以申明一个不一样字段的点云来存储结果

pcl::PointXYZRGB c2;

centroid.get (c2);

// 其中x,y,z字段的结果还是: c2.x == 3, c2.y == 4, c2.z == 5,

// 但是 c2.rgb 是不被触及的

class  pcl::RadiusOutlierRemoval< PointT >

     球半径滤波器与统计滤波器相比更加简单粗暴。以某点为中心 画一个球计算落在该球内的点的数量,当数量大于给定值时,则保留该点,数量小于给定值则剔除该点。此算法运行速度快,依序迭代留下的点一定是最密集的, 但是球的半径和球内点的数目都需要人工指定。

向上滑动阅览

/ 创建点云对象 指针

  pcl::PointCloud::Ptr cloud (new pcl::PointCloud);

  pcl::PointCloud::Ptr cloud_filtered (new pcl::PointCloud);

  // 源点云读取 获取 后

  pcl::RadiusOutlierRemoval outrem;  //创建滤波器

  outrem.setInputCloud(cloud);    //设置输入点云

  outrem.setRadiusSearch(0.8);    //设置半径为0.8的范围内找临近点

  outrem.setMinNeighborsInRadius (2);//设置查询点的邻域点集数小于2的删除

      // apply filter

  outrem.filter (*cloud_filtered);//执行条件滤波  在半径为0.8 在此半径内必须要有两个邻居点,此点才会保存

以上就是滤波模块的主要内容,大家可以留言补充内容,并可以分享你的总结到群主邮箱[email protected]

资源

三维点云论文及相关应用分享

【点云论文速读】基于激光雷达的里程计及3D点云地图中的定位方法

3D目标检测:MV3D-Net

三维点云分割综述(上)

3D-MiniNet: 从点云中学习2D表示以实现快速有效的3D LIDAR语义分割(2020)

win下使用QT添加VTK插件实现点云可视化GUI

JSNet:3D点云的联合实例和语义分割

大场景三维点云的语义分割综述

PCL中outofcore模块---基于核外八叉树的大规模点云的显示

基于局部凹凸性进行目标分割

基于三维卷积神经网络的点云标记

点云的超体素(SuperVoxel)

基于超点图的大规模点云分割

更多文章可查看:点云学习历史文章大汇总

SLAM及AR相关分享

【开源方案共享】ORB-SLAM3开源啦!

【论文速读】AVP-SLAM:自动泊车系统中的语义SLAM

【点云论文速读】StructSLAM:结构化线特征SLAM

SLAM和AR综述

常用的3D深度相机

AR设备单目视觉惯导SLAM算法综述与评价

SLAM综述(4)激光与视觉融合SLAM

Kimera实时重建的语义SLAM系统

SLAM综述(3)-视觉与惯导,视觉与深度学习SLAM

易扩展的SLAM框架-OpenVSLAM

高翔:非结构化道路激光SLAM中的挑战

SLAM综述之Lidar SLAM

基于鱼眼相机的SLAM方法介绍

往期线上分享录播汇总

第一期B站录播之三维模型检索技术

第二期B站录播之深度学习在3D场景中的应用

第三期B站录播之CMake进阶学习

第四期B站录播之点云物体及六自由度姿态估计

第五期B站录播之点云深度学习语义分割拓展

第六期B站录播之Pointnetlk解读

[线上分享录播]点云配准概述及其在激光SLAM中的应用

[线上分享录播]cloudcompare插件开发

[线上分享录播]基于点云数据的 Mesh重建与处理

[线上分享录播]机器人力反馈遥操作技术及机器人视觉分享

[线上分享录播]地面点云配准与机载点云航带平差

点云PCL更多活动请查看:点云PCL活动之应届生校招群

扫描下方微信视频号二维码可查看最新研究成果及相关开源方案的演示:

如果你对本文感兴趣,请点击“原文阅读”获取知识星球二维码,务必按照“姓名+学校/公司+研究方向”备注加入免费知识星球,免费下载pdf文档,和更多热爱分享的小伙伴一起交流吧!

扫描二维码

                   关注我们

让我们一起分享一起学习吧!期待有想法,乐于分享的小伙伴加入免费星球注入爱分享的新鲜活力。分享的主题包含但不限于三维视觉,点云,高精地图,自动驾驶,以及机器人等相关的领域。

分享及合作方式:可联系微信“920177957”(需要按要求备注)联系邮箱:[email protected],欢迎企业来联系公众号展开合作。

点一下“在看”你会更好看耶

更多相关:

  • 此为文章初稿还没有完善,应该还有一些问题,等待后面有时间再继续更新,原创文章,未经允许,请勿转载!!! 首先介绍在PCL库中经常使用的两种点云之间的转换,这里将根据工程中的经验,从代码层面举例分析如何实现程序中定义的各种点云数据之间转换,并且介绍PCL在应用于ROS中应该如何转换数据结构。 (1)pcl::PCLPointClou...

  • 在PCL 的点云库中大量的使用动态内存的方式编程,比如: pcl::PCLPointCloud2::Ptr cloud (new pcl::PCLPointCloud2 ()); PointCloudT::Ptr cloud = boost::shared_ptr (new PointCloudT ())...

  • PCL(Point Cloud Library)是在吸收了前人点云相关研究基础上建立起来的大型跨平台开源C++编程库,它实现了大量点云相关的通用算法和高效数据结构,涉及到点云获取、滤波、分割、配准、检索、特征提取、识别、追踪、曲面重建、可视化等。支持多种操作系统平台,可在Windows、Linux、Android、Mac OS X、部...

  • 关于输入一个具体的物体的点云,从场景中找出与该物体点云相匹配的,这种方法可以用来抓取指定的物体等等,具体的代码的解释如下,需要用到的一些基础的知识,在之前的博客中都有提及,其中用到的一些方法可以翻阅前面的博客,当然有问题可以关注公众号,与众多爱好者一起交流   具体的代码实现 #include ...

  • 点云PCL免费知识星球,点云论文速读。标题:三维点云分割综述(上)排版:particle欢迎各位加入免费知识星球,获取PDF文档,欢迎转发朋友圈,分享快乐。这是一篇综述性论文,以下只做概述性介绍,介绍文章已共享在微信群和免费知识星球中,文章在公众号将分成三个部分:第一部分介绍点云的获取以及各种传感器获取点云的特性,以及分割概念的区别...

  • 点云PCL免费知识星球,点云论文速读。文章:DLL: Direct LIDAR Localization. A map-based localization approach for aerial robots作者:Fernando Caballero1 and Luis Merino编译:点云PCL代码:https://githu...

  • CloudCompare是一个三维点云(网格)编辑和处理软件。最初,它被设计用来对稠密的三维点云进行直接比较。它依赖于一种特定的八叉树结构,在进行点云对比这类任务时具有出色的性能【1】。此外,由于大多数点云都是由地面激光扫描仪采集的,CloudCompare的目的是在一台标准笔记本电脑上处理大规模的点云——通常超过1000万个点云。...

  • 点云PCL免费知识星球,点云论文速读。文章:Open3DGen: Open-Source Software for Reconstructing Textured 3D Models from RGB-D Images作者:Teo T. Niemirepo, Marko Viitanen, and Jarno Vanne编译:点云P...

  • 点云PCL免费知识星球,点云论文速读。标题:Real-Time Spatio-Temporal LiDAR Point Cloud Compression作者:Yu Feng , Shaoshan Liu , and Yuhao Zhu来源:2020IROS本文仅做学术分享,如有侵权,请联系删除。欢迎各位加入免费知识星球,获取PDF...

  • #include #include //io模块 #include //数据类型intmain (int argc, char** argv) {if (argc != 2) //提示如果执行可执行文件输入两个参数 -f...