opencv常用算法--Grabcut

Grabcut算法主要运用于计算机视觉重的前背景分割,立体视觉和抠图等。该算法利用了图像中的纹理(颜色)信息和边界(反差)信息,只要少量的用户交互操作即可得到比较好的分割结果。

grabCut函数的用法非常简单,只需要在输入图像做上 “属于背景”或“属于前最” 的标记即可。根据这个局部标记,算法将计算出整幅图像的前景/背景分割线。grabcut只需指定一个粗略的能将目标框住的边框就可以完成良好的分割。

void grabCut( InputArray img, 
              InputOutputArray mask,
              Rect rect,                        
              InputOutputArray bgdModel, 
              InputOutputArray fgdModel,
              int iterCount, 
              int mode = GC_EVAL );
img:输入图像
mask:得到掩码矩阵,其值为以下四种
             cv::GC_BGD  == 0//表示是背景

             cv::GC_FGD  == 1//表示是前景

              cv::GC_PR_BGD  == 2//表示可能是背景

              cv::GC_PR_FGD  == 3//表示可能是前景

rect:指定的包含目标对象的矩阵
bdgModel:背景模型,如果为null,函数内部会自动创建一个bgdModel;bgdModel必须是单通道浮点型(CV_32FC1)图像,且行数只能为1,列数只能为13*5
fgdModel:前景模型,如果为null,函数内部会自动创建一个fgdModel;fgdModel必须是单通道浮点型(CV_32FC1)图像,且行数只能为1,列数只能为13x5;(bgdModel , fgdModel可以在 cv::GC_INIT_WITH_MASK下使用,可以在以往迭代的基础上用它们保存的信息继续迭代)
iterCount:指定迭代次数
mode:有三个值可用
          cv::GC_INIT_WITH_RECT//用矩阵初始化grabCut

          cv::GC_INIT_WITH_MASK//用掩码初始化grabCut

          cv::GC_EVAL//执行分割

cv::compare()主要用于两个图像之间进行逐像素的比较,并输出比较的结果。具体用法如下:

bool cv::compare(cv::InputArray src1, // 输入数组1
                 cv::InputArray src2, // 输入数组2
                 cv::OutputArray dst, // 输出数组
                 int cmpop // 比较操作子,见注释 

算法实现 

int main()
{
	cv::Mat image= cv::imread("Ferrar_F8.png");
	if (!image.data)
		return 0; 
	cv::namedWindow("Image");
	cv::imshow("Image",image);
 
	// 定义边框矩形
	cv::Rect rectangle(100,120,650,350);
	// 定义前景、背景和分割结果
	cv::Mat bgModel,fgModel,result; 
 
	// GrabCut分割
	cv::grabCut(image,
                result,
                rectangle,
                bgModel,
                fgModel, 
                5,        
                cv::GC_INIT_WITH_RECT); // use rectangle
 
	// 标记可能属于前景的区域
	cv::compare(result,cv::GC_PR_FGD,result,cv::CMP_EQ);
	// or:
    //	result= result&1;
 
	// 创建前景图像
	cv::Mat foreground(image.size(), CV_8UC3, cv::Scalar(255, 255, 255));
	image.copyTo(foreground,result); // 复制前景图像
 
	// 在原图像绘制矩形区域
	cv::rectangle(image, rectangle, cv::Scalar(200,0,200),4);
	cv::namedWindow("Rectangle");
	cv::imshow("Rectangle",image);
	cv::namedWindow("Foreground");
	cv::imshow("Foreground",foreground);
 
	cv::waitKey();
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值