我无法弄清楚如何使用GrabCut
和GC_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
)。任何帮助或见解表示赞赏。我怀疑我的面具不好在这里?感谢
答案 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);