您的位置:首页 > 编程语言

OpenCV2编程手册笔记之 5.6GrabCut提取前景

2017-09-01 14:56 369 查看
相比分水岭算法,GrabCut算法不是基于数学形态学,虽然相比分水岭算法计算的复杂度更高,但是其产生的结果更加精确。

适用范围:从静态图像中提取前景物体。

缺点:运行计算速度较慢,无法对连续的视频文件进行处理

grabCut函数拥有七个参数,分别为

cv::grabCut(image,  //输入图像

        result,              //分割结果(这应该是一个掩模版)

        rectangle2,      //自定义矩形(包含前景)

        bkgModel, fgrModel,  //函数中的模型

        5,                    //迭代次数

        cv::GC_INIT_WITH_RECT); //矩形进行初始化

这个函数中,result这个分割结果图像可以有四种数值:

cv::GC_BGD;//确定属于背景元素

cv::GC_FGD;//确定属于前景元素

cv::GC_PR_BGD;//可能属于背景元素

cv::GC_PR_FGD;//可能属于前景元素

现在,我们使用compare函数对result进行比较赋值:(compare函数的原型在这里不过多解释)

将result中符合cv::GC_PR_FGD的值赋值给result,得到只有可能前景的result

也就是说,在应用grabCut函数之后,result有四个可能的值,所以这个时候如果你在grabCut函数之后加一句imshow,会得到一幅全黑图像

这时应用compare,可以将符合GC_PR_FGD的元素提取出来,这时再应用imshow,就可以看到拥有前景图像的result,并且这个result大小和之前的result大小相同

这时,我们来到了函数中最关键一步:

result = result&1;

这句话的意思就是,将符合前景的元素掩模版,重复制给result,现在的result,就相当于只有0 1两个值的掩模版

最后,创建一个foreground白板图像,用copyTo传递

总结一下:

首先,grabCut函数应用创建一个result掩模版,但是这只是最初的掩模版,他的筛选还没有被确定,确定要用上文提到的四个常量确定

之后,将符合cv::GC_PR_FGD部分的result掩模版更新为新的result

在按位与操作中,result可以最终更新为只有0 1值的掩模版

随后的copyTo中,就可以把image图像中符合掩模版的部分赋值到foreground中

上代码:

int main()

{

    cv::Mat image = cv::imread("F:\\group.jpg");

    cv::Mat result;

    cv::Rect rectangle2(10, 100, 380, 180);

    cv::Mat foreground(image.size(), CV_8UC3, cv::Scalar(255, 255, 255));

    cv::Mat bkgModel, fgrModel;

    cv::grabCut(image,  //输入图像

        result,              //结果图像

        rectangle2,

        bkgModel, fgrModel,

        5,

        cv::GC_INIT_WITH_RECT);

    cv::compare(result, cv::GC_PR_FGD, result, cv::CMP_EQ);

    result = result & cv::GC_FGD;

    image.copyTo(foreground, result);

    cv::rectangle(image, rectangle2, cv::Scalar(255, 255, 255), 1);

    cv::namedWindow("Image 2");

    cv::imshow("Image 2", image);

    cv::namedWindow("Foreground objects");

    cv::imshow("Foreground objects", foreground);

    cv::waitKey(0);

    return 0;

}

写的不好的地方,我会在后面的时间一点点修改
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: