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

May*_*ank 6 c++ opencv image-processing

我在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);
Run Code Online (Sandbox Code Playgroud)

不幸的是我收到此运行时错误:

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
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么?

谢谢

ale*_*sdm 8

可能发生错误的一种情况是,由于此错误,您的图像的宽度或高度(但不是两者)都为零:https://code.ros.org/trac/opencv/ticket/691(看起来似乎在OpenCV之后修复2.1).

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

  • 不是空的(imageSize没有零大小)和
  • 没有覆盖整个图像.

GC_INIT_WITH_RECT 将给定rect之外的所有像素标记为"background",将rect内的所有像素标记为"可能为前景",并且断言期望前景(或"可能是前景")和背景(或"可能是背景")中都有像素名单.