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

xiaoxiao2021-02-28  78

相比分水岭算法,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; }

写的不好的地方,我会在后面的时间一点点修改

转载请注明原文地址: https://www.6miu.com/read-81469.html

最新回复(0)