Ну, во-первых, проект OpenCV VideoSurveillance - это хороший способ начать решать ваши вопросы.
Это ассоциация по обнаружению данных, как вы сказали, вы делаете. Кроме того, она обрабатывает ложные положительные эффекты (2 блоба до 1 объекта, как вы сказали) с помощью упрощенного механизма (инициализация основана на пороге кадра и удалении). Другая проблема, как вы упомянули, примерно 1 blob, соответствующая двум объектам, обычно называется окклюзией (используется термин «коллизия» в проекте VideoSurveillance, но в настоящее время он устарел). VideoSurveillance использует реализацию фильтра частиц, основанную на 3D-графическом гистограмме, чтобы решить эту ситуацию.
Просто объясните: Как вы можете различить две разные цели на основе их внешнего вида (их одежды)? Вы можете сохранить их цветовую гистограмму и использовать ее позже в будущих кадрах, не так ли? Но как вы выполняете поиск? Вы можете либо искать все возможные центроиды в следующем кадре, либо использовать позволяет сказать 200 случайных точек, разбросанных вокруг области, в которой вы считаете свой объект. Эти 200 точек - частицы. Как они работают? Они сравнивают площадь, в которой они сосредоточены, и создают вероятность того, что объект существует. Чем ближе они, тем больше вероятность. В конце вы суммируете все возможности и находите «средний» центр.
Простыми словами одежда каждой цели смоделирована внутри функции вероятности, а вычисления в реальном времени достигаются благодаря идее фильтрации частиц.
Наконец, фильтр kalman является предиктором, который помогает трекеру использовать только данные движения. Он «фильтрует» поведение экстремальных движений в случае, если результат фильтра частиц становится более сумасшедшим, чем должно быть. VideoSurveillance также включает это. Это дополняет внешний вид, а трекер более изощрен, когда он использует оба.
Редактировать: Как это может быть полезно для отслеживания с несколькими объектами? Предполагая, что у нас есть простой трекер с ассоциацией данных, предположим, что два объекта собираются «столкнуться». Трекер работает нормально до тех пор, пока объекты не будут объединены. Во время «слияния» трекер видит только один объект. Другая потеряна.Через некоторое время они разбиваются, и трекер обнаруживает старый объект как новый! Как мы можем это исправить? Начнем с моделирования частиц и моделирования внешнего вида на этот раз:
Перед слиянием у нас есть 2 объекта, движущихся друг к другу. Объекты независимы, и трекер может их четко видеть. За это время разработчик внешнего вида (механизм, который «запоминает», как выглядит объект), изучает, как выглядят эти два объекта. Конечно, по мере продвижения кадров оба объекта слегка меняют внешний вид. Вот почему модельер имеет «скорость обучения», которая позволяет ему адаптировать свою «память» по прошествии времени.
Во время слияния на этот раз мы поставили трекер более терпеливым и не убивали второй объект так легко, как раньше. Трекер позволяет обеим объектам быть активными. Незакрытый объект успешно отслеживается по-прежнему, а другой ограничивающий объект объекта снова пытается переместить его. Если нам повезет *, через короткое время окклюдированный (скрытый) объект снова появится (раскол), и рамка будет притягиваться туда благодаря частицам.
* Как уже отмечалось, ограничительная коробка окклюдированной цели по-прежнему моделируется модельером. Если окклюдированный человек остается слишком долго скрытым, модельер забудет старый объект и узнает, что перед окклюзионной областью (то есть не-окклюдированным объектом), или блуждает, как сироту (это называется дрейфом). У VideoSurveillance нет механизма для этого. Одним простым решением могло бы стать прекращение адаптации моделителя во время окклюзии. Как? Когда два ограничивающих прямоугольника перекрываются.
Меня интересует, что –
@nkint, как вы это сделали, не могли бы вы объяснить или поделиться им? – Arjun
У меня больше нет кода, но его нетрудно реализовать в opencv .. есть некоторая реализация с opencv + python на github – nkint