PCL中点云分割算法简析

这篇具有很好参考价值的文章主要介绍了PCL中点云分割算法简析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

点云分割算法广泛应用于激光遥感、无人驾驶、工业自动化领域,其原理是根据空间、几何和纹理等特征对点云进行划分,使同一划分内的点云拥有类似的特征。

一、点云分割算法简介

点云分割算法经过长时间的发展,目前大致可以分为基于随机采样一致的分割算法、基于聚类的分割算法和基于点云深度学习模型的算法。

1.1 基于RANSAC的点云分割

RANSAC算法是一种非常经典的点云拟合算法,同时可以根据拟合结果实现点云分割,常用于规则点云的分割,例如直线、平面、圆球等。
其基本原理前面写过,是通过把点云随机一个初始模型,把所有点分为内点和外点,并设定阈值,符合阈值的为内点,不符合的为外点,不断迭代,最终满足迭代条件从而实现点云分割的。

1.2 基于聚类的点云分割

聚类是机器学习中非常重要的概念,属于无监督学习任务。
目前聚类的方法有很多,但算法基本原理都是类似的,即不需要标签,仅依靠数据的特征把数据分为不同的类或者簇,使类内的元素的相似性尽可能的大,类间元素相似性则尽可能小。
二维图像聚类个人比较熟悉K-均值和高斯混合聚类。
点云聚类分割最简单的则是欧式聚类分割,除了该算法,还有基于区域生长、图割法、超体素分割等方法。

1.2.1 欧式聚类分割

欧式聚类分割和K-均值聚类算法的思路很相似:
1:首先设定初始点p,用Kd-tree进行半径为r的点云搜索,得到初始点集合Q。
2:在Q中选择新的种子点,进行步骤1,若Q不再新增加点,且聚类总点数在设定的点云数量范围内,则Q聚类完成,否则重新开始1。
3:在剩余点云中继续选点执行上述步骤。

1.3 基于深度学习的点云分割

目前基于深度学习的点云分割模型的工作已有很多,流行的包括PointNet、PointNet++、RandLA-Net、PointConv、PCT和PointCNN等,一篇综述介绍的比较好。
基于深度学习的三维点云分割综述
目前该领域的研究主要应用于无人驾驶领域。

二、算法示例

2.1 基于RANSAC的平面分割

pcl::PointCloud<pcl::PointXYZ> cloud;
	//填充点云数据
	cloud.width = 1000;
	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 = 1.0;
	}
	//设置局外点
	cloud.points[23].z = 20;
	cloud.points[203].z = -120.0;
	cloud.points[106].z = -60;
	cloud.points[400].z = 5;
	cloud.points[921].z = 3;
	cloud.points[8].z = 120.0;
	cloud.points[103].z = -220.0;
	cloud.points[206].z = -310;
	cloud.points[300].z = 602;
	cloud.points[821].z = 405;

	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.setDistanceThreshold(0.01);
	seg.setInputCloud(cloud.makeShared());
	seg.segment(*inliers, *coefficients);
	if (inliers->indices.size() == 0)
	{
		PCL_ERROR("Could not estimate a planar model for the given dataset.");
	}
	//输出平面模型的系数
	std::cout << "Model coefficients: " << coefficients->values[0] << " "
		<< coefficients->values[1] << " "
		<< coefficients->values[2] << " "
		<< coefficients->values[3] << std::endl;
	std::cout << "Model inliers: " << inliers->indices.size() << std::endl;

PCL中点云分割算法简析

2.2 欧式聚类

    pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>);
	tree->setInputCloud(cloud_filtered);//设置输入点云

	std::vector<pcl::PointIndices> cluster_indices;
	pcl::EuclideanClusterExtraction<pcl::PointXYZ> ecluster;//创建一个聚类对象
	ecluster.setClusterTolerance(0.02); //设置近邻搜索的搜索半径为2cm
	ecluster.setMinClusterSize(100);    //设置一个聚类需要的最少点数目为100
	ecluster.setMaxClusterSize(2000);  //设置一个聚类需要的最大点数目为2000
	ecluster.setSearchMethod(tree);     //设置点云的搜索机制
	ecluster.setInputCloud(cloud_filtered); //设置原始点云 
	ecluster.extract(cluster_indices);  //从点云中提取聚类

    int j = 0;
	for (std::vector<pcl::PointIndices>::const_iterator it = cluster_indices.begin(); it != cluster_indices.end(); ++it)
	{
		pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_cluster(new pcl::PointCloud<pcl::PointXYZ>);
		for (std::vector<int>::const_iterator pit = it->indices.begin(); pit != it->indices.end(); pit++)
			cloud_cluster->points.push_back(cloud_filtered->points[*pit]); //*

		cloud_cluster->width = cloud_cluster->points.size();
		cloud_cluster->height = 1;
		cloud_cluster->is_dense = true;

		std::cout << "当前聚类 " << j << " 包含的点云数量: " << cloud_cluster->points.size() << " data points." << std::endl;
		std::stringstream ss;
		ss << "cloud_cluster_" << j << ".pcd";
		writer.write<pcl::PointXYZ>(ss.str(), *cloud_cluster, false); //*
		j++;
		viewer->addPointCloud(cloud_cluster, cluster_color, ss.str(), v2);
	}

