roboforum.ru

Технический форум по робототехнике.


Слежение за людьми на фоне

Слежение за людьми на фоне

Сообщение hr0nix » 09 июл 2008, 19:46

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

Есть камера, которая зафиксирована и смотрит вертикально вниз. Есть люди, которые там ходят или стоят. Задача - отслеживать людей в видеопотоке. Как следить за движущимися людьми - вполне понятно (считать разность интенсивности цвета каждого пикселя по нескольким кадрам, делать threshold и т.п. Проблемы начинаются тогда, когда объект останавливается. У меня было две идеи: следить за каждой областью, где есть движение, при помощи чего-то вроде camshift, либо стягивать вокруг этой области активный контур (snake), который будет отслеживать эту область даже тогда, когда она остановится. С обоими идеями возникли проблемы (гистограммы кадра с человеком и без очень похожи, а параметры активного контура не получилось нормально подобрать). Возможно есть решение проще и лучше. Может чего подскажете? Прилагаю примеры кадров с человеком и без оного:
человеком.jpg
С человеком
человеком.jpg (12.27 КиБ) Просмотров: 2772

человека.jpg
Без человека
человека.jpg (12.05 КиБ) Просмотров: 2783
hr0nix
 
Сообщения: 3
Зарегистрирован: 09 июл 2008, 19:26

Re: Слежение за людьми на фоне

Сообщение Digit » 10 июл 2008, 08:21

сразу скажу, я - дилетант в этом вопросе. но может мнение дилетанта поможет? :) в общем, а если следить - как только человек "типа исчез" из кадра, берем предыдущий кадр (где чел "еще был") и вычитаем из него новый, на котором чела уже вроде как нет... т.к. камера не двигается, фон уберется, останутся шумы и человек, если он ушел, или чисто шумы, если он остановился. А что с этим дальше делать - Х.З. :D Тут уж шарящим товарищам карты в руки.
злой полицейский
Аватара пользователя
Digit
 
Сообщения: 3339
Зарегистрирован: 27 ноя 2004, 00:42
Откуда: совсем Москва
ФИО: Григорий

Re: Слежение за людьми на фоне

Сообщение =DeaD= » 10 июл 2008, 08:24

Естественно надо разницу с предыдущим кадром ловить. А лучше со средненакопленным за какое-то время.
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

Re: Слежение за людьми на фоне

Сообщение MiBBiM » 10 июл 2008, 19:27

Быть может тогда вычитать фон? Он ведь статичен, а все что осталось - по определению человек или их скопление.
P.S. Или я неправ?
Tomorrow will be. Better
Аватара пользователя
MiBBiM
 
Сообщения: 1866
Зарегистрирован: 29 окт 2007, 18:11
Откуда: Пермь
прог. языки: Brainfuck/Basic/Delphi/C++/Lisp/x86asm/JavaScript

Re: Слежение за людьми на фоне

Сообщение hr0nix » 10 июл 2008, 23:15

Да, это и мне пришло в голову. Проблема была только в том, где взять фон и какой? Статичную картинку без людей? Так в течение дня меняется освещение, и, соответственно, яркость фона. Периодически обновлять его? А если внизу все время ходят люди?

Тут пришла в голову следующая идея. Даже если внизу ходят люди, для каждого пикселя изображения эмпирически верно, что почти всегда он имеет цвет фона, лишь иногда - цвет человека. Соответственно, я решил сделать следующим образом. Несколько раз в секунду делать пробу цвета в каждом пикселе, и помнить, скажем, последние сто проб. Соответственно, в некотором аккумуляторе для каждого пикселя вычисляется среднее арифметическое этих самых последних ста проб (среднее арифметическое хорошо тем, что пересчитать его для каждого пикселя можно за O(1)). Соответственно, текущий кадр вычитается из аккумулятора, и то, что больше порога - некий объект. Алгоритм хорош тем, что даже если фон резко изменится, он достаточно быстро стабилизируется и привыкнет к новому фону.

Все это делаоя сегодня реализовал и проверил, работает быстро и результаты дает хорошие. Единственная проблема - получившиеся путем вычетания области объектов частенько рвутся (если цвет человека где-то близок к цвету фона), что неприятно. Что с этим лучше всего делать? Пробовал морфологическое замыкание и расширение, но выглядит результат не очень приемлимо.
hr0nix
 
