pcl小知识(四)——区域生长分割原理(region growing segmentation)

21 篇文章 42 订阅
订阅专栏

转自:https://blog.csdn.net/aishuirenjia/article/details/80239562

https://blog.csdn.net/u011021773/article/details/78941196/

对官网代码做了一点修改

一:源代码与初步解释

在本博文中,我主要介绍如何在pcl::RegionGrowing类中调用区域增长算法。首先注意一点,这里是region growing segmentation,不是color-based region growing segmentation.

 

算法核心:该算法是基于点法线之间角度的比较,企图将满足平滑约束的相邻点合并在一起,以一簇点集的形式输出。每簇点集被认为是属于相同平面。

 

工作原理:首先需要明白,区域增长是从有最小曲率值(curvature value)的点开始的。因此,我们必须计算出所有曲率值,并对它们进行排序。这是因为曲率最小的点位于平坦区域,而从最平坦的区域增长可以减少区域的总数。现在我们来具体描述这个过程:

1.点云中有未标记点,按照点的曲率值对点进行排序,找到最小曲率值点,并把它添加到种子点集;

2.对于每个种子点,算法都会发现周边的所有近邻点。1)计算每个近邻点与当前种子点的法线角度差(reg.setSmoothnessThreshold),如果差值小于设置的阈值,则该近邻点被重点考虑,进行第二步测试;2)该近邻点通过了法线角度差检验,如果它的曲率小于我们设定的阈值(reg.setCurvatureThreshold),这个点就被添加到种子点集,即属于当前平面。

3.通过两次检验的点,被从原始点云去除。

4.设置最小点簇的点数min(reg.setMinClusterSize),最大点簇为max(reg.setMaxClusterSize)。

4.重复1-3步,算法会生成点数在min和max的所有平面,并对不同平面标记不同颜色加以区分。

5.直到算法在剩余点中生成的点簇不能满足min,算法停止工作。

 

算法具体的伪码表示:http://pointclouds.org/documentation/tutorials/region_growing_segmentation.php#region-growing-segmentation

 

我自己对官网代码做了一点修改:

#include <iostream>
#include <vector>
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/search/search.h>
#include <pcl/search/kdtree.h>
#include <pcl/features/normal_3d.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/filters/passthrough.h>
#include <pcl/segmentation/region_growing.h>