PCL中点云分割算法简析
PCL中点云分割算法简析
PCL中点云分割算法简析
PCL中点云分割算法简析

2.3 基于PointNet++的点云分割

待续。。文章来源地址https://www.toymoban.com/news/detail-437870.html

总结

到了这里,关于PCL中点云分割算法简析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • PCL 改进点云双边滤波算法

    我们先来回顾一下之前该算法的计算过程,在二维图像领域中,双边滤波算法是通过考虑中心像素点到邻域像素点的距离(一边)以及像素亮度差值所确定的权重(另一边)来修正当前采样中心点的位置,从而达到平滑滤波效果。同时也会有选择性的剔除部分与当前采样点“差异”

    2024年02月07日
    浏览(33)
  • 【PCL】—— 点云配准ICP(Iterative Closest Point)算法

    ​     由于三维扫描仪设备受到测量方式和被测物体形状的条件限制,一次扫描往往只能获取到局部的点云信息,进而需要进行多次扫描,然后每次扫描时得到的点云都有独立的坐标系,不可以直接进行拼接。在逆向工程、计算机视觉、文物数字化等领域中,由于点云的

    2024年02月13日
    浏览(37)
  • 基于深度学习方法的点云算法5——PointConv(点云分类分割)

    请点点赞,会持续更新!!! 基于深度学习方法的点云算法1——PointNetLK(点云配准) 基于深度学习方法的点云算法2——PointNet(点云分类分割) 基于深度学习方法的点云算法3——PointNet++(点云分类分割) 基于深度学习方法的点云算法4——PCT: Point Cloud Transformer(点云分类

    2024年02月06日
    浏览(33)
  • 大盘点!汇总点云分割算法,涉及RANSAC、欧式聚类、区域增长等

    作者:PCIPG-zzl | 来源:计算机视觉工坊 添加微信:dddvisiona,备注:3D点云,拉你入群。文末附行业细分群。 点云分割的目标是将点云数据中的点分成不同的组或类别,使每个组中的点都属于同一种物体或区域。根据空间,几何和纹理等特征对点云进行划分,使同一划分内的

    2024年02月04日
    浏览(31)
  • PCL 点云变换

    一、原理简述 两片点云的刚体变换包含旋转和平移,变换矩阵的含义如下: 1、旋转矩阵 绕 x x

    2023年04月25日
    浏览(25)
  • PCL 点云组件聚类

    该算法与欧式聚类、DBSCAN聚类很是类似,聚类过程如下所述: 1. 首先,我们需要提供一个种子点集合,对种子点集合进行初始的聚类操作,聚类的评估器(即聚类条件),可以指定为法向评估,也可以是距离评估,以此我们就可以提取出点云中各个位置的组件部分。 2. 合并

    2024年02月10日
    浏览(29)
  • VisualStudio如何配置PCL点云库?

      因笔者课题涉及点云处理,需要通过PCL进行点云数据分析处理,查阅现有网络资料,实现了VisualStudio2015(x86)配置PCL1.8.1点云库,本文记录实现配置的过程。    (1)下载PCL   下载地址: https://github.com/PointCloudLibrary/pcl/releases/tag/pcl-1.8.1   笔者的VS软件为32位的VS2015,

    2024年02月06日
    浏览(33)
  • PCL点云库(2) - IO模块

    目录 2.1 IO模块接口 2.2 PCD数据读写 (1) PCD数据解析 (2)PCD文件读写示例 2.3 PLY数据读写 (1)PLY数据解析 (2)PLY文件读写示例 2.4 OBJ数据读写 (1)OBJ数据解析 (2)OBJ文件读写示例 2.5 VTK数据读写 (1)VTK数据解析 (2)VTK文件读写示例 2.6 保存为PNG 参考文章:PCL函数库

    2023年04月22日
    浏览(31)
  • 3D点云处理:Opencv Pcl实现深度图转点云(附源码)

    订阅说明:如果要订阅,先看链接内容 看链接内容 看链接内容:订阅先看此内容 文章目录: 3D视觉个人学习目录 处理结果 文章中提供的深度图像,深度图像一般以.tiff和.png保存,可以通过Opencv中的

    2024年02月09日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包