2014-07-08 30 views

回答

1

虽然在文档中没有明确说明,但GC_INIT_WITH_RECTGC_INIT_WITH_MASK标志是互斥的。如果您同时通过grabCut(),则会优先GC_INIT_WITH_RECT,而忽略另一个。

为了证明这一点,这里是来自OpenCV的源代码的相关片段:

if(mode == GC_INIT_WITH_RECT) 
    initMaskWithRect(mask, img.size(), rect); 
else // flag == GC_INIT_WITH_MASK 
    checkMask(img, mask); 
+0

实际上,令人困惑的是,该文档明确表示可以合并它们:“请注意GC_INIT_WITH_RECT和GC_INIT_WITH_MASK可以合并。”但是,它们不能,仅仅是因为GC_INIT_WITH_RECT = 0,所以无法判断GC_INIT_WITH_MASK是否与GC_INIT_WITH_RECT进行了或运算。将矩形外的所有内容定义为掩码中的GC_BGD是“组合”这两种方法的唯一方法。 – Lolo

2

除了@Aurelius answer


当您使用GC_INIT_WTH_RECT模式grabCut()功能做什么是它设置矩形外的所有东西都变为GC_BGD,矩形中的所有东西变成GC_PR_FGD。所以使用这种模式为你初始化掩码。

如果你想使用一个矩形标记你自己的确定前景/背景,然后使用模式GC_INIT_WITH_MASK

创建您自己的掩码,一个零数组,其大小与输入grabCut()img大小相同。将矩形内的所有内容设置为GC_PR_FGD。外面的一切应该是GC_BGD。然后如果你知道一个像素是肯定前景的,将它设置为GC_FGD,如果你知道可能是背景,可以将其设置为GC_PR_BGD

GC_值对应于:

GC_BGD  0 
GC_FGD  1 
GC_PR_BGD 2 
GC_PR_FGD 3 

这是我做的,当我想用​​一个矩形以及普通用户的输入。

+0

我编辑了一些东西。最好使用名称而不是字面值。很好的答案:D – Miki