点云技术相关产学研社区

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

扫一扫,访问微社区

查看: 7479|回复: 8

基于最小割的分割

[复制链接]
发表于 2013-4-28 10:39:03 | 显示全部楼层 |阅读模式
PCL库中类 pcl::MinCutSegmentation实现基于最小割的分割算法。该算法将一副点云图像分割为两部分:前景点云(目标物体)和背景点云(剩余部分)。算法主要思想为:对于给定的输入点云,以输入点云的所有点为顶点,以及一个源点和一个汇点,构造一个最近临图形,图形的每个顶点与源点和汇点以边线相连,除了源点和汇点,每一个顶点与其最近临点相连。算法首先对每一条边分配一个权值,有三种权值:对点云各个点之间的边上权值由这个公式决定,dist是各点之间的距离,两个点的距离越大,该两点之间的边被切断的可能性越大,该权值被称为平滑成本。下一步是对源点和汇点相连的边赋权值,与源点相连的边权值称为前景惩罚因子,与汇点相连的称为背景惩罚因子,两种因子都被称为数据成本。前景惩罚因子由用户指定,是一个常数,背景惩罚因子由公式决定,其中是点到物体期望中心的水平面距离,Radius可看成是物体的半径,小于该半径的点被看成是前景点,是一个水平面上的半径值。

最小割算法必须先由人为指定至少一个前景点,该前景点必须在待分割的目标物体上才行;该算法适用于多个物体水平排列的点云图像,它只能在水平方向将目标物体分割出来,默认分割后的图形中,白色为前景点,红色为背景点。
以下是关键函数说明,完整代码在官网教程
pcl::MinCutSegmentation<pcl::PointXYZ> seg;//创建一个最小割类的对象
  seg.setInputCloud (cloud);
  seg.setIndices (indices);
pcl::PointCloud<pcl::PointXYZ>::Ptr foreground_points(new pcl::PointCloud<pcl::PointXYZ> ());//指定一个前景点
  pcl::PointXYZ point;
  point.x = 0.37666193;
  point.y = 0.31766668;
  point.z = 0.95300007;
  foreground_points->points.push_back(point);
  seg.setForegroundPoints (foreground_points);//指定一个前景点,该点要在目标物体上

  seg.setSigma (0.1);//平滑成本公式中的sigma,该值越小,两点间的边被切断的可能性越大
  seg.setRadius (0.06);//上述中的Radius,该值越大,水平方向被视为前景点的范围越大
  seg.setNumberOfNeighbours (5);//邻域点个数
  seg.setSourceWeight (1.0);//前景惩罚因子,该值越大,视为前景点范围越大

  std::vector <pcl::PointIndices> clusters;
  seg.extract (clusters);运行分割算法,提取前景点

//运行结果,只能这样了,上述内容若有错误,望批评指正



本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2013-7-22 10:04:27 | 显示全部楼层
蛮不错的分享,下次分享了,发个链接到咱群里啊。不知道您是否加入PCL中国感兴趣(http://www.pclcn.org/news/shownews.php?lang=cn&id=118)。。你对分割这块应该很专注吧,我浏览了,好几篇你的分割相关的分享了。感谢分享!!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-22 14:38:10 | 显示全部楼层
mypcl 发表于 2013-7-22 10:04
蛮不错的分享,下次分享了,发个链接到咱群里啊。不知道您是否加入PCL中国感兴趣(http://www.pclcn.org/ne ...

嗯嗯...还没加...那我申请下
回复 支持 反对

使用道具 举报

发表于 2013-7-23 10:12:25 | 显示全部楼层
zq07075335 发表于 2013-7-22 14:38
嗯嗯...还没加...那我申请下

嗯,非常欢迎,一起沉淀,以后做点事情。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-23 10:19:50 | 显示全部楼层
mypcl 发表于 2013-7-23 10:12
嗯,非常欢迎,一起沉淀,以后做点事情。

:handshake
回复 支持 反对

使用道具 举报

发表于 2014-6-25 17:16:28 | 显示全部楼层
楼主,我是这方面的初学者,您说“最小割算法必须先由人为指定至少一个前景点,该前景点必须在待分割的目标物体上才行;” 如果我有一些点云数据,我怎么能知道我指定的前景点是不是在目标物体上呢?还有不同的点云数据,那几个参数要怎么设置呢?得自己一遍遍的试试?
回复 支持 反对

使用道具 举报

发表于 2014-6-26 09:45:57 | 显示全部楼层
Silkage 发表于 2014-6-25 17:16
楼主,我是这方面的初学者,您说“最小割算法必须先由人为指定至少一个前景点,该前景点必须在待分割的目标 ...

我是把自己的点云数据显示出来,然后通过可视化里面的选点类来返回目标物体上的点,然后传递给最小割参数,这样就不用去试了
回复 支持 反对

使用道具 举报

发表于 2014-6-26 15:07:31 | 显示全部楼层
布里 发表于 2014-6-26 09:45
我是把自己的点云数据显示出来,然后通过可视化里面的选点类来返回目标物体上的点,然后传递给最小割参数 ...

嗯嗯,能不能具体点儿呢,有没有代码方便发一份儿给我吗?谢谢!
回复 支持 反对

使用道具 举报

发表于 2014-10-28 14:41:52 | 显示全部楼层
布里 发表于 2014-6-26 09:45
我是把自己的点云数据显示出来,然后通过可视化里面的选点类来返回目标物体上的点,然后传递给最小割参数 ...

请问:您说的可视化是pcd_viewer吗?那个选点类的具体名称是什么?
回复 支持 反对

使用道具 举报

本版积分规则

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

GMT+8, 2024-4-29 07:45 , Processed in 1.808943 second(s), 17 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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