Технический форум по робототехнике.
hr0nix » 09 июл 2008, 19:46
Добрый день. Возникла такая задача, подумал, может быть вы покажете пути решения. Я уже совсем замучался, но, кажется, не вижу чего-то совсем простого.
Есть камера, которая зафиксирована и смотрит вертикально вниз. Есть люди, которые там ходят или стоят. Задача - отслеживать людей в видеопотоке. Как следить за движущимися людьми - вполне понятно (считать разность интенсивности цвета каждого пикселя по нескольким кадрам, делать threshold и т.п. Проблемы начинаются тогда, когда объект останавливается. У меня было две идеи: следить за каждой областью, где есть движение, при помощи чего-то вроде camshift, либо стягивать вокруг этой области активный контур (snake), который будет отслеживать эту область даже тогда, когда она остановится. С обоими идеями возникли проблемы (гистограммы кадра с человеком и без очень похожи, а параметры активного контура не получилось нормально подобрать). Возможно есть решение проще и лучше. Может чего подскажете? Прилагаю примеры кадров с человеком и без оного:
- С человеком
- человеком.jpg (12.27 КиБ) Просмотров: 2767
- Без человека
- человека.jpg (12.05 КиБ) Просмотров: 2778
Digit » 10 июл 2008, 08:21
сразу скажу, я - дилетант в этом вопросе. но может мнение дилетанта поможет?
в общем, а если следить - как только человек "типа исчез" из кадра, берем предыдущий кадр (где чел "еще был") и вычитаем из него новый, на котором чела уже вроде как нет... т.к. камера не двигается, фон уберется, останутся шумы и человек, если он ушел, или чисто шумы, если он остановился. А что с этим дальше делать - Х.З.
Тут уж шарящим товарищам карты в руки.
=DeaD= » 10 июл 2008, 08:24
Естественно надо разницу с предыдущим кадром ловить. А лучше со средненакопленным за какое-то время.
MiBBiM » 10 июл 2008, 19:27
Быть может тогда вычитать фон? Он ведь статичен, а все что осталось - по определению человек или их скопление.
P.S. Или я неправ?
hr0nix » 10 июл 2008, 23:15
Да, это и мне пришло в голову. Проблема была только в том, где взять фон и какой? Статичную картинку без людей? Так в течение дня меняется освещение, и, соответственно, яркость фона. Периодически обновлять его? А если внизу все время ходят люди?
Тут пришла в голову следующая идея. Даже если внизу ходят люди, для каждого пикселя изображения эмпирически верно, что почти всегда он имеет цвет фона, лишь иногда - цвет человека. Соответственно, я решил сделать следующим образом. Несколько раз в секунду делать пробу цвета в каждом пикселе, и помнить, скажем, последние сто проб. Соответственно, в некотором аккумуляторе для каждого пикселя вычисляется среднее арифметическое этих самых последних ста проб (среднее арифметическое хорошо тем, что пересчитать его для каждого пикселя можно за O(1)). Соответственно, текущий кадр вычитается из аккумулятора, и то, что больше порога - некий объект. Алгоритм хорош тем, что даже если фон резко изменится, он достаточно быстро стабилизируется и привыкнет к новому фону.
Все это делаоя сегодня реализовал и проверил, работает быстро и результаты дает хорошие. Единственная проблема - получившиеся путем вычетания области объектов частенько рвутся (если цвет человека где-то близок к цвету фона), что неприятно. Что с этим лучше всего делать? Пробовал морфологическое замыкание и расширение, но выглядит результат не очень приемлимо.
=DeaD= » 11 июл 2008, 08:02
hr0nix писал(а):Да, это и мне пришло в голову. Проблема была только в том, где взять фон и какой? Статичную картинку без людей? Так в течение дня меняется освещение, и, соответственно, яркость фона. Периодически обновлять его? А если внизу все время ходят люди?
Тут пришла в голову следующая идея. Даже если внизу ходят люди, для каждого пикселя изображения эмпирически верно, что почти всегда он имеет цвет фона, лишь иногда - цвет человека. Соответственно, я решил сделать следующим образом. Несколько раз в секунду делать пробу цвета в каждом пикселе, и помнить, скажем, последние сто проб. Соответственно, в некотором аккумуляторе для каждого пикселя вычисляется среднее арифметическое этих самых последних ста проб (среднее арифметическое хорошо тем, что пересчитать его для каждого пикселя можно за O(1)). Соответственно, текущий кадр вычитается из аккумулятора, и то, что больше порога - некий объект. Алгоритм хорош тем, что даже если фон резко изменится, он достаточно быстро стабилизируется и привыкнет к новому фону.
Т.е. моё сообщение вы не читали
ну да ладно
hr0nix писал(а):Все это делаоя сегодня реализовал и проверил, работает быстро и результаты дает хорошие. Единственная проблема - получившиеся путем вычетания области объектов частенько рвутся (если цвет человека где-то близок к цвету фона), что неприятно. Что с этим лучше всего делать? Пробовал морфологическое замыкание и расширение, но выглядит результат не очень приемлимо.
А зачем вам четкий контур? Какую задачу вы решаете? Ведь для систем безопасности достаточно выделить область, где было движение. Зачем четкий контур?
MiBBiM » 11 июл 2008, 10:34
=DeaD=, у меня есть предположение, что hr0nix считает количество посетителей. В этом случае нужно отследить в какую область человек уходит (т.е. если его фигура скрылась за верхним краем изображения, то он вошел, если за нижним - вышел). Проблема заключается в том, что когда человек выходит, видимой от него остается все меньшая и меньшая часть и начиная с какого-то момента она будет неотличима от шума. Чтобы отследить человека, ушедшего за кромку и нужен контур. Кроме того, он позволяет отличить двух людей в случае их столкновения (фактически в момент сталкивания мы видим лишь одного человека на изображении вместо двух).
А вот как это сделать - вопрос.
hr0nix » 11 июл 2008, 20:01
MiBBiM, да, примерно так.
=DeaD=, ваше сообщение я прочитал уже после того, как придумал свое решение. Но в любом случае спасибо, если бы мне случайно не пришла в голову эта идея, вы бы мне очень помогли.
=DeaD= » 11 июл 2008, 23:15
hr0nix писал(а):MiBBiM, да, примерно так.
Т.е. надо людей считать? Если перекрытий между людьми не будет, тогда всё просто, если же будут - тогда надо как-то упрощать задачу, например, описывать вокруг каждой подозрительной области 1 или несколько кругов нужного радиуса, считая что габариты людей не отличаются на порядок
hr0nix писал(а):=DeaD=, ваше сообщение я прочитал уже после того, как придумал свое решение. Но в любом случае спасибо, если бы мне случайно не пришла в голову эта идея, вы бы мне очень помогли.
Да как бы это и не моя идея - это во всех системах обнаруживающих движение вроде пользуют.