int
main(int argc, char** argv)
{
	DWORD t1, t2;
	t1 = GetTickCount();//以上两句和最后return 0 之上的为计时函数。
	
	//点云的类型
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
	//打开点云
	if (pcl::io::loadPCDFile <pcl::PointXYZ>("resultFloor局部.pcd", *cloud) == -1)//改成想要输入的点云名称...*cloud就是把输入的点云记录到变量指针cloud中。
	{
		std::cout << "Cloud reading failed." << std::endl;
		return (-1);
	}
	//设置搜索的方式或者说是结构
	pcl::search::Search<pcl::PointXYZ>::Ptr tree = boost::shared_ptr<pcl::search::Search<pcl::PointXYZ> >(new pcl::search::KdTree<pcl::PointXYZ>);
	//求法线
	pcl::PointCloud <pcl::Normal>::Ptr normals(new pcl::PointCloud <pcl::Normal>);
	pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> normal_estimator;
	normal_estimator.setSearchMethod(tree);
	normal_estimator.setInputCloud(cloud);
	normal_estimator.setKSearch(50);
	normal_estimator.compute(*normals);
	//直通滤波在Z轴的0到1米之间
	pcl::IndicesPtr indices(new std::vector <int>);
	pcl::PassThrough<pcl::PointXYZ> pass;
	pass.setInputCloud(cloud);
	pass.setFilterFieldName("z");
	pass.setFilterLimits(0.0, 1.0);
	pass.filter(*indices);
	//聚类对象<点,法线>
	pcl::RegionGrowing<pcl::PointXYZ, pcl::Normal> reg;
	reg.setMinClusterSize(50);  //最小的聚类的点数
	reg.setMaxClusterSize(1000000);  //最大的
	reg.setSearchMethod(tree);    //搜索方式
	reg.setNumberOfNeighbours(30);    //设置搜索的邻域点的个数
	reg.setInputCloud(cloud);         //输入点
	//reg.setIndices (indices);
	reg.setInputNormals(normals);     //输入的法线
	reg.setSmoothnessThreshold(3.0 / 180.0 * M_PI);  //设置平滑度
	reg.setCurvatureThreshold(1.0);     //设置曲率的阈值

	std::vector <pcl::PointIndices> clusters;
	reg.extract(clusters);

	std::cout << "Number of clusters is equal to " << clusters.size() << std::endl;
	std::cout << "First cluster has " << clusters[0].indices.size() << " points." << endl;
	std::cout << "These are the indices of the points of the initial" <<
		std::endl << "cloud that belong to the first cluster:" << std::endl;

	//int counter = 0;
	//while (counter < clusters[0].indices.size())
	//{
	//	std::cout << clusters[0].indices[counter] << ", ";
	//	counter++;
	//	if (counter % 10 == 0)
	//		std::cout << std::endl;
	//}
	//std::cout << std::endl;

	//可视化聚类的结果
	pcl::PointCloud <pcl::PointXYZRGB>::Ptr colored_cloud = reg.getColoredCloud();
	//pcl::visualization::CloudViewer viewer("Cluster viewer");
	//viewer.showCloud(colored_cloud);
	//while (!viewer.wasStopped())
	//{
	//}
	pcl::PCDWriter writer;//将点云写入磁盘
	writer.write("resultFloor局部_Cluster_viewer.pcd", *colored_cloud, false);//改成想要输出的点云名称

	t2 = GetTickCount();  //从这句到return 0之间的两句为计时函数
	printf("Use Time:%f\n", (t2 - t1)*1.0 / 1000);
	return (0);
}

二:详解

因为这个算法是根据法线来计算的,所以我先算出了法线,在

pcl::RegionGrowing<pcl::PointXYZ, pcl::Normal> reg;

以上的代码是求法线的部分,那么我们从这行开始往下讲,就都是区域增长的内容了。

首先还是先建立了一个区域增长的对象reg

然后设置平面包含的最少点数(这个参数非常重要,小于这个参数的平面会被忽略不计)

然后设置最大的点数,原理同上,但是一般我们希望的是无穷大,所以可以设大一点,当然如果你有特殊要求可以按自己需求来

然后设置搜索方法,之前我们声明了使用kd树的方法,所以直接用就可以了,这也是默认的方法。

然后设置参考的邻域点数,也就是看看周边的多少个点来决定这是一个平面(这个参数至关重要,决定了你的容错率,如果设置的很大,那么从全局角度看某一个点稍微有点歪也可以接受,如果设置的很小则通常检测到的平面都会很小)

然后输入要检测的点云cloud