Сообщения: 3
Зарегистрирован: 09 июл 2008, 19:26

Re: Слежение за людьми на фоне

Сообщение =DeaD= » 11 июл 2008, 08:02

hr0nix писал(а):Да, это и мне пришло в голову. Проблема была только в том, где взять фон и какой? Статичную картинку без людей? Так в течение дня меняется освещение, и, соответственно, яркость фона. Периодически обновлять его? А если внизу все время ходят люди?

Тут пришла в голову следующая идея. Даже если внизу ходят люди, для каждого пикселя изображения эмпирически верно, что почти всегда он имеет цвет фона, лишь иногда - цвет человека. Соответственно, я решил сделать следующим образом. Несколько раз в секунду делать пробу цвета в каждом пикселе, и помнить, скажем, последние сто проб. Соответственно, в некотором аккумуляторе для каждого пикселя вычисляется среднее арифметическое этих самых последних ста проб (среднее арифметическое хорошо тем, что пересчитать его для каждого пикселя можно за O(1)). Соответственно, текущий кадр вычитается из аккумулятора, и то, что больше порога - некий объект. Алгоритм хорош тем, что даже если фон резко изменится, он достаточно быстро стабилизируется и привыкнет к новому фону.

Т.е. моё сообщение вы не читали :) ну да ладно :)

hr0nix писал(а):Все это делаоя сегодня реализовал и проверил, работает быстро и результаты дает хорошие. Единственная проблема - получившиеся путем вычетания области объектов частенько рвутся (если цвет человека где-то близок к цвету фона), что неприятно. Что с этим лучше всего делать? Пробовал морфологическое замыкание и расширение, но выглядит результат не очень приемлимо.

А зачем вам четкий контур? Какую задачу вы решаете? Ведь для систем безопасности достаточно выделить область, где было движение. Зачем четкий контур?
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

Re: Слежение за людьми на фоне

Сообщение MiBBiM » 11 июл 2008, 10:34

=DeaD=, у меня есть предположение, что hr0nix считает количество посетителей. В этом случае нужно отследить в какую область человек уходит (т.е. если его фигура скрылась за верхним краем изображения, то он вошел, если за нижним - вышел). Проблема заключается в том, что когда человек выходит, видимой от него остается все меньшая и меньшая часть и начиная с какого-то момента она будет неотличима от шума. Чтобы отследить человека, ушедшего за кромку и нужен контур. Кроме того, он позволяет отличить двух людей в случае их столкновения (фактически в момент сталкивания мы видим лишь одного человека на изображении вместо двух).
А вот как это сделать - вопрос.
Tomorrow will be. Better
Аватара пользователя
MiBBiM
 
Сообщения: 1866
Зарегистрирован: 29 окт 2007, 18:11
Откуда: Пермь
прог. языки: Brainfuck/Basic/Delphi/C++/Lisp/x86asm/JavaScript

Re: Слежение за людьми на фоне

Сообщение hr0nix » 11 июл 2008, 20:01

MiBBiM, да, примерно так.

=DeaD=, ваше сообщение я прочитал уже после того, как придумал свое решение. Но в любом случае спасибо, если бы мне случайно не пришла в голову эта идея, вы бы мне очень помогли.
hr0nix
 
Сообщения: 3
Зарегистрирован: 09 июл 2008, 19:26

Re: Слежение за людьми на фоне

Сообщение =DeaD= » 11 июл 2008, 23:15

hr0nix писал(а):MiBBiM, да, примерно так.

Т.е. надо людей считать? Если перекрытий между людьми не будет, тогда всё просто, если же будут - тогда надо как-то упрощать задачу, например, описывать вокруг каждой подозрительной области 1 или несколько кругов нужного радиуса, считая что габариты людей не отличаются на порядок :)

hr0nix писал(а):=DeaD=, ваше сообщение я прочитал уже после того, как придумал свое решение. Но в любом случае спасибо, если бы мне случайно не пришла в голову эта идея, вы бы мне очень помогли.

Да как бы это и не моя идея - это во всех системах обнаруживающих движение вроде пользуют.
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов


Вернуться в Алгоритмы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3