Java 不应该';t BackgroundSubtractor.apply()返回二进制掩码?

Java 不应该';t BackgroundSubtractor.apply()返回二进制掩码?,java,c++,opencv,image-processing,Java,C++,Opencv,Image Processing,我正在使用OpenCV(用Java包装,但我认为这并不重要) 我试图通过BackgroundSubtractorMOG2使用10张图片检测前景。下面是代码,如果有帮助: Mat frame = new Mat(); Mat result = new Mat(); for (int i = 1; i <= 10; i++) { frame = imRead(...+i+...); subtractor.apply(frame, resu

我正在使用OpenCV(用Java包装,但我认为这并不重要)

我试图通过
BackgroundSubtractorMOG2
使用10张图片检测前景。下面是代码,如果有帮助:

    Mat frame = new Mat();
    Mat result = new Mat();
    for (int i = 1; i <= 10; i++) {
        frame = imRead(...+i+...);
        subtractor.apply(frame, result, 0.05);
    }

    frame = imRead(...); //frame whose foreground I'm interested 
    subtractor.apply(frame, result, 0.05);
随意放大图片:看到灰色了吗

  • 我应该如何解释不同于0或255的值?它们是什么意思

  • 从这里得到真正面具的最好方法是什么?我可以设置一个阈值,然后向下展平到0,向上展平到255,但哪个阈值最合理?1128254

我可能会补充说,当然,0和255是主要值,但我仍然不同意灰度图像-我需要黑白图像


@三木


通过OpenCV代码,您应该只得到0、255和(如果启用了阴影检测)127。-谢谢,我禁用了阴影检测,我得到了更好的结果。但是,要禁用它,我需要调用[this constructor](,float,boolean)):
newbackgroundsubtractormog2(int-history,float-varThreshold,boolean-shadowEnabled)
。文档非常糟糕(至少对我来说),我不知道在前两个字段中放什么。你能帮我吗,或者给我指一下默认值?此外,这两个参数是否以某种方式与我在代码中使用的
0.05
相关联?(我不知道它是什么,只是碰巧在我尝试过的其他价值观方面效果不错)


您是否在代码中执行了可能影响此值的其他操作?-那么,将图像写入一个文件并用MATLAB读取它。可能是jpg压缩格式吗?如果是这样,我很惊讶,损失是巨大的(看看那些独特的值!)。

输出掩码将有以下值:

0   : background 
255 : foreground 
127 : shadow (only if shadow detection is enabled, default = true)
您可以在构造函数中启用和禁用阴影检测:

BackgroundSubtractorMOG2(int history, float varThreshold, boolean bShadowDetection)
其中:

  • 历史:历史的长度
  • varThreshold:确定马哈拉诺比斯距离平方的阈值,以确定其是否被背景模型很好地描述(参见Cthr??)。此参数不影响后台更新。典型值可以是4西格玛,即varThreshold=4*4=16
  • bShadowDetection–定义是否应启用阴影检测的参数(true或false)
默认值(在构造函数中设置,不带参数)为:

背景遮罩中的值在此行中设置:

// bgfg_gaussmix2.cpp

mask[x] = background ? 0 :
                detectShadows && detectShadowGMM(data, nchannels, nmodes, gmm, mean, Tb, TB, tau) ?
                shadowVal : 255;
其中
shadowVal
的值设置为等于
defaultnShadowDetection2

static const unsigned char defaultnShadowDetection2 = (unsigned char)127;
因此,掩码中的值仅为
0
255
127
(如果启用阴影检测)


如果以jpeg格式保存图像,则压缩会将这些其他值创建为压缩瑕疵。以无损格式保存图像,如png。

通过OpenCV代码,您应该只获得0、255和(如果启用阴影检测)127。我运行了一些测试,只得到了这3个值。您是否在代码中执行了其他可能影响此值的操作?谢谢。我已编辑了我的问题,并为您的答案添加了答复-太大,无法发表评论。@mvai更新了答案。您的问题是由于以jpeg(压缩格式)保存图像造成的。以无损格式保存图像,如png,您就可以了。@mvai值0.5是学习率。与构造函数中的其他值无关,但会影响GMM模型的更新。更新速度-如果你想要平均的时间间隔是Tset alpha=1/T。在开始时,让T从1慢慢增加,直到所需的TI深入论文,这也是有用的,我相信你在第一句话中是不对的,
learningRate
与构造函数中的第一个参数相关,
history
,因为
history
是您在下面提到的T(
learningRate=1/history
)。通过调用
apply(learningRate)
,我相信可以通过
history
@mvai覆盖先前在构造函数中设置的learningRate,这是有意义的。我应该检查代码中是否有被覆盖的内容,但现在不行。
// bgfg_gaussmix2.cpp

mask[x] = background ? 0 :
                detectShadows && detectShadowGMM(data, nchannels, nmodes, gmm, mean, Tb, TB, tau) ?
                shadowVal : 255;
static const unsigned char defaultnShadowDetection2 = (unsigned char)127;