如何使用createBackgroundSubtractorMOG2

时间:2016-10-13 09:35:19

标签: android opencv opencv3.0 object-detection opencv-contour

我正在使用OpenCV4Android 3.1.0版本,我想删除Android相机拍摄的每帧中的背景。我提到了一些帖子和我理解的内容,因为背景应该从非静态中删除 背景" Android相机"我应该使用' createBackgroundSubtractorMOG2'

根据一个例子,我正在使用' createBackgroundSubtractorMOG2'如下面的代码所示。但是在运行时,无论从相机中检索到的帧的背景如何变化,我都会得到掩码" fgmask"始终包含 一张白色的图片。

请让我知道如何使用createBackgroundSubtractorMOG2

代码

//use createBackgroundSubtractorMOG2
fgmask = new Mat();
BackgroundSubtractorMOG2 bgs = Video.createBackgroundSubtractorMOG2(30, 16, false);
bgs.apply(mMatInputFrame,fgmask,0);

//to display the mask
final Bitmap bitmap = Bitmap.createBitmap(this.mMatInputFrame.cols(), this.mMatInputFrame.rows(), Bitmap.Config.ARGB_8888);
Utils.matToBitmap(this.fgmask, bitmap);
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
mIVEdges.setImageBitmap(bitmap);
}
});

1 个答案:

答案 0 :(得分:0)

正如@Miki所说,如果您的背景不是静态的,则无法使用此方法。

BackgroundSubtractorMOG2使用高斯混合模型对背景进行建模,因此它可以适应它的微小变化(照明,新的静态物体等),但它无法适应完全动态的背景。

但如果您仍想尝试,可以使用以下方法:

public class MOG2Subtractor {

    private final static double LEARNING_RATE = 0.01;

    private BackgroundSubtractorMOG2 mog;
    private Mat foreground;

    public MOG2Subtractor() {
        mog = Video.createBackgroundSubtractorMOG2();
        foreground = new Mat();
        // You can configure some parameters. For example:
        mog.setDetectShadows(false);
    }

    public Mat process(Mat inputImage) {
        mog.apply(inputImage, foreground, LEARNING_RATE);
        return foreground;
    }
}

这里有所有参数及其含义:BackgroundSubtractorMOG2