似乎无法在 OpenCV GrabCut 上使用 'GC_INIT_WITH_MASK'

Can't seem to use 'GC_INIT_WITH_MASK' on OpenCV GrabCut

我不知道如何使用 GrabCutGC_INIT_WITH_MASK 模式。到目前为止,我可以很好地使用 GC_INIT_WITH_RECT。我在 Xcode 中为 iOS 执行此操作。

这是完美运行的 GC_INIT_WITH_RECT 部分:

cv::Mat bgdmodel, fgdmodel, mask, appliedMask;
cv::Rect rect = cv::Rect(0,0, image.cols-10, image.rows-10); 
cv::grabCut(image,mask,rect,bgdmodel,fgdmodel,1,cv::GC_INIT_WITH_RECT);

cv::compare(mask,cv::GC_PR_FGD,appliedMask,cv::CMP_EQ);

cv::Mat foreground(image.size(),CV_8UC3,
                   cv::Scalar(255,255,255));
image.copyTo(foreground, appliedMask);

这是我对 GC_INIT_WITH_MASK 的单独尝试,但我似乎无法弄清楚:

cv::Rect rect = cv::Rect(0,0, image.cols-10, image.rows-10);
cv::Mat mask = cv::Mat::ones(image.size(), CV_8UC1) * cv::GC_PR_FGD;
cv::Mat appliedMask, bgdmodel, fgdmodel;
cv::grabCut(image, mask, rect ,bgdmodel,fgdmodel,1,cv::GC_INIT_WITH_MASK);

cv::compare(mask,cv::GC_PR_FGD,appliedMask,cv::CMP_EQ);

cv::Mat foreground(image.size(),CV_8UC3,
                   cv::Scalar(255,255,255));
image.copyTo(foreground, appliedMask);

如您所见,我的蒙版只是将所有像素设置为 GC_PR_FGD,因此它基本上应该采用整个图像。但是我的 grabCut 调用失败,出现错误:

OpenCV Error: Assertion failed (!bgdSamples.empty() && !fgdSamples.empty()) in initGMMs....opencv/modules/imgproc/src/grabcut.cpp, line 379
error: (-215) !bgdSamples.empty() && !fgdSamples.empty() in function initGMMs

找不到任何真正相关的解决方案(this 很接近,但我没有使用 GC_INIT_WITH_RECT)。任何帮助或见解表示赞赏。我怀疑我的面具在这里坏了?谢谢

我想我明白了。基本上,grabCut 似乎不喜欢你给它一个具有所有相同值的掩码,就像我所做的那样:

    cv::Mat mask = cv::Mat::ones(image.size(), CV_8UC1) * cv::GC_PR_FGD;

通过更改掩码矩阵中的一些值,我能够得到结果。

    cv::Rect area;
    area.x=10;  area.y=10;
    area.width=image.cols; area.height=image.rows;
    rectangle(mask, area, cv::Scalar(cv::GC_PR_BGD),-1,8,0);