PCL学习

点云滤波方法

直通滤波器

pcl::PassThrought<pcl::PointXYZ> pass
//创建滤波器对象
pcl::PassThrough<pcl::PointXYZ> pass;
//设置输入点云
pass.setInputCloud (cloud);
//滤波字段名被设置为z周方向
pass.setFilterFieldName("z");
//可接受的范围(0.0,0.5)
pass.setFilterLimits(0.0, 0.5);
//设置保留范围内还是过滤掉范围内
pass.setFilterLimitsNegative(true);
//执行滤波,保存过滤结果在cloud_filtered
pass.filter(*cloud_filtered);

体素滤波器

pcl::VoxelGrid<pcl::PCLPointCloud2> vox
//创建滤波器对象
pcl::VoxelGrid <pcl::PointXYZ> vox;
//设置输入点云
pcl::setInputCloud (cloud);
//设置滤波时创建的体素体积为1cm的立方体
vox.setLeafSize(0.01f, 0.01f, 0.01f);
//执行滤波,保存过滤波结果在cloud_filtered
vox.filter(*cloud_diltered);

统计滤波器

pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sorl;
//创建滤波器对象
pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor;
//设置输入点云
sor.setInputCloud(cloud);
//设置在进行统计时考虑查询点临近点数
sor.setMeanK(50);
//设置判断是否为离群点的阈值
sor.setStddevMulThresh(1.0);
//执行滤波,保存过滤结果在cloud_filtered
sor.filter(*cloud_filtered);

半径滤波器

pcl::RadiusOutlierRemoval<pcl::PointXYZ> rador;
//设置半径为0.8的范围内找临近点
rador.setRadiusSearch(0.8);
//设置查询点的领域点集数小于2的删除
rador.setMinNeighborsInRadius(2);

均匀采样

pcl::UniformSampling<pcl::PointXYZ> unisam;
//设置滤波时创建的体素体积为1cm的立方体
//vox.setLeafSize(0.01f, 0.01f,0.01f);
//设置滤波时创建的半径球体
unisam.setRadiusSearch(0.01f);

条件滤波器

pcl::ConditioalRemoval<pcl::PointXYZ> condr;
//创建条件定义对象
pcl::ConditioanAnd<pcl::PointXYZ>::ptr range_cond (new pcl::ConditionAnd<pcl::PointXYZ>());
//为条件定义对象添加比较算子
range_cond->addComparison (pcl::FieldComparison<pcl::PointXYZ>::ConstPtr (new pcl::FieldComparison<pcl::PointXYZ> ("z", pcl::ComparisonOps::GT, 0.0)));
//添加在Z字段上大于(pcl::ComparisonOps::GT great Then) 0的比较算子
//创建条件定义对象 曲率
//pcl::ConditionOr<PointNormal>::Ptr range_cond (new pcl::ConditionOr<PointNormal> ());
range_cond->addComparison (pxl::FieldComparison<PointNormal>::ConstPtr) (new pcl::FieldComparison<PointNormal> ("curvature", pcl::ComparisonOps::GT, threshold));
//创建滤波器并用条件定义对象初始化
pcl::ConditionalRemoval<pcl::PointXYZ> condr;
//并用条件定义对象初始化
condr.setCondition (range_cond);
condr.setInputCloud (cloud);
//设置保持点云的结构
condr.setKeepOrganized(true);
condrem.filter(*cloud_filtered);

索引提取

pcl::ExtractIndices<pcl::PointXYZ> extr;
//创建点云提取对象,设置ExtractIndices的实际参数
pcl::ExtraceIndices::Ptr inliers (new pcl::PointIndices());
//分割点云
//为了处理点云包含的多个模型,在一个循环中执行该过程并在每次模型被提取后,保存剩余的点进行迭代
//seg.setInputCloud(cloud_filtered);  //设置源 滤波后的点云
//seg.segment(*inlier, *coefficients);  //输入分割系数得到点云 索引inliers
//添加点云索引
inliers.indices.push_back(0);
inliers.indices.push_back(2);
//提取索引 Extract the inliers
extr.setInputCloud (cloud_diltered);
extr.setIndices(inliers);
extr.setNegative(false);
extr.filter(*cloud_p);  //按索引提取 点云

