前言
在OpenCV中的图像分割中GrabCut分割算法,该算法可以方便的分割出前景图像,操作简单,而且分割的效果很好。在前我们刚用学了OpenCV中的鼠标回调函数,也是为了这章用GrabCut做基础。
实现视频效果
API介绍
void grabCut( InputArray img, InputOutputArray mask, Rect rect, InputOutputArray bgdModel, InputOutputArray fgdModel, int iterCount, int mode = GC_EVAL );
参数说明:
img: 输入图像
result: 分段结果
mask图像的值只能为下面下面4个值(PR,probably表示可能的): GC_BGD = 0, //背景 GC_FGD = 1, //前景 GC_PR_BGD = 2, //可能背景 GC_PR_FGD = 3 //可能前景
rect: 包含前景的矩形
bgdModel: 背景
fgdModel: 前景
iterCount: 迭代次数,必须大于0
mode:用于指示grabcut用什么函数进行操作
GC_INIT_WITH_RECT //用矩形框初始化
GC_INIT_WITH_MASK //用掩码图像初始化
GC_EVAL //执行分割
代码演示
我们用的是上节课的鼠标回调事件的项目opencv--Grabcut
定义了用GrabCut所用到的基本参数及方法
初始化mask,设置为背景
然后设置接N键来进行GrabCut的图像分割
鼠标按下事件里加入两个参数的初始化
鼠标松开事件里对Mask进行重新定义
初始化Mask的方法setROIMask
执行GrabCut方法
显示图像方法修改
接下来我们看一下运行效果
源图
鼠标选中后的区域
通过GrabCut方法分割后的效果
-END-