GrabCut - bgdModel& fgdModel为空 - 断言错误

时间:2011-09-25 14:18:25

标签: c++ image-processing opencv

我正在尝试使用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

我在这里缺少什么?

由于

2 个答案:

答案 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])。