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

#android #opencv #opencv3.0 #object-detection #opencv-contour

#Android #opencv #обнаружение объектов #контур

Вопрос:

Я использую 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. Вы перемещаете камеру?

2. да .. и не могли бы вы сказать мне, почему задали этот вопрос?? имеет ли это значение??

3. ДА. Если фон меняется (потому что вы перемещаете камеру), вычитание фона не будет работать! Для корректной работы необходим статический фон

4. Попробуйте оставить свой телефон на столе, вы увидите, что это работает. Как только вы его переместите, весь передний план будет белым; D

5. Вычитание фона не будет работать для нестатического фона. Поэтому вам лучше забыть об этом подходе и начать с обнаружения всего, что вы пытаетесь найти в своих изображениях.

Ответ №1:

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

Комментарии:

1. я попробовал ваш пример, и я все еще получаю только белый forground

2. Здесь у меня есть пример приложения, которое реализует четыре алгоритма вычитания фона (включая MOG2): BackgroundSub . Проверьте это.

Ответ №2:

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

Моя проблема заключалась в том, что я создавал новый объект 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 ..
}