GrabCut - bgdModel & fgdModel 空 - 断言错误

GrabCut - bgdModel & fgdModel empty - Assertion error

本文关键字:断言 错误 bgdModel GrabCut fgdModel      更新时间:2023-10-16

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

我在这里错过了什么?

谢谢

这种错误可能发生的一种情况是,当你的图像有零的宽度或高度(但不是两者),因为这个bug: https://code.ros.org/trac/opencv/ticket/691(这似乎是OpenCV 2.1后修复)。

如果图像尺寸非零,您还应该检查ROI rect:

  • 不是空的(imageSize的大小不是零),
  • 不覆盖整个图像。

GC_INIT_WITH_RECT将给定矩形外的所有像素标记为"背景",将矩形内的所有像素标记为"可能的前景",并且断言期望在前景(或"可能的前景")和背景(或"可能的背景")列表中都有像素。

@alexisdm is right,

我的rect是rect = (0,0,img.shape[0],img.shape[1]),因为我不知道前景和背景在哪里。

解决方案不是通过将其更改为来覆盖整个图像Rect = (1,1,img.shape[0],img.shape[1]).