然后输入点云的法线(计算法线的方法参考之前的博客,这里给个传送门 http://blog.csdn.net/u011021773/article/details/78247657)

然后设置判断的阈值,大概也就是两个法线在多大的夹角内还可以当做是共面的。

最后也是一个弯曲的阈值,这个决定了比当前考察的点和平均的法线角度,决定是否还有继续探索下去的必要。(也就是假设每个点都是平稳弯曲的,那么normal的夹角都很小,但是时间长了偏移的就大了,这个参数就是限制这个用的)

 

 

 

然后就可以把结果输出到一个簇里面,这个簇会自动把每个平面分成一个vector,可以打印下来看看

std::cout << "Number of clusters is equal to " << clusters.size () << std::endl;
std::cout << "First cluster has " << clusters[0].indices.size () << " points." << endl;
std::cout << "These are the indices of the points of the initial" <<
std::endl << "cloud that belong to the first cluster:" << std::endl;

也可以把检测到的每个平面涂上不同的颜色

pcl::PointCloud <pcl::PointXYZRGB>::Ptr colored_cloud = reg.getColoredCloud ();
  pcl::visualization::CloudViewer viewer ("Cluster viewer");
  viewer.showCloud(colored_cloud);
  while (!viewer.wasStopped ())
  {
  }

当然,实际效果可能没有这么好,如果有这么多平面需要分割我建议先手工把它减少一点,这个算法对单独检测一两个特定规格的平面还是很准的,但是这么多的真心不建议。
 

PCL 区域生长分割【2024最新版】
点云侠的博客
07-25 40万+
区域生长算法原理介绍、代码实现以及一个具体实验场景的应用案例进一步实现将分割结果的分类保存至本地文件夹。博客长期更新,最近一次更新时间为:2024年9月1日。
PCL:官方程序 Region growing segmentation
m0_37957160的博客
03-03 359
区域增长分割(算法不是很懂,有特别明白的可以给我讲讲疑问部分???) 在本教程中,我们将学习如何将pcl:: regiongrow cla在用实现区域增长算法。该算法的目的是在平滑约束条件下,将足够接近的点进行归并。因此,该算法的输出是一组簇,每个簇是一组点,这些点被认为是同一光滑曲面的一部分。该算法的工作是基于各点法线夹角的比较。 理论基础: 让我们看看这个算法是如何工作的。 首先,它根...
运动目标分割--区域生长
06-23 8468
一、区域生长原理和步骤        区域生长的基本思想是将具有相似性质的像素集合起来构成区域。具体先对每个需要分割区域找一个种子像素作为生长的起点,然后将种子像素周围邻域中与种子像素有相同或相似性质的像素(根据某种事先确定的生长或相似准则来判定)合并到种子像素所在的区域中。将这些新像素当作新的种子像素继续进行上面的过程,直到再没有满足条件的像素可被包括进来。这样一个区域就长成了。
PCL点云分割Region Growing Segmentation
AmbitiousRuralDog的博客
05-10 8360
背景:官方网站指导:http://www.pointclouds.org/documentation/tutorials/region_growing_segmentation.php#region-growing-segmentation
PCL 区域生长分割Segmentation_RegionGrowing
最新发布
xhm01291212的博客
09-12 308
对于分割建筑物或地面的各个平面,有较好的效果,工作中经常使用。3.关键函数(1)法向量夹角的阈值,超过这个夹角,即认为不在一个平面上(2)曲率的阈值,超过这个阈值,即认为不在一个平面上。
区域生长分割 Region growing segmentation(一)
席小贱
11-30 4084
理论入门 首先要用各点的曲率值对点进行排序,因为一个区域要从它曲率最小值的点开始生长。因为从曲率最小点可以定位到平坦的区域,而从最平坦区域增长可以减少分割区域的数量。 因此先对点云进行一下排序。在云中存在未标记(这个标记我认为是人工手动标记)的点之前,算法会选择具有最小曲率值的点并开始该区域增长。此过程如下:       选择的点被添加到称为种子的集合中。 对于每个种子点...
Region Growing - Segmentation:基于区域增长算法的分割代码-matlab开发
05-30
此代码根据所选像素(种子)的值及其所属的阈值区域区域进行分段。 基于考虑个相邻像素的区域生长算法。
PCL教程-点云分割区域生长分割算法
热门推荐
DayDayUp
09-09 1万+
Inputs: Point cloud= Point normals= Points curvatures= Neighbour finding function Curvature threshold Angle threshold Initialize: Region list Available points list Algorithm: While is not emptydo Current re...
region_growing_segmentation.zip_pcl RegionGrowing_read_region_re
07-14
在这个项目"region_growing_segmentation.zip_pcl RegionGrowing_read_region_re"中,开发者使用了PCL(Point Cloud Library)1.7.1版本来实现三维点云的区域增长分割PCL是一个开源库,专门用于处理三维点云数据,...
点云的区域增长分割算法(Region Growing Segmentation for Point Cloud)
MrVoider的博客
06-27 1582
关于点云的区域增长分割算法 简单的读取点云文件 上文有提及这个算法需要计算法向量,这里的 类就是用来计算这个的。 因为 是派生于 ,所以可以使用索引。这意味着我们可以仅分割索引数...
基于区域生长算法的点云分割pcl::RegionGrowing
A_L_A_N
06-27 4771
算法原理: 算法流程: 代码: #include <iostream> #include <vector> #include <pcl/point_types.h> #include <pcl/io/pcd_io.h> #include <pcl/search/search.h> #include <pcl/se...
区域生长算法
04-19
区域生长算法的简单实现,人工选取种子,对二值图像的前景进行分割
区域生长法图像分割
05-10
鼠标选择感兴趣区域,通过阈值筛选出感兴趣区域
区域增长(Region Growing)算法Matlab代码
12-30
实现计算机视觉(Computer Vision)中的Haralick区域增长算法(Haralick Region Growing Algorithm)用于实现图像分割
【C++】pcl中的Region Growing区域生长)算法
Zhang_Chen_的博客
09-27 6746
1.如何使用PCA估计一个点云的表面法线;2.pcl中点云的简单滤波(直通滤波、体素网格滤波);3.三维点云的区域生长聚类算法;4.二维图像的区域生长聚类算法
PCL中分割方法的介绍(3)
weixin_34221112的博客
04-20 144
(3)上两篇介绍了关于欧几里德分割,条件分割,最小分割法等等还有之前就有用RANSAC法的分割方法,这一篇是关于区域生成的分割法, 区 域生长的基本 思想是: 将具有相似性的像素集合起来构成区域。首先对每个需要分割区域找出一个种子像素作为生长的起点,然后将种子像素周围邻域中与种子有相同或相似性质的像素 (根据事先确定的生长或相似准则来确定)合并到种子像素所在的区域中。而新的像素继续作为种子向周...
PCL中的区域生长分割(region growing segmentation)
aishuirenjia的博客
05-08 1万+
在本博文中,我主要介绍如何在pcl::RegionGrowing类中调用区域增长算法。首先注意一点,这里是region growing segmentation,不是color-based region growing segmentation.算法核心:该算法是基于点法线之间角度的比较,企图将满足平滑约束的相邻点合并在一起,以一簇点集的形式输出。每簇点集被认为是属于相同平面。工作原理:首先需要明...
PCL中分割方法的介绍(2)
weixin_34235457的博客
04-20 213
(2)关于上一篇博文中提到的欧几里德分割法称之为标准的距离分离,当然接下来介绍其他的与之相关的延伸出来的聚类的方法,我称之为条件欧几里德聚类法,(是我的个人理解),这个条件的设置是可以由我们自定义的,因为除了距离检查,聚类的点还需要满足一个特殊的自定义的要求,就是以第一个点为标准作为种子点,候选其周边的点作为它的对比或者比较的对象,如果满足条件就加入到聚类的对象中,至于到底怎么翻译我也蒙了,只能这...
pcl 3d segmentation setups
05-19
Here are some common setups for 3D segmentation using PCL (Point Cloud Library): 1. Pre-processing: This involves filtering the point cloud data to remove noise and outliers, and preparing it for segmentation. PCL provides various filters such as voxel grid filter, statistical outlier removal filter, and normal estimation filter. 2. Segmentation: This is the process of dividing the pre-processed point cloud into meaningful segments or clusters. PCL provides various segmentation algorithms such as region growing segmentation, Euclidean clustering, and planar segmentation. 3. Feature extraction: This involves extracting features from the segmented point cloud, such as surface normals, curvature, and color information. PCL provides various feature extraction algorithms such as normal estimation, principal component analysis (PCA), and color-based segmentation. 4. Classification: This is the process of assigning labels to the segmented point cloud based on the extracted features. PCL provides various classification algorithms such as support vector machines (SVM), decision trees, and random forests. 5. Post-processing: This involves refining the segmentation results by merging or splitting clusters and removing small or irrelevant segments. PCL provides various post-processing algorithms such as clustering merging, segment refinement, and outlier removal. Overall, the choice of setup depends on the specific application and the characteristics of the point cloud data.
写文章

