0

我正在使用 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);
}
});
4

1 回答 1

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

于 2016-10-13T13:37:34.397 回答