投影滤波器

pcl::ProjectInliers<pcl::PointXYZ> proj;

模型滤波器

pcl::ModelOutlierRemoval<pcl::PointXYZ> modr;

空间裁剪滤波

pcl::CropHull<pcl::PointXYZ>

二、八叉树

应用算法

  • 搜索操作(邻域、半径、体素搜索)
  • 降采样(体素网格/体素质心滤波器)
  • 点云压缩
  • 空间变化检测
  • 空间点密度分析
  • 占用检查/占位地图
  • 碰撞检测
  • 点云合并

2.1 PCL Octree使用

//实例化Octree
float voxelSize = 0.01f;  //最小体素分辨率
OctreePointCloud<PointXYZ> octree(voxelSize);
//设置输入点云
octree.setInputCloud(cloud);
//定义Octree边界框
octree.defineBoundingBox();
//手动定义点云的边界框
octree.defineBoundingBox(minX, minY, minZ,maxX,maxY,maxZ);
//输入点云添加到Octree
octree.addPointsFromInputCloud();
//删除Octree数据结构
octree.deleteTree();
//检查给定点坐标的体素是否存在
double X, Y, Z;
bool occuppied;
X = 1.0; Y = 2.0; Z = 3.0;
occuppied = octree.isVoxelOccupiedAtPoint(X, Y, Z);
//获取所有占用体素的中心点(Voxel grid filter/downsampling)
std::vector<PointXYZ> pointGrid;
octree.getOccupiedVoxelCenters(pointGrid);
//查询点所在的体素内的近邻点
std::vector<int> poointIdxVec;
octree.voxelSearch(searchPoint, PointIdxVec);
//删除体素
pcl::PointXYZ point_arg(1.0, 2.0, 3.0);
octree.deleteVoxelAtPoint( point );
//迭代器
OctreePointCloud<PointXYZ>::Iterator it (octreeA);  //迭代所有octree节点
OctreePointCloud<PointXYZ>:::eafNodeIterator itL (octreeA);  //迭代所有octree叶节点

2.2 PCL Octree 类型

float resolution = 0.01f;
//等于OctreePointCloudPointVector<PointXYZ>
OctreePointCloud<PointXYZ> octreeA (resolution);
//叶节点存储vector的索引
OCtreePointCloudPointVector<PointXYZ> octreeB (resolution);
//叶节点存储单个点的索引
OctreePointCloudSinglePoint<PointXYZ> octreeC (resolution);
//叶节点不存储任何点的信息
OctreePointCloudOccupancy<PointXYZ> octreeD (resolution);

2.3 PCL Octree 领域搜索

  • 体素内近邻搜索
  • 半径内近邻搜索
  • K近邻搜索
/*体素内近邻搜索*/
std::vector<int> pointIdxVec;
octree.voxelSearch(searchPoint, pointIdxVec);

/*半径内近邻搜索*/
//深度优先数搜索
//在每个节点上查询与搜索半径球体重叠的已占用子体素
std::vector<int> pointIdxRadiusSearch;
std::vector<float> pointRadiusSquaredDistance;
float radius = 0.1;
//扫描所有候选体素
if (octree.radiusSearch (searchPoint, radius, pointIdxRadiusSearch,pointRadiusSquaredDistance) > 0)
{......}

//只扫描“搜索点体素”
if (octree.approxNearestSearch (searchPoint, radius, pointIdxRadiusSearch, pointRadiusSquaredDistance) > 0)
{......}

