Я использую 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
Небрежно наезда на картинке: см серый
Как следует интерпретировать значения отличные от 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? Если так, то я очень удивлен, потеря огромна (посмотрите на эти уникальные ценности!).
Просматривая код OpenCV, вы должны получить только 0, 255 и (если включена функция обнаружения теней) 127. Я запускаю несколько тестов, и у меня есть только эти 3 значения. Выполняете ли вы некоторые другие операции в коде, которые могут повлиять на это значение? – Miki