GrabCut算法
常用于从静态图像中取出前景物体,计算量很大, 但结果通常很精确
int main()
{
cv::Mat dva = cv::imread("newdva.jpg");
//创建包含前景的矩形区域
cv::Rect rectangle(50, 50, 470, 850);
//创建分割图,内部使用的模型
cv::Mat result, bgModel, fgModel;
//grabCut分割算法,参数分别为:输入图像,分割结果,包含前景的矩形,两个内部模型,迭代次数,模式(使用带边框的矩形)
cv::grabCut(dva, result, rectangle, bgModel, fgModel, 2, cv::GC_INIT_WITH_RECT);
//算法生成的result是一个由cv::GC_BDG、cv::GC_FDG、cv::GC_PR_BDG、cv::GC_PR_FDG组成的与原图一样大的图像
//参数分别为:明确属于背景的像素,明确属于前景的像素,可能属于背景的像素,可能属于前景的像素
//通过提取值为cv::GC_PR_FDG的像素,可以得到包含分割信息的二值图像
cv::compare(result, cv::GC_PR_FGD, result, cv::CMP_EQ);
//创建全白前景图(输出图)
cv::Mat foreground(dva.size(), CV_8UC3, cv::Scalar(255, 255, 255));
//将二值图作为掩码,把原图拷贝到前景图中
dva.copyTo(foreground, result);
cv::imshow("previous", dva);
//显示前景图
cv::imshow("foreground", foreground);
cv::waitKey();
return 0;
}
cv::grabCut
函数的使用
函数签名
CV_EXPORTS_W void grabCut( InputArray img, InputOutputArray mask, Rect rect,
InputOutputArray bgdModel, InputOutputArray fgdModel,
int iterCount, int mode = GC_EVAL );
参数分别为:输入图像,掩码(模式为cv::GC_INIT_WITH_RECT
时可不填),分割结果,包含前景的矩形(模式为cv::GC_INIT_WITH_MASK
时可不填),两个内部模型,迭代次数,模式名字。
GrabCut算法模式名 | 含义 |
---|---|
cv::GC_INIT_WITH_RECT | 使用带边框的矩形 |
cv::GC_INIT_WITH_MASK | 使用掩码区域 |
GrabCut算法生成像素种类 | 含义 |
---|---|
cv::GC_BGD == 0 | 表示明确属于背景的像素 |
cv::GC_FGD == 1 | 表示明确属于前景的像素 |
cv::GC_PR_BGD == 2 | 表示可能属于背景的像素 |
cv::GC_PR_FGD == 3 | 表示可能属于前景的像素 |
本实例中,Rectangle矩形区域以外的像素为cv::GC_BGD
,即明确属于背景的像素,在第一次迭代前,矩形区域以内的像素为cv::GC_PR_FGD
,即可能属于前景的像素。
本实例最后只提出了可能属于前景的像素,有时若要提取全部前景像素(由于本例分割图像没有明确指定cv::GC_FGD
,故效果相同)有时若要提取全部前景像素,即cv::GC_FGD
和cv::GC_PR_FGD
,只需在cv::compare
生成二值图之前进行按位与操作,1和3都将转变为1,其余代码不变,即可输出所有前景像素。
result = result&1;
补充:cv::compare
函数的使用
函数常用于比较两幅输入图像素,并根据模式输出二值图,可用于cv::copyTo
函数的掩码。
函数签名
CV_EXPORTS_W void compare(InputArray src1, InputArray src2, OutputArray dst, int cmpop);
参数分别为:输入图像1,输入图像2,输出图(二值图),模式名。
cv::compare函数模式名 | 含义 |
---|---|
cv::CMP_EQ | 表示像素相等时输出255,否则输出0 |
cv::CMP_GT | 像素1>像素2时输出255,否则输出0 |
cv::CMP_GE | 像素1>=像素2时输出255,否则输出0 |
cv::CMP_LT | 像素1<像素2时输出255,否则输出0 |
cv::CMP_LE | 像素1<=像素2时输出255,否则输出0 |
cv::CMP_NE | 像素1!=像素2时输出255,否则输出0 |
效果