Как использовать 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 ..
}