我想知道以下代码中实际上有什么好处。
cv::Rect rectangle(x,y,width,height);
cv::Mat result;
cv::Mat bgModel,fgModel;
cv::grabCut(image,
result,
rectangle,
bgModel,fgModel,
1,
cv::GC_INIT_WITH_RECT);
cv::compare(result,cv::GC_PR_FGD,result,cv::CMP_EQ);
// Generate output image
cv::Mat foreground(image.size(),CV_8UC3,cv::Scalar(255,255,255));
image.copyTo(foreground,result);
根据我的知识,当我们定义矩形外面的矩形将被视为已知背景而内部将被视为未知前景。
然后bgmodel
和fgmodel
是高斯混合模型,它们分别保留前景和背景像素。
我们传递的参数为1意味着,我们要求将像素划分为单独的像素进程只运行一次。
我无法理解的是
cv::compare(result,cv::GC_PR_FGD,result,cv::CMP_EQ);
上述方法实际发生了什么。
如果有人能解释,那将是一个很大的帮助。 感谢名单。
答案 0 :(得分:2)
我发现this book表示此代码会比较result
到GC_PR_FGD
值的像素值。那些相等的它不会触及它所删除的所有其他像素。这是一个引用:
输入/输出分割图像可以具有以下四个值之一:
- cv :: GC_BGD,用于当前属于背景的像素(例如,我们示例中矩形外的像素)
- cv :: GC_FGD,对于肯定属于前景的像素(在我们的示例中没有)
- cv :: GC_PR_BGD,对于可能属于背景的像素
- cv :: GC_PR_FGD可能属于前景的像素(也就是我们矩形内部像素的初始值) 例子)。
我们通过提取像素获得分割的二进制图像 值等于cv :: GC_PR_FGD:
// Get the pixels marked as likely foreground cv::compare(result,cv::GC_PR_FGD,result,cv::CMP_EQ); // Generate output image cv::Mat foreground(image.size(),CV_8UC3, cv::Scalar(255,255,255)); image.copyTo(foreground, // bg pixels are not copied result);