PCL——点云分割(最小图分割)

最小图分割

参考文章:pcl最小图割(pcl::MinCutSegmentation)算法

在这里插入图片描述
此类方法把图像分割问题与图的最小割(min cut)问题相关联。
(1)首先用一个无向图G=<V,E>表示要分割的图像,V和E分别是顶点(vertex)和边(edge)的集合。
(2)此处的Graph和普通的Graph稍有不同。普通的图分为有向图和无向图;由顶点和边构成,如果边的有方向的,这样的图被则称为有向图,否则为无向图,且边是有权值的,不同的边可以有不同的权值,分别代表不同的物理意义。
(3)而GraphCuts图是在普通图的基础上多了2个顶点,这2个顶点分别用符号”S”和”T”表示,统称为终端顶点。其它所有的顶点都必须和这2个顶点相连形成边集合中的一部分。所以Graph Cuts中有两种顶点,也有两种边。
(4)第一种顶点和边是:第一种普通顶点对应于图像中的每个像素。每两个邻域顶点(对应于图像中每两个邻域像素)的连接就是一条边。这种边也叫n-links。n-links具有潜在将相邻类似像素分类在一起且相邻差距较大的像素分割开的能力。
(5)第二种顶点和边是:除图像像素外,还有另外两个终端顶点,叫S(source:源点,取源头之意)和T(sink:汇点,取汇聚之意)。每个普通顶点和这2个终端顶点之间都有连接,组成第二种边。这种边也叫t-links。t-links具有潜在将目标像素分类在一起且背景像素分类在一起的能力。

pcl中实现的最小分割算法

通过设置目标物体的半径,三维坐标重心等参数,该算法将输入点云集合,划分为两个点集,前景点集(目标物体)和背景点云(剩余部分)。算法思想如下:
1、构造GraphCut图
对于一个给出的点云,算法会以点云中每一个点,另加一个source(源点)、一个sink(汇点),作为GraphCut图的顶点;点云中每个点与其近邻连线所形成的边叫n-links,与sink、source连线形成的边叫t-links。
2、根据连接点的类型的不同,边被分为以下三种情况,不同的情况,边被赋予不同的权值。
(1)连接输入点云各点之间的边,为上述边赋予的权值被称为平滑代价,由一下公式计算
在这里插入图片描述
dist为各点之间的距离,距离越大,该边被切断的概率越大。
(2)连接输入点云中的点与原点的边,该边赋予的权值,被称为前景惩罚,该值由用户输入,作为该算法的输入参数。
(3)连接输入点云中的点与汇点的边,该边赋予的权值,被称为背景惩罚,由以下公式计算
在这里插入图片描述
式中distanceToCenter是点到前景点云(目标点云)预期中心的水平距离,利用以下公式给出
在这里插入图片描述
式中radius为该算法的输入参数,可粗略看成前景点云(目标物体)的水平半径,小于该半径的点被作为前景点云(目标物体),大于该半径的点作为背景点云(其他物体)。
(3)分割
实现代码:

#include <iostream>
#include <vector>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/filters/passthrough.h>
#include <pcl/segmentation/min_cut_segmentation.h>
#include <pcl/console/print.h>
#include <pcl/console/parse.h>
#include <pcl/console/time.h>
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL)


using namespace pcl::console;
int main(int argc, char** a
  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值