Как использовать createBackgroundSubtractorMOG2

Я использую 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);
}
});

2 ответа

Как говорит @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

У меня тоже была такая же проблема. (только отображать серый экран)

Моя проблема заключалась в том, что я создавал новый объект BackgroundSubctractorMOG2 КАЖДЫЙ кадр.

Поэтому инициализация объекта должна быть до цикла while.

ниже не рабочий код, но для вашего легкого понимания того, что я имею в виду выше.

      // ### PLACE HERE! ###
BackgroundSubtractorMOG2 bgs = Video.createBackgroundSubtractorMOG2();

while(true) {
    // ### NOT HERE! ###
    //BackgroundSubtractorMOG2 bgs = Video.createBackgroundSubtractorMOG2();
    fgmask = new Mat();
    bgs.apply(inputFrame, fgmask);
    // mat to bitmap and so on ..
}
Другие вопросы по тегам