我正在尝试使用OpenCV2.1(C ++)中的GrabCut算法进行图像分割
这是我的代码:
Mat rgbWorkImage = imread(argv[1]);
Mat mask;
mask = Scalar(0);
Mat bgdModel, fgdModel;
Rect rect = Rect(Point(0,0), imageSize);
grabCut(rgbWorkImage, mask, rect, bgdModel, fgdModel, 0, GC_INIT_WITH_RECT);
grabCut(rgbWorkImage, mask, rect, bgdModel, fgdModel, 2, GC_EVAL);
不幸的是我收到了这个运行时错误:
OpenCV Error: Assertion failed (!bgdSamples.empty() && !fgdSamples.empty()) in initGMMs, file /build/buildd/opencv-2.1.0/src/cv/cvgrabcut.cpp, line 368
terminate called after throwing an instance of 'cv::Exception'
what(): /build/buildd/opencv-2.1.0/src/cv/cvgrabcut.cpp:368: error: (-215) !bgdSamples.empty() && !fgdSamples.empty() in function initGMMs
我在这里缺少什么?
由于
答案 0 :(得分:8)
可能发生错误的一种情况是,当您的图像的宽度或高度为零(但两者都不是)时,由于此错误:https://code.ros.org/trac/opencv/ticket/691(在OpenCV 2.1之后似乎已修复)。 / p>
如果图像尺寸不为零,您还应检查ROI rect:
imageSize
的大小不为零)和 GC_INIT_WITH_RECT
将给定rect之外的所有像素标记为“background”,并将rect内的所有像素标记为“可能为前景”,并且断言期望前景中都有像素(或“可能是前景”)和背景(或“可能背景”)列表。
答案 1 :(得分:0)
@alexisdm是正确的
我的rect是rect =(0,0,img.shape [0],img.shape [1]),因为我不知道前景和背景在哪里。
解决方案不是通过将其更改为覆盖整个图像 rect =(1,1,img.shape [0],img.shape [1])。