前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PCL—低层次视觉—点云分割(超体聚类)

PCL—低层次视觉—点云分割(超体聚类)

作者头像
点云PCL博主
发布2019-07-31 14:23:37
2.3K0
发布2019-07-31 14:23:37
举报
文章被收录于专栏:点云PCL点云PCL

1.超体聚类——一种来自图像的分割方法

  超体(supervoxel)是一种集合,集合的元素是“体”。与体素滤波器中的体类似,其本质是一个个的小方块。与之前提到的所有分割手段不同,超体聚类的目的并不是分割出某种特定物体,其对点云实施过分割(over segmentation),将场景点云化成很多小块,并研究每个小块之间的关系。这种将更小单元合并的分割思路已经出现了有些年份了,在图像分割中,像素聚类形成超像素,以超像素关系来理解图像已经广为研究。本质上这种方法是对局部的一种总结,纹理,材质,颜色类似的部分会被自动的分割成一块,有利于后续识别工作。比如对人的识别,如果能将头发,面部,四肢,躯干分开,则能更好的对各种姿态,性别的人进行识别。

  点云和图像不一样,其不存在像素邻接关系。所以,超体聚类之前,必须以八叉树对点云进行划分,获得不同点团之间的邻接关系。与图像相似点云的邻接关系也有很多,如面邻接,线邻接,点邻接。其具体解释如下图:

基于超体聚类的点云分割,使用点邻接(蓝色)作为相邻判据。

2.超体聚类的实现步骤

 举个简单的例子来体会下超体聚类,其过程和结晶类似。但不是水结晶成冰,而是盐溶液过饱和状态下的多晶核结晶。所有的晶核(seed)同时开始生长,最终填满整个空间,使物质具有晶体结构。 超体聚类实际上是一种特殊的区域生长算法,和无限制的生长不同,超体聚类首先需要规律的布置区域生长“晶核”。晶核在空间中实际上是均匀分布的,并指定晶核距离(Rseed)。再指定粒子距离(Rvoxel)。再指定最小晶粒(MOV),过小的晶粒需要融入最近的大晶粒。关系如图所示:

  有了晶粒和结晶范围之后,我们只需要控制结晶过程,就能将整个空间划分开了。结晶过程的本质就是不断吸纳类似的粒子(八分空间)。类似是一个比较模糊的概念,关于类似的定义有以下公式:

  公式中的Dc,表示颜色上的差异,Dn表示法线上的差异,Ds代表点距离上的差异。w_*表示一系列权重。用于控制结晶形状。在晶核周围寻找一圈,D最小的体素被认为是下一个“被发展的党员”。需要注意的是,结晶过程并不是长完一个晶核再长下一个,二是所有的晶核同时开始生长(虽然计算机计算时必然有先后,但从层次上来说是同时的)。其生长顺序如下图所示:

  接下来所有晶核继续公平竞争,发展第二个“党员”,以此循环,最终所有晶体应该几乎同时完成生长。整个点云也被晶格所分割开来。并且保证了一个晶包里的粒子都是类似的。

3.PCL对超体聚类的实现



//设定结晶参数

float voxel_resolution = 0.008f;

float seed_resolution = 0.1f;

float color_importance = 0.2f;

float spatial_importance = 0.4f;

float normal_importance = 1.0f;

//生成结晶器

pcl::SupervoxelClustering<PointT> super (voxel_resolution, seed_resolution);

//和点云形式有关

if (disable_transform)

super.setUseSingleCameraTransform (false);

//输入点云及结晶参数

super.setInputCloud (cloud);

super.setColorImportance (color_importance);

super.setSpatialImportance (spatial_importance);

super.setNormalImportance (normal_importance);

//输出结晶分割结果:结果是一个映射表

std::map <uint32_t, pcl::Supervoxel<PointT>::Ptr > supervoxel_clusters;

super.extract (supervoxel_clusters);

//获得晶体中心

PointCloudT::Ptr voxel_centroid_cloud = super.getVoxelCentroidCloud ();

//获得晶体

PointLCloudT::Ptr labeled_voxel_cloud = super.getLabeledVoxelCloud ();



  执行上诉过程后,会将晶体映射成一系列数。数代表的是指向各个晶体的指针。可以通过getter函数,把晶体有关的信息拖出来。拖出来的是点云。



//将相连的晶体中心连起来并显示

std::multimap<uint32_t, uint32_t> supervoxel_adjacency;

super.getSupervoxelAdjacency (supervoxel_adjacency);

std::multimap<uint32_t,uint32_t>::iterator label_itr = supervoxel_adjacency.begin ();

for ( ; label_itr != supervoxel_adjacency.end (); )

{

//First get the label

uint32_t supervoxel_label = label_itr->first;

//Now get the supervoxel corresponding to the label

pcl::Supervoxel<PointT>::Ptr supervoxel = supervoxel_clusters.at (supervoxel_label);

//Now we need to iterate through the adjacent supervoxels and make a point cloud of them

PointCloudT adjacent_supervoxel_centers;

std::multimap<uint32_t,uint32_t>::iterator adjacent_itr = supervoxel_adjacency.equal_range (supervoxel_label).first;

for ( ; adjacent_itr!=supervoxel_adjacency.equal_range (supervoxel_label).second; ++adjacent_itr)

{

pcl::Supervoxel<PointT>::Ptr neighbor_supervoxel = supervoxel_clusters.at (adjacent_itr->second);

adjacent_supervoxel_centers.push_back (neighbor_supervoxel->centroid_);

}

//Now we make a name for this polygon

std::stringstream ss;

ss << "supervoxel_" << supervoxel_label;

//This function is shown below, but is beyond the scope of this tutorial - basically it just generates a "star" polygon mesh from the points given

addSupervoxelConnectionsToViewer (supervoxel->centroid_, adjacent_supervoxel_centers, ss.str (), viewer);

//Move iterator forward to next label

label_itr = supervoxel_adjacency.upper_bound (supervoxel_label);

}



至此,生成了不同的晶体之间的邻接关系。结果如下所示(不同晶核距离0.1m,0.05m)

  此方法主要为识别做前期准备,但我认为,这种东西用在三维视觉+有限元倒是极好的。可以在不使用应变片的前提下对物体各个部分应变进行直接测量。在已知力的情况下可以建立物体刚度和应变的关系,貌似钢包回转台的手里分析可以这样解决。蛋疼的是实际工业机械哪有那么多花花绿绿的给你分割,很难形成有效的对应点匹配。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-09-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 点云PCL 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.超体聚类——一种来自图像的分割方法
  • 2.超体聚类的实现步骤
  • 3.PCL对超体聚类的实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档