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//执行分割
mode == cv::GC_INIT_WITH_RECT代码:
#pragma once
#include "highgui.h"
#include
int main()
{
cv::Mat image = cv::imread("D:/Development/OpenCV/images/group.jpg") ;
cv::Rect rectangle(10 , 100 , 380 , 180) ;//大致圈定图像上的前景对象
cv::Mat result ;
cv::Mat bgModel , fgModel ;
//grabCut()最后一个参数为cv::GC_INIT_WITH_RECT时
cv::grabCut(image , result , rectangle , bgModel , fgModel , 5 ,
cv::GC_INIT_WITH_RECT) ;
cv::compare(result , cv::GC_PR_FGD , result , cv::CMP_EQ) ;
//result = result & 1 ;
cv::Mat foreground(image.size() , CV_8UC3 ,
cv::Scalar(128 , 128 , 128)) ;
image.copyTo(foreground , result) ;
cv::imshow("Foreground" , foreground) ;
cv::waitKey(0) ;
return 0 ;
}
#pragma once
#include "highgui.h"
#include
int main()
{
cv::Mat image = cv::imread("D:/Development/OpenCV/images/group.jpg") ;
cv::Rect rectangle(10 , 100 , 380 , 180) ;
cv::Mat result ;
cv::Mat bgModel , fgModel ;
//grabCut()最后一个参数为cv::GC_INIT_WITH_MASK时
result= cv::Mat(image.rows, image.cols,CV_8UC1, cv::Scalar(cv::GC_BGD));
cv::Mat roi(result, rectangle);
roi = cv::Scalar(cv::GC_PR_FGD);
//这两步可以合并(此处体现了使用bgModel , fgModel的价值)
cv::grabCut(image , result , rectangle , bgModel , fgModel , 1 ,
cv::GC_INIT_WITH_MASK) ;
cv::grabCut(image , result , rectangle , bgModel , fgModel , 4 ,
cv::GC_INIT_WITH_MASK) ;
cv::compare(result , cv::GC_PR_FGD , result , cv::CMP_EQ) ;
//result = result & 1 ;
cv::Mat foreground(image.size() , CV_8UC3 ,
cv::Scalar(128 , 128 , 128)) ;
image.copyTo(foreground , result) ;
cv::imshow("Foreground" , foreground) ;
cv::waitKey(0) ;
return 0 ;
}