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;
}
写的不好的地方,我会在后面的时间一点点修改
适用范围:从静态图像中提取前景物体。
缺点:运行计算速度较慢,无法对连续的视频文件进行处理
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;
}
写的不好的地方,我会在后面的时间一点点修改
相关文章推荐
- OpenCV2编程手册笔记之 2.8定义感兴趣区域(ROI)
- OpenCV2编程手册笔记之 10.2读取视频序列
- OpenCV2编程手册笔记之 4.2计算图像的直方图(彩色)
- opencv教程(基于python)----grabcut前景提取
- OpenCV2编程手册笔记之 5.5分水岭算法对图像进行分割
- OpenCV2编程手册笔记之 4.5反投影直方图以检测特定图像内容
- OpenCV_(Using GrabCut extract the foreground object) 使用 GrabCut 算法提取前景物体
- 《Opencv 2计算机视觉编程手册 》学习笔记 1
- OpenCV2编程手册笔记之 6.2使用低通滤波器
- OpenCV2编程手册笔记之 7.2使用Canny算子检测轮廓
- python opencv入门 使用 GrabCut 交互式提取前景(30)
- OpenCV学习笔记(二十九)——视频前景的提取Video
- OpenCV2编程手册笔记之 4.4直方图均衡化
- python OpenCV学习笔记(三十):利用迭代图割算法进行交互式前景提取
- OpenCV2编程手册笔记之 7.3使用霍夫变换检测直线
- OpenCV2编程手册笔记之 2.2存取像素值
- OpenCV2编程手册笔记之 4.2计算图像的直方图
- OpenCV2编程手册笔记之 5.2形态学滤波对图像进行腐蚀、膨胀运算
- OpenCV2编程手册笔记之 8.3检测FAST特征
- OpenCV2编程手册笔记之 7.4用直线拟合一组点