OpenCV grabcut:如何结合GC_INIT_WITH_RECT和GC_INIT_WITH_MASK

OpenCV grabcut: how to combine GC_INIT_WITH_RECT and GC_INIT_WITH_MASK

本文关键字:INIT GC WITH RECT MASK 结合 grabcut 何结合 OpenCV      更新时间:2023-10-16

我在c++中找不到这样的例子,所以如果有人能告诉我那就太好了!谢谢。

除了@Aurelius的回答


当您使用GC_INIT_WTH_RECT模式时,grabCut()函数所做的是将矩形外的所有内容设置为GC_BGD,并将矩形内的所有内容设置为GC_PR_FGD。因此,使用此模式将为您初始化掩码。

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

创建自己的掩码,一个0数组,大小与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

当我想使用矩形和普通用户输入时,我就是这样做的

虽然在文档中没有明确说明,但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 );