GrabCut - bgdModel & fgdModel 为空 - 断言错误
Posted
技术标签:
【中文标题】GrabCut - bgdModel & fgdModel 为空 - 断言错误【英文标题】:GrabCut - bgdModel & fgdModel empty - Assertion error 【发布时间】:2011-09-25 14:18:24 【问题描述】:我正在尝试在 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
我在这里错过了什么?
谢谢
【问题讨论】:
【参考方案1】:由于以下错误:https://code.ros.org/trac/opencv/ticket/691(这似乎在 OpenCV 2.1 之后修复),因此可能发生该错误的一种情况是您的图像的宽度或高度(但不是两者)为零。
如果图像尺寸不为零,您还应该检查 ROI 矩形:
不为空(imageSize
的大小不为零)并且
不会覆盖整个图像。
GC_INIT_WITH_RECT
将给定矩形外的所有像素标记为“背景”,将矩形内的所有像素标记为“可能前景”,并且断言期望前景(或“可能前景”)和背景(或“可能是背景”)列表。
【讨论】:
我验证了这一点,但我使用的图像具有非零高度和宽度。 @Mayank 我用其他可能性完成了我的答案。 完美,谢谢,对我来说,我的矩形覆盖了整个图像。【参考方案2】:@alexisdm 是对的,
我的矩形是 rect = (0,0,img.shape[0],img.shape[1]) 因为我不知道前景和背景在哪里。
解决方案是不要覆盖整个图像,将其更改为 rect = (1,1,img.shape[0],img.shape[1])。
【讨论】:
以上是关于GrabCut - bgdModel & fgdModel 为空 - 断言错误的主要内容,如果未能解决你的问题,请参考以下文章
32opencv入门GrabCut & FloodFill图像分割