点云技术相关产学研社区

 找回密码
 立即注册加入PCL中国点云技术相关产学研社区

扫一扫,访问微社区

查看: 18264|回复: 14

区域生长分割和基于颜色的区域生长分割

[复制链接]
发表于 2013-4-26 11:13:04 | 显示全部楼层 |阅读模式
区域生长分割类pcl::RegionGrowing,实现区域生长算法分割,是基于法线的分割;该算法主要是比较种子点与邻域点之间的法线角度,小于平滑阈值(法线间的角度值)的视为同一个平滑曲面的一部分。算法步骤:依据点云的曲率值大小对输入点云进行排序,之所以排序,是因为区域生长算法是从曲率最小的点开始的,这个点就是初始种子点,初始种子点所在的区域即为最平的区域,从最平的区域开始生长可减少分割片段的总数,提高效率。设置一空的种子点序列和空的聚类区域 ,选好初始种子点后,将其加入到种子点序列中,并搜索邻域点,对每一个邻域点,比较邻域点的法线与当前种子点的法线之间的夹角,小于平滑阈值的将当前点加入到当前区域,然后检查每一个邻域点的曲率值,小于曲率阈值的加入到种子点序列中,删除当前种子点,循环执行上述步骤,直到种子序列为空。

基于颜色的区域生长分割类pcl::RegionGrowingRGB,与前者的不同是用颜色信息来代替法线信息,且应用合并算法来防止过度分割或分割不足的问题。该算法可看为两步:分割,当前种子点与邻域点之间色差小于色差阈值的,视为一个聚类;合并:聚类之间的色差小于色差阈值的合并为一个聚类,且当前聚类中点数量小于最小聚类点数量的与最近的聚类合并一起
完整代码可参考官方教程,下面只说这两个类中的主要函数功能
//区域生长分割
pcl::RegionGrowing<pcl::PointXYZRGB, pcl::Normal> reg;创建分割对象
  reg.setMinClusterSize (500);//设置聚类中点数量下限
  reg.setMaxClusterSize (10000);//设置聚类中点数量上限
  reg.setSearchMethod (tree);//设置搜索方法,最近临搜索
  reg.setNumberOfNeighbours (30);//即为nearestKSearch中的k值,近临搜索的邻域个数
  reg.setInputCloud (cloud_filtered);//输入滤波后的点云
  //reg.setIndices (indices);
  reg.setInputNormals (normals);//输入法线
  reg.setSmoothnessThreshold (10.0 / 180.0 * M_PI);//设置平滑阈值,即为当前种子点法线与邻域点法线夹角,小于该值的视为平滑曲面
  reg.setCurvatureThreshold (0.2);//设置曲率阈值

  std::vector <pcl::PointIndices> clusters;//创建聚类向量
  reg.extract (clusters);//应用分割算法,分割后的聚类存储在聚类向量中
//基于颜色区域生长算法
pcl::RegionGrowingRGB<pcl::PointXYZRGB> reg;//创建基于颜色的区域生长分割类的对象
  reg.setInputCloud (cloud);//设置分割原始点云
  reg.setIndices (indices);//设置分割点云序列索引
  reg.setSearchMethod (tree);//设置搜索方法,最近临搜索
  reg.setDistanceThreshold (10);//设置距离阈值,小于该值的视为邻域点
  reg.setPointColorThreshold (8);//设置点之间的色差阈值,小于该值的视为一个聚类
  reg.setRegionColorThreshold (15);//设置聚类之间的色差阈值,小于该值的应用合并算法,合并为同一个聚类
  reg.setMinClusterSize (600);//设置聚类中点的数量下限,如果点数量少于该值,应用合并算法,合并到最近临的一个聚类

  std::vector <pcl::PointIndices> clusters;
  reg.extract (clusters);//应用分割算法,提取聚类
  pcl::PointCloud <pcl::PointXYZRGB>::Ptr colored_cloud = reg.getColoredCloud ();//对聚类随机赋一颜色,不同的颜色为不同的聚类
  pcl::visualization::CloudViewer viewer ("Cluster viewer");
  viewer.showCloud (colored_cloud);//可视化聚类

//编译运行结果


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册加入PCL中国点云技术相关产学研社区

x
回复

使用道具 举报

发表于 2013-5-2 09:41:18 | 显示全部楼层
请问如何获得点云的曲率?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-2 11:05:21 | 显示全部楼层
一大波蓝猫 发表于 2013-5-2 09:41
请问如何获得点云的曲率?

貌似PCL中有getCurvature这个函数可以计算曲率吧,不过这里面没有直接计算点的曲率值,只是点的类型里面包含曲率信息,应该是间接计算的
回复 支持 反对

使用道具 举报

发表于 2013-5-2 11:57:18 | 显示全部楼层
zq07075335 发表于 2013-5-2 11:05
貌似PCL中有getCurvature这个函数可以计算曲率吧,不过这里面没有直接计算点的曲率值,只是点的类型里面 ...

谢谢回复 我去研究一下
回复 支持 反对

使用道具 举报

发表于 2013-9-8 09:32:00 | 显示全部楼层
您好,您有用RANSAC进行过分割吗?在随机采样中有一个函数setSamplesMaxDist(double & radius,SearchPtr search);用来设置随机采样时样本允许的最大距离。请问SearchPtr search是什么呢?这个函数该怎么用呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-8 13:26:40 | 显示全部楼层
dongzhenwh 发表于 2013-9-8 09:32
您好,您有用RANSAC进行过分割吗?在随机采样中有一个函数setSamplesMaxDist(double & radius,SearchPtr se ...

我没用过,给你找了这个,讨论的就是这个,最后有点代码,希望能帮到你
http://www.pcl-users.org/pcl-SAC ... shes-td4025538.html
回复 支持 反对

使用道具 举报

发表于 2013-9-8 15:37:33 | 显示全部楼层
zq07075335 发表于 2013-9-8 13:26
我没用过,给你找了这个,讨论的就是这个,最后有点代码,希望能帮到你
http://www.pcl-users.org/pcl-SA ...

非常感谢您的热心帮助。
回复 支持 反对

使用道具 举报

发表于 2013-12-19 22:35:38 | 显示全部楼层
一大波蓝猫 发表于 2013-5-2 09:41
请问如何获得点云的曲率?

兄弟你好,我现在也遇到了求点云主曲率和主方向的问题,不知道你解决的怎么样呢?能不能指导下,万分感谢
回复 支持 反对

使用道具 举报

发表于 2014-5-14 10:47:56 | 显示全部楼层
各位好,我也遇到点云主曲率的问题,请问你们解决了吗?请指教,非常感谢!
回复 支持 反对

使用道具 举报

发表于 2014-6-8 20:21:03 | 显示全部楼层
本帖最后由 zhentaozi 于 2014-7-14 20:57 编辑

谢谢讲解
回复 支持 反对

使用道具 举报

本版积分规则

QQ|小黑屋|点云技术相关产学研社区 ( 陕ICP备13001629号 )

GMT+8, 2024-4-29 04:02 , Processed in 2.387142 second(s), 17 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表