Сегментация изображения в видеопотоке
Пояснительная записка
Студент группы ВС2-08 Широкова Е.Н.
Руководитель канд. техн. наук, доцент Паламарь И. Н.
Нормоконтролер канд. техн. наук, доцент Паламарь И. Н.
Рыбинск 2011
Содержание
Введение. 5
1 Анализ технического задания……………………………………………..6
2 Разработка математической модели системы…………………………….7
3 Разработка концептуальной объектной модели системы.. 11
4 Проектирование программы………………………………………………13
4.1 Разработка интерфейса……………………………………………………..13
4.2 Разработка алгоритмов……………………………………………………15
4.3 Кодирование программы………………………………………………….24
5 Разработка контрольного примера (тестирование)……………………..27
6 Руководство пользователя………………………………………………….31
Заключение……………………………………………………………………….32
Список использованных источников…………………………………………..34
Введение
Тема моей курсовой работы – сегментация изображения в видеопотоке. В наше время эта тема является достаточно актуальной, так как цель сегментации заключается в упрощении или изменении представления изображения, чтобы его было проще и легче анализировать.
Сегментация – это процесс разделения цифрового изображения на несколько сегментов (множество пикселей, также называемых суперпикселями). Более точно, сегментация изображений – это процесс присвоения таких меток каждому пикселю изображения, что пиксели с одинаковыми метками имеют общие визуальные характеристики.
Моя программа предназначена для отслеживания движущихся объектов в видеопотоке.
Нахождение и отслеживание движущихся объектов в видеопотоке является важной задачей для таких приложений, как охранные системы, системы анализа потока машин на автомагистрали, распознавание лиц, отпечатков пальцев, выделение обьектов на спутниковых снимках и т. д.
1 Анализ технического задания
Данная программа предназначена для сегментации видеоизображения. В качестве входных данных можно использовать как видеофайлы любого формата, так и видео, получаемое непосредственно с вебкамер, которые установлены на компьютере.
В программе будут реализованы свои классы с наследованием, конструкторами, деструкторами, ограничением доступа к элементам класса, свойствами и абстрактными методами.
Программа снабжается помощью с разделами, где будут описываться режимы работы программы и описание элементов управления.
Программа должна работать без сбоев, без зависаний и не нарушать работу операционной системы. Обязательно будет реализована обработка исключительных ситуаций и контроль вводимой информации.
2 Разработка математической модели системы
Пусть у нас имеется видеопоследовательность, получаемая из файла, или стационарной видеокамеры. Пусть первые n кадров перед видеокамерой не происходит никакого движения, а начиная с n+1 кадра перед камерой могут появляться объекты интереса, т.е. люди машины или что-то еще. Для каждого кадра последовательности требуется получить бинарное изображение (маску) переднего плана (движущихся объектов). В полученной маске 0/черный соответствует заднему плану, а 1/белый соответствует переднему плану. Пример успешной сегментации можно увидеть на рисунке 1.
Стоит дополнительно заметить, что требование о том, что первые n кадров перед камерой не происходит никакого движения не всегда может быть выполнено. В качестве примера можно рассмотреть видеопоследовательность с видом на улицу, на которой находится дерево с качающимися от ветра листьями. Подобное явление мы будем называть динамическим задним планом. Т.ч. данное требование можно заменить на то, что первые n кадров перед камерой не появляется никаких объектов интереса т.е. виден только задний план, статический или динамический.
Рис 1. Пример сегментации кадра видеопоследовательности.
Рассмотрим два алгоритма:
Простейший алгоритм.
Рассмотрим простейший алгоритм вычитания фона. Будем считать, что к нам поступают полутоновые изображения. Если с камеры поступают цветные изображения то их очевидно можно привести к полутоновым, например используя формулу:
. (2.1)
Алгоритм сохраняет первый кадр видеопоследовательности (обозначим его B), а потом для каждого следующего кадра (обозначим текущий кадр C) применяет порог к модулю разности текущего и сохраненного изображения по каждому пикселю используя условие:
, (2.2)
где w и h это ширина и высота картинки соответственно, то пиксель (i,j) считается переднеплановым, иначе он считается заднеплановым.
Отметим 2 вида ошибок такого алгоритма: переднеплановый пиксель был классифицирован как заднеплановый (например в следствии шума или из-за того, что цвет переднепланового объекта совпадает с цветом заднего плана) и заднеплановый пиксель был классифицирован как переднеплановый (например из-за шума). Изменяя параметр (порог) и параметры последующей фильтрации можно регулировать чувствительность алгоритма т.е. уровни этих ошибок. Несомненными достоинствами данного алгоритма является исключительная простота реализации и высокая производительность. Не смотря на эти достоинства существует ряд проблем, которые делают этот алгоритм практически неприменимым на практике.
2) Алгоритм с нормальным распределением.
Опять будем считать, что с камеры поступают полутоновые изображения. Данный алгоритм моделирует каждый пиксель заднего плана с помощью одномерной нормально распределенной случайной величины т.е.
(2.3)
Первые n кадров (когда камере виден только задний план) для каждого пикселя алгоритм производит оценку параметров модели т.е и используя аппарат мат. статистики а потом, после того как обучение закончено, попиксельно использует вероятностный порог для того, чтобы определить принадлежит ли значение пикселя заднему плану или переднему. Итак:
1) Обучение модели заднего плана по первым n кадрам. Для оценки параметров модели и для каждого пикселя можно применять математическое ожидание и среднее квадратичное отклонение значений в данном пикселе т.е.
(2.4)
где - значения в пикселе по первым n кадрам.
2) Далее для каждого следующего кадра и для каждого пикселя. Обозначим за с значение в текущем кадре для (i,j) пикселя. Если
(2.5)
то данный пиксель сегментируется в задний план, иначе он сегментируется в передний план.
Параметр e влияет на чувствительность алгоритма и выбирается из след. соображений. Фиксируется некоторое число После этого относительно e решается уравнение
(2.6)
где Число a есть ни что иное как вероятность того, что отклонение вызванное шумом камеры попадет в указанную выше e-окрестность. Очень часто пользуются e = 3 (т.н. Mahalanobis distance) которому соответствует значение . Данный алгоритм решает проблему шума камеры т.к. имеет адаптивный вероятностный порог, но все остальные проблемы остаются в силе. Заметим, что данный алгоритм допускает реализации не только для полутоновых но и, например, для RGB изображений, что улучшает качество работы алгоритма. При реализации в RGB следует использовать 3х мерное нормальное распределение вместо одномерного и построить вероятностный порог для 3х мерной сл. величины.
3 Разработка концептуальной объектной модели системы
В программе существует два класса TBackground и наследуемый от него TNRBackround. Класс TBackground описывает задний план для простого алгоритма. В нем необходимо обеспечить хранение заднего плана. Задний план Mask будет строиться в конструкторе объекта. Так как необходимо обеспечить различные уровни настройки работы алгоритма, то существуют различные переменные:
- AStep, отвечает за шаг алгоритма(например при значении 2, будут обрабатываться только каждые вторые пиксели);
- delt, отвечает за точность, (формула 2.2)
- count, счетчик сегментированных в передний план пикселей для текущего кадра.
- Sensetiv, хранит значение параметра, для установления является ли текущий кадр переднеплановым, или нет.
Для всех этих параметров предусмотрены свойства для чтения и записи.
Необходима функция CompImg для сравнения текущего кадра с задним планом. В нее необходимо передавать текущий кадр и флаг, который будет равен true при условии, что Sensetiv будет меньше, чем количество пикселей, которые сегментируются в передний план. Функция будет возвращать изображение типа TBitmap для текущего кадра, в которой черный цвет соответствует, что пиксель сегментировался в передний план, белый, что пиксель сегментировался в задний план.
Класс TNRBackground наследует все поля, свойства и методы от предка, кроме поля Mask. Так как этот класс используется для описания заднего плана при нормальном распределении, то поле Mask будет представлять собой два двумерных массива, в одном будет храниться математическое ожидание, в другом – среднее квадратичное отклонение (формула 2.4). В нем поле delt тоже отвечает за точность e (формула 2.5). Конструктор и функция сравнения в этом классе будут перекрываться. В конструктор уже необходимо передавать первые n кадров, то есть массив, а для функции сравнения необходима другая реализация.
Так как обработка кадра довольно трудоемкий процесс, поэтому ее необходимо выполнять в отдельном потоке. Для вывода и обработки кадров используется класс TShowAnim типа TThread.
4 Проектирование программы
4.1 Разработка интерфейса
После запуска программы появится окно, вид которого представлен на рисунке 4.1.
Рисунок 4.1 – Главное окно программы
Главное окно программы содержит окно, для отображения видео, компонент TMemo для отображения лога в процессе выполнения программы. и управляющие элементы, служащие для настройки работы алгоритмов .
В элементе меню «Файл» происходит выбор источника видео. Можно открыть из файла, а можно выбрать одно из видеоустройств, доступных в системе.
В элементе меню «Алгоритмы» происходит выбор одного из двух алгоритмов, реализованных в программе. По умолчанию выбран «Простой алгоритм».
В элементе меню «Помощь» содержится два пункта, «О программе» и «Помощь».
После выбора источника видео, необходимо сначала выбрать момент, в котором не будет присутствовать движение перед камерой и нажать на кнопку «Задать», таким образом мы задаем задний план. После этого программа начнет функционировать. Далее настраиваются параметры обработки:
- «Чувствительность» задает точность текущего алгоритма;
- «Уровень» влияет на скорость обработки, от него зависит шаг обработки текущего кадра.
- «Порог сохранения» настраивается в соответствии со значением «Порог», которое располагается внизу в строке состояния. Если «Порог сохранения» меньше, чем значение в строке состояния, то данный кадр считается переднеплановым (на нем существуют движущиеся фрагменты), то, в зависимости от элемента «Сохранять в:» и от пути сохранения, которые указаны внизу после лога программы, текущий кадр сохраняется в указанную папку.
- «Сохранить время и дату» используется для сохранения лога программы в текстовом формате.
- «Сбросить» останавливает обработку текущим алгоритмом, после чего можно выбрать другой алгоритм и продолжить обработку.
- «Звуковое оповещение» выдает звуковой сигнал при обнаружении движения.
- «Сегментация» вместо видео отображается результат сегментации, где движущиеся сегменты показаны черным цветом.
4.2 Разработка алгоритмов
Главными алгоритмами программы являются алгоритмы сегментации:
1. Алгоритм построения заднего плана (маски) для «Простого алгоритма»
2. Алгоритм построения заднего плана (маски) для «Нормального распределения»
3. Алгоритм сегментации кадра в «Простом алгоритме».
4. Алгоритм сегментации кадра в «Нормальном распределении».
Рассмотрим их по отдельности.
4.2.1 Алгоритм построения заднего плана (маски) для «Простого алгоритма»
Берем изображение, которое будем использовать в качестве заднего плана. Далее в двумерном цикле начинаем перебор всех пикселей. Для каждого текущего пикселя получаем цвет в формате RGB. Затем из полученного цвета берем составляющие и записываем в маску(задний план) по формуле
Блок схема алгоритма представлена на рисунке 4.2.
Рисунок 4.2 – Алгоритм построения заднего плана (маски) для «Простого алгоритма»
4.2.2 Алгоритм построения заднего плана (маски) для «Нормального распределения».
В этом методе алгоритм построения маски усложнится в связи с тем, что необходимо построить две маски. Первая содержит математическое ожидание, вторая – среднее квадратичное отклонение для каждого пикселя заднего плана.
Для построения заднего плана берется первые n изображений с камеры.
Далее в трехмерном цикле для каждого пикселя каждого изображения вычисляется математическое ожидание и среднее квадратичное отклонение по формулам 2.4.
Блок схема данного алгоритма представлена на рисунке 4.3.
Рисунок 4.3 Блок схема алгоритма построения заднего плана (маски) для «Нормального распределения».
4.3.3 Алгоритм сегментации кадра в «Простом алгоритме».
Берем текущий кадр из видеопоследовательности. Далее для каждого пикселя представляем цвет в черно-белом формате с помощью формулы 2.1.
И далее сравнивается с маской по условию:
где - чувствительность алгоритма, которая настраивается с помощью элемента интерфейса программы. Если данное условие выполняется, то пиксель в выходном изображении черный, если нет, то белый.
Блок схема алгоритма представлена на рисунке 4.4.
Рисунок 4.4 – Блок схема алгоритма сегментации кадра
в «Простом алгоритме».
4.3.3 Алгоритм сегментации кадра в «Нормальном распределении».
Данный алгоритм отличается от предыдущего только методом сравнения текущего пикселя с маской. Маска состоит из двух параметров математического ожидания M и среднего квадратичного отклонения D. Чувствительность алгоритма определяет е. В качестве условия используется формула 2.5.
Блок схема представлена на рисунке 4.5.
Рисунок 4.5 – Блок схема Алгоритм сегментации кадра
в «Нормальном распределении»
4.3 Кодирование программы.
Рассмотрим механизм работы с видеоустройствами. Для этого в программе используется пакет DSPack.
Рис. 4.6 – Структура классов пакета DSPack
DSPack использует механизм DirectShow, и имеет следующие компоненты:
- TFilterGraph. Этот компонент – обертка над менеджером графа фильтров DirectShow. Используется для построения и управления графом фильтров.
- TFilter, является оболочкой над интерфейсом, представляющим фильтр–IbaseFilter. Этот интерфейс предоставляет методы для управления фильтром. Его реализуют все фильтры DirectShow.
- TVideoWindow, используется для отображения (рендеринга) проходящих через граф фильтров данных.
При запуске приложения нужно провести поиск доступных видеоустройств. Для этого создается объект класса SysDevEnum, который служит для создания списка устройств. В данной программе используются видео устройства, это и указывается при создании объекта:
SysDev:= TSysDevEnum.Create(CLSID_VideoInputDeviceCategory);
Нам же необходимо вывести список всех доступных устройств в меню, для последующего выбора:
if SysDev.CountFilters > 0 then
for i := 0 to SysDev.CountFilters - 1 do
begin
Device := TMenuItem.Create(Devices);
Device.Caption := SysDev.Filters[i].FriendlyName;
Device.Tag := i;
Device.OnClick := OnSelectDevice;
Devices.Add(Device);
end;
При щелчке мыши на имени соответствующего устройства вызывается обработчик события OnSelectDevice, в котором происходит процедура построения графа фильтров для выбранного устройства:
Filter.BaseFilter.Moniker:= SysDev.GetMoniker(TMenuItem(Sender).tag);
FilterGraph.Active := true;
with FilterGraph as ICaptureGraphBuilder2 do
RenderStream(@PIN_CATEGORY_PREVIEW, nil, Filter as IBaseFilter, SampleGrabber as IBaseFilter, VideoWindow as IbaseFilter);
FilterGraph.Play;
Для получения изображения из видеопотока используется компонент SampleGrabber. Имеющий процедуру SampleGrabber.GetBitmap(img).
Так же необходимо знать разрешение видео, ширину и высоту. Они находятся с помощью SampleGrabber: Реализация представлена в следующей процедуре:
procedure TVideoForm.GetResolution(var VWidth,VHeight:integer);
var
info:_AMMediaType;
begin
SampleGrabber.SampleGrabber.GetConnectedMediaType(info);
VWidth:=VIDEOINFOHEADER(info.pbFormat^).bmiHeader.biWidth;
VHeight:=VIDEOINFOHEADER(info.pbFormat^).bmiHeader.biHeight;
end;
5 Разработка контрольного примера (тестирование)
Рассмотрим работу программы с различными алгоритмами сегментации. Так как камеры имеют различный уровень шумов, то логично было бы выбрать в качестве входных данных видеофайл, не имеющий шумов(создан в программе 3DSMax), и видеофайл, записанный с помощью простой веб-камеры.
5.1 Входные данные - видеофайл без шумов.
1) Простой алгоритм
Рисунок 5.1 – результат работы простого алгоритма с видеофайлом без шума.
Данный алгоритм практически точно определяет движущийся объект, но есть проблемы, если цвет текущего пикселя объекта совпадает с цветом заднего плана, то он будет считаться заднеплановым.
2) Нормальное распределение.
Рисунок 5.2 – Результат работы с нормальным распределением.
Данный алгоритм не подходит для сегментации видеопотока не имеющего шумов, так как теряется смысл построения нормального распределения. Так как если видеопоток не имеет шума, следовательно среднее квадратичное отклонение будет равно 0 для каждого пикселя построенного заднего плана. Если посмотреть на формулу 2.5, то видно, что в формуле знаменателем является как раз среднее квадратичное отклонение. Но мы получили, что оно в данном случае будет равно 0 для каждого пикселя, следовательно мы искусственно должны изменить его, чтобы не было ошибки деления на 0. Но тогда при оценке по формуле (2.5) некоторые пиксели могут быть ошибочно сегментированы в передний план.
5.2 Входные данные - видеофайл с шумом.
1) Простой алгоритм.
Рисунок 5.4 –Результат работы простого алгоритма с зашумленным видеофайлом.
Данный алгоритм справляется с поставленной задачей, но при большой чувствительности(40), при малой чувствительности(10) шум видеокамеры будет тоже сегментироваться в передний план.
2) Нормальное распределение.
Рисунок 5.4 – Результат работы алгоритма с нормальным распределением с зашумленным видеофайлом.
6 Руководство пользователя
После запуска программы необходимо выбрать источник данных в меню «Файл». Далее выбирается алгоритм работы в меню «Алгоритмы». Затем выбрать подходящий момент, чтобы на экране не было никаких движущихся объектов, и нажать на кнопку «Задать ». Программа начнет свое функционирование.
При появлении на экране движущихся объектов необходимо произвести настройку. Установить флажок «сегментация». Исходя из картинки, настроить чувствительность и уровень. В строке состояния следить за значением «Порог», и из своих соображений установить «Порог сохранения», при превышении которого будет фиксироваться движение.
Для остановки работы нажмите кнопку «Сбросить», после чего можно сменить алгоритм и продолжить работу.
Для того, чтобы все время не следить за видеозаписью можно установить «звуковое оповещение». При первом же появлении движения объекта на экране издаться звук.
Для сохранения кадров видео необходимо установить флажок «Сохранить в», указать путь сохранения, для этого следует нажать кнопку «Обзор…», указать имя файла.
Для сохранения лога, нажать «Сохранить время и дату».
Заключение
Из-за своей простоты и потому, что камера чаще всего зафиксирована, вычитание фона, вероятно, самая фундаментальная операция обработки изображений в сфере охранного видеонаблюдения. Для того чтобы выполнить вычитание фона, сначала мы должны "изучить" модель фона. Однажды изученная, эта модель фона сравнивается с текущим изображением, а затем известные части фона вычитаются. Объекты, оставшиеся после вычитания, предположительно будут являться новыми объектами переднего плана.
Конечно, "фон" является плохо определенной концепцией, которая изменяется в зависимости от применения. Например, если вы наблюдаете шоссе, возможно, обычный транспортный поток следует рассматривать фоном. Как правило, фоном считаются любые статические или периодически движущиеся части сцены, которые остаются неизменными или периодическими в течение интересующего периода. Вся группа, возможно, имеет изменяющиеся во времени компоненты, такие как раскачивающиеся от ветра утром и вечером деревья, но неподвижные в полдень. Две общие, но существенно различающиеся, категории окружения, которые могут встретиться, это сцены внутри и снаружи помещений.
В программе были реализованы две метода сегментации видеопотока, которые будут успешно работать только при определенных условиях. При изменении освещения, оба алгоритма будут давать ложные значения. Но для определения факта движения этих алгоритмов достаточно. Главной задачей является выбрать наиболее подходящие для данной ситуации параметры работы программы, удачно задать задний план, выбрать порог сохранения (исходя из значения порога в текущей картинке), и настроить точность алгоритма.
Данная работа мне показалась среднего уровня сложности. Я считаю, что я достигла поставленной цели.