Введение
Реализация алгоритмов обнаружения и анализа движения может быть осуществлена с помощью различных программных средств: HTML в связке с JavaScript, Python, С#, MATLAB, Mathematica (см., например, [4],[5], [2], [3], [1] соответственно).
Romuald Q. в своей работе [4] с помощью HTML 5 и JavaScript реализовал обнаружение движения с web-камеры на сайте. В качестве меры количества движения он взял среднее значение пикселя для переведенного в бинарное изображение кадра, который является разностью текущего и предыдущего (снятого 1/60 секундами ранее) цветных кадров. Автор не удаляет шумы из полученного разностного бинарного изображения, а лишь устанавливает порог (количество белых пикселей в бинарной разности), для того чтобы программа не реагировала на них как на движение.
Лашин А. В. представил четыре алгоритма [2] и с помощью С# реализовал обнаружение движения. В двух из представленных им алгоритмов анализируемый на наличие движения кадр является разностью текущего и предыдущего кадров (или первого кадра), переведённых в оттенки серого. В двух других – разностью текущего кадра и фоновой сцены, также переведенных в оттенки серого. В качестве меры количества движения взято количество белых пикселей в анализируемом кадре. Автор использует фильтры для удаления шумов в анализируемой разности и устанавливает порог для шумов (количество белых пикселей в бинарной разности), на которые не надо реагировать как на движение.
Общее в алгоритмах этих авторов то, что оба автора подсчитывают количество белых пикселей в анализируемом изображении, и затем полученное число используется в качестве меры наличия движения. Такая реакция может либо не сообщить об имеющемся движении (если, например, медленное движение), либо привести к ложному срабатыванию сообщения о движении. Поэтому судить о наличии движения только по количеству белых пикселей в исследуемом кадре не достаточно.
В статье В. Заливы [1] приведен алгоритм обнаружения движения в записанном заранее видео-файле. В основе приведенного им алгоритма лежит нахождение величины движения с помощью коэффициента вариации. Автор, также как и Лашин А. В., переводит изображение в серую шкалу, но для более продуктивной работы программы масштабирует изображение и создает фильтр, защищающий анализируемое изображение от шумов. При этом ему приходится осуществлять сглаживание сигналов с помощью полученного им уравнения регрессии количества движения на номере кадра в отснятом заранее видеофайле. Видим, что это непростая процедура. На ее осуществление требуется дополнительное время, что приводит к замедлению действия алгоритма.
В. Залива работал в пакете Mathematica 8. Результатом действия его программы является график ковариации среднего значения пикселя в каждом кадре из рассматриваемого заранее записанного видео-файла. Из этого графика видно, на каком именно кадре из записанного заранее файла произошло движение, большее фиксированного порога.
Нами же в пакете Mathematica 8 создано приложение, которое в режиме реального времени одновременно со звуковым сигналом сообщает тип обнаруженного движения: незначительное, значительное. Это даёт возможность, несмотря постоянно на наблюдаемую область, узнать о типе возникшего движения в этой области. Это приложение позволяет пользователю сделать свои настройки – какое движение он будет считать незначительным или значительным и о каких движениях сообщать. Заметим, что значимость движения и, соответственно, настройки зависят от удалённости наблюдаемого объекта и освещенности области наблюдения.
Созданный в ходе работы алгоритм имеет некоторую схожесть с алгоритмом, предложенным В. Заливой [1], т.к. предложенная им идея нахождения величины движения также нашла место и в представленном в настоящей работе алгоритме. Только в нашем алгоритме по-другому создаётся изображение для анализа. Наш способ образования этого изображения позволяет сразу максимально избавиться от шумов, что упрощает алгоритм, увеличивает быстродействие приложения и уменьшает вероятность ложного сигнала без создания специальных фильтров.
Цель исследования. Создание приложения для обнаружения движения в помещении со стационарной камеры, которое одновременно с обнаружением движения сообщало бы о его значимости: значительное или незначительное. Чувствительность реакции на движение должна устанавливаться пользователем. Сообщение о наличии движения должно сопровождаться соответствующим сигналом. Приложение должно работать в режиме реального времени.
Объекты исследования: изображения, полученные со стационарной камеры.
Методы исследования: статистические.
Математический аппарат приложения для обнаружения движения со стационарной камеры в помещении
Создание изображения для анализа. Основная задача – удачное задание функции, создающей изображение для анализа. Желательно создание такой функции, чтобы на этом изображении было как можно меньше «шумов» или их совсем не было бы. Оказалось, что этого можно достичь с использованием пакета Mathematica 8 следующим образом: создана переменная im2 – изображение для анализа – динамическая разность двух бинарных кадров, снятых с паузой 0.2 секунды. В пакете Mathematica 8 это можно записать так:
Dynamic[{im1 = CurrentImage[],
im2 = ImageDifference @@ Table[ Pause[0.2]; Binarize[CurrentImage[]], {2}}].
Заметим, что в этом операторе создается еще динамическая переменная im1 – текущий кадр (он автоматически будет цветным), который в дальнейшем будет использоваться для создания нужного приложения.
Такая динамическая разность im2 позволяет сразу максимально избавиться от «шумов», что увеличивает быстродействие приложения и уменьшает вероятность ложного сигнала без создания специальных фильтров. Здесь слово «шумов» – разности шумов с каждого из вычитаемых кадров.
Сама идея создания именно такого im2 основана на том, что на двух соседних кадрах, отснятых почти сразу, шумы одинаковые или практически одинаковые, если внезапно не произошла какая-то чрезвычайная ситуация (внезапное создание большого количества помех или отсутствие сигнала с камеры). В пакете Mathematica 8 такая разность находится мгновенно. Сама разность будет динамически изменяться, т. е. будет текущей разностью. Причём разность между двумя соседними текущими im2 зависит от характеристик самой камеры (например, кадровая частота). Следовательно, на разности таких бинарных кадров белых пикселей не будет или практически не будет, если не произошла указанная выше ситуация. Заметим, что белые пиксели на разности im2 могут получиться тогда, когда либо от черного пикселя отнимается белый, либо наоборот. Поэтому белые пиксели в im2 говорят о том, что произошло движение в том месте, где белый пиксель. Заметим, что тут существенно то, что берётся разность именно бинарных (т.е., черно-белых) кадров, т.к. в этом случае разность соответственно тоже будет бинарной. Если бы мы брали разность цветных (или в оттенках серого) текущих изображений отснятых с паузой, то их разность была бы цветной (соответственно в оттенках серого). А это при измерении количества движения играет важную роль. Ну а если произошла указанная выше ситуация, значит, наше приложение в силу указанного ниже способа сигнализации о наличии движения должно издать сигнал. А нам он тоже нужен.
Измерение количества движения. В качестве функции, измеряющей величину движения, берём, как и в статье Заливы [1], коэффициент вариации
, (1)
где среднее значение пикселя в кадре (в нашем случае возможны значения от 0 до 1 включительно), – стандартное отклонение от , – количество пикселей в кадре, – дисперсия значения пикселя, в нашем случае признак – цвет пикселя (0 или 1) в анализируемом кадре.
Сначала находим среднее значение пикселя в кадре im2. Здесь заданный ниже оператором ImageData массив значений пикселей в изображении im2 выравнивается (т. е. переводится в одномерный) с помощью Flatten. Затем к полученному списку применяется встроенная в пакет Mathematica 8 функция Mean расчета среднего статистического значения всех элементов в списке. Все вычисления производятся в динамическом режиме, поэтому используем оператор Dynamic:
Dynamic[sp = N[Mean[Flatten[ImageData[im2]]]]].
Оператор Variance позволяет получить оценку исправленной дисперсии списка. Для нахождения значения стандартного отклонения берется (так же, как ранее) выровненный массив пикселей изображения, заданный оператором Flatten[ImageData[im2]] и к нему применяется встроенная функция Variance. Все вычисления должны производиться в динамическом режиме, поэтому снова используем оператор Dynamic:
Dynamic[varp = N[Variance[Flatten[ImageData[im2]]]]].
Вычисление значения количества движения осуществляем в соответствии с приведенной выше формулой (1):
Dynamic[cd = N[varp/sp]].
В заключение здесь осталось лишь заметить, что чем больше коэффициент вариации cd, тем больше движение. Оператор N в коде применяется для получения численного значения (т.е. числа с десятичной точкой).
Создание элементов приложения для обнаружения движения
Установление порога и реакции на движение. Установим критерий, который будет задавать чувствительность приложения на движение.
Сначала создадим слайдер, с помощью которого пользователь может установить свой порог для реакции на движение:
Slider[Dynamic[p], {0, 2}].
Теперь установим условие реакции на движение: если текущая величина количества движения cd больше, чем порог р, то движение считается значительным, о чем сообщается в текстовом сообщении с одновременным звуковым сигналом. Для более презентабельного вида к каждому текстовому сообщению применим оператор Style, в котором укажем, что текст должен быть зеленного цвета (Green) и большим шрифтом (Large):
Dynamic[If[<cd,
Style["движение значительное", Green, Large]&&EmitSound[Sound[SoundNote["C"]]], Style["движение незначительное", Green, Large]&&EmitSound[Sound[SoundNote["G"]]]]].
Для того чтобы добавить на панель весь результат, полученный на этом этапе, все собирается в переменную рр и записывается в виде колонны. Это позволяет сделать оператор Column:
pp=Column[{Slider[Dynamic[],{0,2}],Dynamic[],Dynamic[If[<cd,Style["движение значительное",Green,Large]&&EmitSound[Sound[SoundNote["C"]]],Style["движение незначительное",Green,Large]&&EmitSound[Sound[SoundNote["G"]]]]]}].
Создание меню «справка». Создаётся меню «справка», в котором можно получить справку о текущих характеристиках работы алгоритма по обнаружению движения. В этой справке задаем возможность получить бинарное изображение im2, т.е. изображение для анализа на наличие движения, и величину количества движения cd:
help =ActionMenu["Справка",
{"Показать бинарное изображение"⧴({"бинарное изображение",Dynamic[im2]}//CreateWindow[DocumentNotebook[{Dynamic[im2]},WindowTitle→"бинарное изображение"]];),
"Показать коэффициент вариации"⧴({"Значение коэффициента вариации=",Dynamic[cd]}//CreateWindow[DocumentNotebook[{Dynamic[cd]},WindowTitle→"коэффициент вариации"]];)}].
Вид готового приложения и демонстрация его работы
Заключительным этапом создания приложения является создание панели, играющей роль виртуального «прибора»:
Panel[Grid[{{Dynamic[CurrentImage[]],Dynamic[pp]}, {Dynamic[spravka]}},Alignment→Left], ImageSize→480].
Ниже приведены скриншоты созданного приложения, демонстрирующие его работу.
На рис. 1–2 изображено приложение, играющее роль виртуального «прибора». На нем показывается текущее изображение im1, поступающее с камеры в реальном времени; движок Slider[Dynamic[p], {0, 2}] с выбором вариантов запуска приложения; раскрыто меню кнопки «Справка». При клике мышью на пункт меню «Показать бинарное изображение» (см. рис. 1, 2) открывается окошко, в котором изображается текущее анализируемое изображение. При клике мышью на пункт меню «Показать критерий величины движения» (см. рис. 1, 2), открывается окошко со значением коэффициента вариации среднего значения пикселя кадра cd.
На рис. 1 представлено приложение в работе, когда произошло незначительное движение, а на рис. 2 - значительное движение при установленном пользователем пороге p=1.03. В обоих случаях кликнуто на пункты меню «Справка». Рядом размещены окошки с анализируемым изображением и значением количества движения, возникшие при клике мышью на соответствующие пункты меню. Заметим, что в случае, зафиксированном на рис. 1 , cd=0.722672 меньше, чем установленный порог. Поэтому это движение воспринято как незначительное. На рис. 2 зафиксирована ситуация, когда произошло значительное движение головой из стороны в сторону и корпус сдвинулся - белые пиксели на бинарном изображении. Здесь коэффициент количества движения cd=1.2102, что больше, чем установленный порог. Поэтому это движение воспринято как значительное.
Рис. 1. Работа приложения для обнаружения движения. Движение незначительное.
Рис. 2. Работа приложения для обнаружения движения. Движение значительное.
Заключение
С помощью системы компьютерной алгебры Mathematica 8 осуществлена разработка приложения – виртуального «прибора» для обнаружения движения в помещении от стационарной камеры. Это приложение в режиме реального времени сообщает одновременно со звуковым сигналом об обнаружении движения в помещении и его типе: незначительное или значительное.
Созданный в ходе работы алгоритм имеет некоторую схожесть с алгоритмом, предложенным В. Заливой [1], т.к. предложенная им идея нахождения величины движения так же нашла место и в представленном в настоящей статье алгоритме. Только в нашем алгоритме по-другому создаётся изображение для анализа. Наш способ образования этого изображения позволяет сразу максимально избавиться от шумов, что упрощает программу, увеличивает быстродействие приложения и уменьшает вероятность ложного сигнала без создания специальных фильтров. Разработанный детектор характеризуется хорошим качеством обнаружения движения в помещении, устойчивостью к шуму, регистрируемому стационарной камерой.
Рецензенты:
Зарипов Р.Г., д.ф.-м.н., профессор, зам директора по научной работе, ИММ КазНЦ РАН, г.Казань.
Уткина Е.А., д.ф.-м.н., доцент кафедры информационных систем, ФГАОУ ВПО “Казанский (Приволжский) федеральный университет”, г.Казань.