/*K近邻搜索*/
//节点与候选点的有限队列(二叉堆)
//只查询已占用的体素(最近体素优先)
//等于半径搜索(半径=到第K个候选点的距离)
int K = 10;
std::vector<int> pointIdxNKNSearch;
std::vector<float> pointNKNSquaredDistance;
if (octree.nearestKSearch (searchPoint, K, pointIdxNKNSearch, pointNKNSquaredDistance) > 0)
{
    for (size_t i = 0; i < pointIdxNKNSearch.size(); ++i)
    {
        ......
    }
}

2.4 PCL Octree应用

//光线跟踪/碰撞检测
PointCloud<PointXYZ>::ptr voxelCenters (new PointCloud<PointXYZ>());
Eigen::Vector3f origen (0.0f, 0.0f, 0.0f);
Eigen::vector3f direction (0.1f, 0.2f, 0.3f);
if (octree.getIntersectedVoxelCenters(origin, direction, voxelCenters->points) > )
{......}

//密度估计
OctreePointCloudDensity<PointXYZ>;

//空间变化检测
octree.setInputCloud(cloudA_ptr);  //设置输入点云
octree.addPointsFromInputFromInputCloud ();//从输入点云构建八叉树
octree.switchBuffers();//交换八叉树缓存,但是cloudA对应的八叉树结构仍在内存中
octree.setInputCloud(cloudB_ptr);//添加cloudB到八叉树
octree.addPointsFromInputCloud();
std::vector<int> newPontIdxVector();//存储新加点的索引的向量
//获取前一cloudA对应的八叉树 在cloudB 对应八叉树中A内没有的点集
octree.getPointIndicesFromNewVoxels (newPointIdxVector);
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: CSDN PCL学习教程是一个非常值得推荐的学习资源。PCL(Point Cloud Library)是一个开源的机器人视觉库,用于处理和分析点云数据。 CSDN PCL学习教程的内容丰富全面,适合初学者和有一定基础的人士。教程以通俗易懂的语言介绍了PCL库的基本知识和应用,包括点云数据的读取、滤波、特征提取、配准、分割等等。其中还包括了一些实际的案例,通过动手实践可以更好地理解和运用PCL库。 CSDN PCL学习教程的优点是它提供了详细的步骤和示例代码,使学习者能够快速入门和上手。教程中也附有一些常见问题的解答和错误排查的方法,方便遇到困难时进行参考和解决。 此外,CSDN是一个知名的IT技术社区,拥有众多活跃的技术博客和论坛。在学习教程过程中,学习者还能够参与讨论和交流,获取更多的帮助和指导。 总的来说,CSDN PCL学习教程是一个实用、可靠的学习资源,对于想要学习和应用PCL库的人来说是一个不错的选择。它提供了全面的学习内容和实例,能够满足不同层次的学习需求,并能够帮助学习者快速掌握PCL库的使用。 ### 回答2: CSDN PCL学习教程是一个针对计算机视觉领域的开源库Point Cloud Library(PCL)的学习资源。PCL是一个强大的开源点云处理框架,可以用于点云数据的处理、配准、分割、特征提取等多种任务。 该教程提供了丰富的学习内容和实践案例。首先,教程介绍了PCL的基础知识,包括点云数据的表示方式、常用的滤波方法等。接着,教程详细介绍了PCL的各种功能模块,如滤波器、配准、特征描述子等,通过实例演示了它们的使用方法和效果。 此外,教程也提供了一些高级主题的学习资料,如深度学习与点云处理的结合、三维重建等。这些内容可以帮助学习者进一步深入PCL的应用领域。 通过学习CSDN PCL学习教程,学习者能够掌握PCL的基本原理和使用方法,了解点云数据处理的常用技巧。通过实践案例的学习学习者能够将PCL应用到具体的项目中,并具备进行自主研究和开发的能力。 总之,CSDN PCL学习教程是一个全面而丰富的学习资源,对于想要进一步学习和应用点云处理的计算机视觉领域从业者和研究者来说是一个不错的选择。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值