热门文章

  • ArcGIS小知识(三)——矢量面转点、点转面(arcgis),面矢量转点矢量 69985
  • ArcGIS小知识(十)——ArcMap新建并绘制矢量文件(shp和gdb数据库格式) 61504
  • Eps总结(2)——Eps常用命令与快捷键 53957
  • ArcGIS小知识(九)——坡度、剖面曲率、坡向、等高线 43510
  • ArcGIS小知识(六)——管理ArcGIS/ArcMap符号库样式(symbol selector) 38231

分类专栏

  • ArcGIS 24篇
  • 点云 1篇
  • Agisoft Photoscan 1篇
  • ContextCapture(Smart3D) 2篇
  • 随笔 1篇
  • PCL 21篇
  • PS 6篇
  • 坐标系 4篇
  • C++ 10篇
  • CAD&Cass 7篇
  • MicroStation 1篇
  • Eps 3篇
  • MATLAB 3篇
  • cyclone 4篇
  • office 5篇
  • Windows 3篇
  • mapgis 2篇
  • 机器学习 1篇

最新评论

  • ContextCapture(Smart3D)总结(2)——跑5镜头数据空三模型

    蓦顾: 请问这几个哪个是下视镜头呀

  • ArcGIS小知识(三)——矢量面转点、点转面(arcgis),面矢量转点矢量

    派大星的菜卷: 提示Completed script CreateFeaturesFromTextFile... 执行(CreateFeaturesFromTextFile)失败。 失败 在 Thu May 16 15:22:30 2024 (经历的时间: 0.03 秒),有大佬解答一下吗

  • MATLAB小知识(二)——非局部均值去噪(NL-means)

    zst19836912182: 为什么加double后pnsr变化这么大

  • Eps总结(3)——Eps使用点云生成等高线及高程点

    Xhosa_613: 请问您知道如何转换点云格式吗

  • pcl小知识(五)——Visualization教程中PCLPlotter类

    a2114810107: 同问,请问你解决这个问题了吗?直接截图分辨率很低

