2015-08-20 3 views
0

Я использую OpenCV (завернутый в Java, но это не важно, я считаю).Должен ли BackgroundSubtractor.apply() возвращать двоичную маску?

Я пытаюсь обнаружить передний план, используя 10 изображений через BackgroundSubtractorMOG2. Вот код, если помогает:

Mat frame = new Mat(); 
    Mat result = new Mat(); 
    for (int i = 1; i <= 10; i++) { 
     frame = imRead(...+i+...); 
     subtractor.apply(frame, result, 0.05); 
    } 

    frame = imRead(...); //frame whose foreground I'm interested 
    subtractor.apply(frame, result, 0.05); 

Я ожидаю result быть, как указано [в документации] (http://docs.opencv.org/java/org/opencv/video/BackgroundSubtractor.html#apply(org.opencv.core.Mat, org.opencv.core.Mat дважды)), маска; a двоичное изображение. Однако, поскольку я обнаружил как визуально, так и через код, это не B/W и имеет много серых.

Уникальные значения в результирующей матрице

0 1 2 3 4 5 6 7 8 9 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 245 247 248 249 250 251 252 253 254 255 

Небрежно наезда на картинке: см серый

enter image description here

  • Как следует интерпретировать значения отличные от 0 или 255? Что они имеют в виду?

  • Каков наилучший способ получить real маска от этого? Я мог бы установить порог и свернуть до нуля, 255 вверх, но какой порог является наиболее разумным? 1, 128, 254 & deg;

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


@Miki

Проходя через OpenCV код, вы должны получить только 0, 255, и (если обнаружение тени включено) 127. - спасибо, я отключил обнаружения тени, и я добиться лучших результатов. Однако, чтобы отключить его, мне нужно вызвать [этот конструктор] (http://docs.opencv.org/java/org/opencv/video/BackgroundSubtractorMOG2.html#BackgroundSubtractorMOG2(int, float, boolean)): new BackgroundSubtractorMOG2(int history, float varThreshold, boolean shadowEnabled). Документация очень плохая (по крайней мере, для меня), и я не знаю, что положить в первые два поля. Не могли бы вы мне помочь или указать на значения по умолчанию? Более того, эти два параметра каким-то образом связаны с 0.05, которые я использую в своем коде? (Я не знаю, что это такое, просто случилось хорошо работать в отношении других ценностей, которые я пробовал).

Выполняете ли вы некоторые другие операции в коде, которые могут повлиять на это значение? - ну, записывая изображение в файл и читая его с помощью MATLAB. Это может быть формат сжатия jpg? Если так, то я очень удивлен, потеря огромна (посмотрите на эти уникальные ценности!).

+0

Просматривая код OpenCV, вы должны получить только 0, 255 и (если включена функция обнаружения теней) 127. Я запускаю несколько тестов, и у меня есть только эти 3 значения. Выполняете ли вы некоторые другие операции в коде, которые могут повлиять на это значение? – Miki

ответ

2

Выходная маска будет иметь значения:

0 : background 
255 : foreground 
127 : shadow (only if shadow detection is enabled, default = true) 

Можно включить и обнаружение отключить тень в конструктор:

BackgroundSubtractorMOG2(int history, float varThreshold, boolean bShadowDetection) 

где:

  • История: Длина история.
  • varThreshold: Порог на квадрат расстояния Махаланобиса, чтобы решить, хорошо ли это описано в фоновом режиме (см. Cthr ??). Этот параметр не влияет на обновление фона. Типичным значением может быть 4 сигма, то есть varThreshold = 4 * 4 = 16;
  • bShadowDetection - Параметр, определяющий, должна ли быть включена функция обнаружения теней (true или false).

значения по умолчанию (набор в конструкторе без аргументов) являются:

histoty = 500; 
varThreshold = 4.0f*4.0f; 

Значения в фоновом маске установлены в этой строке:

// bgfg_gaussmix2.cpp 

mask[x] = background ? 0 : 
       detectShadows && detectShadowGMM(data, nchannels, nmodes, gmm, mean, Tb, TB, tau) ? 
       shadowVal : 255; 

где значение shadowVal устанавливается равным defaultnShadowDetection2

static const unsigned char defaultnShadowDetection2 = (unsigned char)127; 

Значения в маске равны 0, 255 и 127 (если включена функция обнаружения теней).

Если вы сохранили свое изображение в формате jpeg, сжатие создало бы эти другие значения в качестве артефактов сжатия. Сохраните изображение в формате без потерь, например png.

+0

Спасибо. Я отредактировал свой вопрос, добавив ответы на ваш ответ - слишком большой для комментария. – natario

+0

@mvai обновил ответ. Ваша проблема вызвана сохранением изображения в _jpeg_ (сжатый формат). Сохраните изображение в формате без потерь, например _png_, и все будет в порядке. – Miki

+0

@mvai значение 0.5 является скоростью _learningRate_. Не связано с другими значениями в конструкторе, но влияет на обновление модели GMM. _speed of update - если временной интервал, который вы хотите усреднить, - Tset alpha = 1/T. Также полезно при начале сделать T медленно увеличиваться с 1 до желаемого T_ – Miki

Смежные вопросы