Java 不应该';t BackgroundSubtractor.apply()返回二进制掩码?
我正在使用OpenCV(用Java包装,但我认为这并不重要) 我试图通过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
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
@三木
通过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;