大家在看

  • 深入解析 AQS:同步队列与条件队列原理,独占与共享模式的实现与应用
  • 大模型快速入门学习路径【持续更新】,非常详细收藏我这一篇就够了
  • LTC4242CG LTC4222IG LTC4301IMS8#TR LTC4274CUHFLTC4252-2IMS8 LTC4307CMS8-1 制造商;凌力尔特LINEAR制造商已被ADI收购
  • Python Stacking算法详解与应用案例
  • TMtech凯钰T8332AD升降压LED驱动芯片AEC-Q100认证 1601

最新文章

  • Arcgis中的Domain与修改应用
  • CAD-Cass小结(8)——shp转换出注记到CAD/CASS/dwg
  • 2020-11-18
2023年1篇
2021年1篇
2020年16篇
2019年5篇
2018年62篇

目录

目录

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

玻璃钢生产厂家高质量玻璃钢雕塑设计平洲玻璃钢雕塑贵州特色玻璃钢雕塑江苏常用商场美陈销售厂家济源天桥玻璃钢花盆定制黑龙江玻璃钢动物雕塑江阴商场美陈布置青海抽象人物玻璃钢雕塑价格商场美陈雕塑报价单标识玻璃钢雕塑报价丹东玻璃钢雕塑制作厂家玻璃钢户外雕塑工厂眉山玻璃钢商场美陈玻璃钢雕塑五千万商场美陈报道玻璃钢雕塑哪里可以做玻璃钢现代抽象雕塑供应江都玻璃钢仿铜雕塑清远玻璃钢卡通雕塑图片玻璃钢红军雕塑厂家电话多少南京江宁商场美陈云浮玻璃钢景观雕塑款式多样保山玻璃钢雕塑报价贵州仿铜玻璃钢雕塑销售电话乌市玻璃钢雕塑西宁人物玻璃钢雕塑安装云南玻璃钢鹿雕塑一般商场美陈多少钱重庆卡通玻璃钢雕塑加工浙江欧式玻璃钢雕塑供应商香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化