Обнаружение переднего плана OpenCV с адаптивным фоном, статические объекты тоже - PullRequest
0 голосов
/ 25 апреля 2019

У меня фоновое изображение ровной поверхности. Мои цели - отслеживать объекты, которые расположены / перемещены по поверхности.

Я использую MOG2 для поиска объектов переднего плана со скоростью обучения 0, поэтому фон не обновляется (в противном случае статический объект будет включен в фон).

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

Как я могу улучшить устойчивость к освещению?


Обновление

Я экспериментирую с решением, которое работает достаточно хорошо, но требует некоторых исправлений.

Я использую MOG2 следующим образом:

  1. Получение и изучение фона с использованием первых кадров (BGK)
  2. Применить MOG2 к текущему кадру со скоростью обучения 0 (без обновления) и получить маску переднего плана (FG_MASK)
  3. Для следующих кадров я использую FG_MASK для маскировки BGK и использую результат, чтобы примениться к MOG2 с некоторой скоростью обучения (это обновляет фон).
  4. После этого я обновляю BGK, взяв его из алгоритма MOG2.

Таким образом, объекты маскируются вне фона, а фон все еще обновляется. Это может гарантировать хорошую устойчивость к легким изменениям.

Foreground detection with adaptive background

Есть некоторый недостаток, например, когда свет меняется, маска объекта («шарик маски») сохраняется с предыдущей яркостью, и, если разница слишком велика, ее можно обнаружить как новый объект.

Drawbacks

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

Моя идея состоит в том, чтобы попытаться адаптировать «маску капли», изменяя ее яркость после смены света. Как я могу получить это с OpenCV?


Исправление предыдущих недостатков

Используя функцию inpaint вместо того, чтобы просто замаскировать BGK (шаг 3), я могу синхронизировать «малярные объекты» с изменениями яркости фона. Это исправление также имеет недостаток, оно не очень хорошо работает.


Обновление 2

Я думаю, что это интересная тема, поэтому я постоянно обновляю ее. Функция inpaint очень медленная, поэтому я пытаюсь по-другому. Использование цветового пространства Hsv позволяет управлять каналом яркости, я могу уменьшить влияние яркости следующим образом:

  1. получить канал V с функцией Split
  2. рассчитать среднее значение канала V
  3. применить усечение порога к каналу V, используя среднее значение
  4. Восстановление кадра с использованием нового V-канала

1 Ответ

0 голосов
/ 26 апреля 2019

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

Одним из методов, которые я попробовал, было Accumulative Difference Image (в основном то, что вы делали с MOG2), но он не смог отследить стационарные объекты при обновлении фона. Когда я не обновлял фон, у меня была та же проблема, что и у вас.

Итак, я решил использовать пороговое значение RGB / HSV. Я установил границы для цвета дороги (скажем, серого) и создал двоичное изображение, где все цвета дороги были черными (0), а все остальное было белым (1). Здесь - хороший учебник по порогу ВПГ. При выборе границ вы можете подтвердить установку коэффициента освещения, скажем, верхняя граница для яркого освещения и нижняя для темного. Однако этот метод может привести к тому, что объект цвета, аналогичного фону, не будет виден алгоритму. Еще одним недостатком является то, что фон должен быть равномерным, без каких-либо подробностей.

Другой способ, который вы можете попробовать, - преобразовать как входное изображение, так и фон в оттенки серого, а затем вычесть вручную. Это даст вам возможность настроить пороговый уровень для отличия от фона. Предположим, что фон значения 120 в темном состоянии будет иметь 140 в ярком состоянии, поэтому разница равна 20. Для пикселя объекта можно было бы сказать, что значение 180, а значение фона равно 120, поэтому разница равна 60. Установите порог для различия 20 и установите значения ниже 20 на 0 и значения выше 20 на 1, это должно сработать (все значения находятся на шкале от 0 до 255).

Удачи!

...