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

时间:2015-03-28 20:46:07

标签: ios opencv image-processing

我无法弄清楚如何使用GrabCutGC_INIT_WITH_MASK模式。到目前为止,我可以完全使用GC_INIT_WITH_RECT。我在Xcode for 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)。任何帮助或见解表示赞赏。我怀疑我的面具不好在这里?感谢

1 个答案:

答案 0 :(得分:1)

我想我明白了。基本上,当你给它一个像我一样的所有相同值的面具时,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);