Как использовать BackgroundSubtractorMOG2 для изображений

Я довольно новичок в OpenCV, и я застрял на данный момент. Я имею дело с изображениями, а не с видео. Поскольку у меня будет тот же фон в моем проекте, я подумал, что будет проще работать, если я смогу удалить свой фон. Но сначала я должен спросить одну вещь. Могу ли я использовать BackgroundSubtractorMOG2 для изображений? Потому что это под названием видеоанализ / анализ движения.

Я прочитал документацию на opencv.org и просмотрел бесчисленные примеры / учебные пособия, но мне все еще трудно понять, как работает MOG2.

Быстрый вопрос: что такое история, что в параметрах?

Итак, я написал простой код. Я получаю маску переднего плана. Итак, каков следующий шаг? Как я могу удалить фон и оставить только с моим объектом? Разве я не должен сначала загрузить свой фон, а затем реальное изображение, чтобы MOG2 мог вычитать фон?

Я использую OpenCV 2.4.11.

Код:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/video/background_segm.hpp>

using namespace cv;
using namespace std;

//global variables
int history = 1;
float varThreshold = 16;
bool bShadowDetection = true;

Mat src; //source image
Mat fgMaskMOG2; //fg mask generated by MOG2 method
Ptr<BackgroundSubtractor> pMOG2; //MOG2 Background subtractor

int main(int argc, char* argv[])
{
//create GUI windows
namedWindow("Source");
namedWindow("FG Mask MOG 2");

src = imread("bluePaper1.png", 1);

//create Background Subtractor objects
pMOG2 = new BackgroundSubtractorMOG2(history, varThreshold, bShadowDetection); //MOG2 approach
pMOG2->setInt("nmixtures", 3);
pMOG2->setDouble("fTau", 0.5);

pMOG2->operator()(src, fgMaskMOG2);

imshow("Source", src);
imshow("FG Mask MOG 2", fgMaskMOG2);

waitKey(0);

return 0;
}

Исходное изображение:
bluePaper1.png

fgMask, который я получаю от MOG2:
fgMask.png

1

Решение

Смесь Гаусса Метод изучает фон в соответствии с историей кадров в фиксированной камере, поэтому вы не можете использовать его только для одного изображения. Параметр history показывает, сколько кадров будет влиять на построение фона.

Обнаружение тени не является процессом, который зависит от метода BGS и должен быть реализован вместе с ним.
например, в документации MOG2 мы имеем:

Тень обнаруживается, если пиксель является более темной версией фона. Тау — это порог, определяющий, насколько темнее может быть тень. Тау = 0,5 означает, что если пиксель более чем в два раза темнее, то это не тень

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

Вы можете получить передний план, выполнив следующие действия:

  1. вычитать данное изображение из известного фона и порог результат для получения маски переднего плана
  2. Примените операцию И к маске переднего плана и заданному изображению, чтобы получить объект с возможными тенями.
  3. Удалите пиксели, которые темнее (их количество должно быть отрегулировано), чем их соответствующий пиксель на фоне.
  4. Сделайте некоторую постобработку, такую ​​как морфологическая маркировка и маркировка связанных компонентов, чтобы получить лучший результат.
2

Другие решения