Разработка системы отслеживания движущихся объектов

Создание системы видеонаблюдения для обеспечения требуемого уровня безопасности. Функция обнаружения движения. Обзор альтернативных вариантов построения информационной системы. Последовательность обработки фильтров. Графическая обработка видеопотоков.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 16.01.2014
Размер файла 702,7 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

КАФЕДРА ИНФОРМАЦИОННЫХ СИСТЕМ

КУРСОВАЯ РАБОТА

По теме: Разработка системы отслеживания движущихся объектов для задач обеспечения безопасности

Тюмень 2012

Описание

Постановка Задачи

Необходимо создать систему видеонаблюдения для обеспечения требуемого уровня безопасности. Можно выделить основные преимущества систем видеонаблюдения перед другими средствами безопасности. Это автоматическое обнаружение и видео контролирование событий, мгновенное обнаружение несанкционированного проникновения на охраняемую территорию, исключение ложных срабатываний за счет интеллектуальной обработки поступающих информационных потоков, наглядное отображение всей обрабатываемой информации, возможность тесной интеграции с другими подсистемами безопасности. Среди недостатков таких систем можно выделить затрудненную работу в неблагоприятных погодных условиях, например, туман.

Информационная система, должна быть снабжена специальной функцией обнаружения движения (Motion detector) и автоматически сохранять видеоданные в тот момент, когда информация является полезной для человека, а именно если на видеоданных зафиксировано появление нового объекта. Это позволит более рационально использовать место хранения видеоданных. Например, это бывает выгодно тогда, когда на вашей даче, офисе, коттедже или просто участке появились люди, которые там не должны быть и в данном случае информационной системой начнётся сохранение видеоданных и слежение за объектами. В другом случае информация с видеоданных не представляет интереса, то и сохранять её не имеет смысла.

Для дальнейшей разработки возможны функции в виде отправки видеоданных на экран мобильного телефона. Для того чтобы сам человек мог определить дальнейшие действия. Например: вызов полиции, когда ваше имущество находится под угрозой или остановки предыдущих действий, если к вам забежали дети, случайно перебросившие мяч через вашу ограду.

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

Подведём итог: необходимо разработать информационную систему, которая фиксирует появление объектов, основываясь на видеоданных, поступающих в режиме реального времени, а также направление движения различных объектов для управлением движением камеры, если такой механизм предусмотрен для данной системы.

Обзор альтернативных вариантов построения информационной системы

Наша информационная система должна сигнализировать о наличии движения поэтому разберём алгоритмы поиска движения (Motion Detection Algorithms).

Есть много подходов для обнаружения движения в потоке видео. Все они основаны на сравнении текущего кадра с одним из предыдущих кадров или с чем-то, что мы будем называть фон. Разберём некоторые из наиболее распространённых.

В описании этих алгоритмов я буду использовать Фреймворк AForge.NET.

Самый простой из способов является сравнение текущего кадра с предыдущим. Это применяется в алгоритмах сжатия видео, когда вам нужно оценить лишь степень изменения и записывать только сами изменения, а не весь кадр. Но это не самый лучший из подходов для обнаружения движения.

Предположим, что у нас есть RGB изображение с глубиной цвета 24 бит называемое текущий кадр (image ), черно-белая копия ( currentFrame ) и черно-белая копия предыдущего кадра (backgroundFrame ). Прежде всего, давайте найдем те регионы, где эти два кадра различаются. Для целей мы можем использовать Difference и Threshold фильтры.

Пример кода:

// создание фильтров

Difference differenceFilter = new Difference( );

IFilter thresholdFilter = new Threshold( 15 );

// Установить наложение фильтров разницы

differenceFilter.OverlayImage = backgroundFrame;

// применяем фильтры

Bitmap tmp1 = differenceFilter.Apply( currentFrame );

Bitmap tmp2 = thresholdFilter.Apply( tmp1 );

На этом этапе мы получим изображение с белыми пикселами на месте, где текущий кадр отличается от предыдущего кадра на указанное значение порога. Подсчитываем пиксели, и если их сумма будет больше, чем заданный уровень тревоги мы может сигнализировать о происшествии.

Но большинство камер производят шумные изображения, так что мы получим движение в таких местах, где нет движения вообще. Для удаления случайных шумных пикселей, мы можем использовать фильтр Erosion. Таким образом, мы получим сейчас только те регионы, где было движение.

/ / Создать фильтр

IFilter erosionFilter = new Erosion ();

/ / Применяем фильтр

Bitmap tmp3 = erosionFilter.Apply (tmp2);

Простейший датчик движения готов! Мы можем выделить движение регионов в случае необходимости.

// Извлечение красного канала от исходного изображения

IFilter extrachChannel = new ExtractChannel( RGB.R );

Bitmap redChannel = extrachChannel.Apply( image );

// Слияние красного канала с движением регионов

Merge mergeFilter = new Merge( );

mergeFilter.OverlayImage = tmp3;

Bitmap tmp4 = mergeFilter.Apply( redChannel );

// Заменить красный канал в исходном изображении

ReplaceChannel replaceChannel = new ReplaceChannel( RGB.R );

replaceChannel.ChannelImage = tmp4;

Bitmap tmp5 = replaceChannel.Apply( image );

Рис.1

Из приведенной выше картинки Рис.1 мы видим недостатки такого подхода. Если объект движется плавно, мы получим небольшие изменения. Таким образом, невозможно получить весь движущийся объект. Все становится хуже, когда объект движется очень медленно, тогда алгоритм не даст никакого результата вообще.

Существует другой подход. Можно сравнить текущий кадр не с предыдущим, а с первым кадром видеозаписи. Так что, если не было объектов в первом кадре, то при сравнение текущего кадра с первым даёт нам целый движущийся объект независимо от его скорости движения. Однако, такой подход имеет большой недостаток - что произойдёт если мы повесим картину на стену? Система будет постоянно сигнализировать о наличии движения.

Как в предыдущем случае, предполагаеться, что у нас есть исходное изображение RGB на 24 бит/пкс, названное текущим кадром (image), его чёрно-белая копия (currentFrame) и фоновый кадр, также чёрно-белый (backgroundFrame). Вначале, мы получаем первый кадр видеозаписи как фоновый кадр. И затем мы будем сравнивать текущий кадр с фоновым. Но это даст нам результат, который я описал выше, который нам очевидно не очень нужен. Мы улучшим данный алгоритм. Фоновый кадр будет приближаться к текущему кадру ( 1 уровень на кадр). При приближении фоновый кадр немного меняется в направлении текущего кадра, цвета пикселей в фоновом кадре структурируют к пикселям текущего 1 уровнем на кадр.

/ / Создать фильтр

MoveTowards moveTowardsFilter = new MoveTowards( );

// Переместить фон на текущий кадр

moveTowardsFilter.OverlayImage = currentFrame;

Bitmap tmp = moveTowardsFilter.Apply( backgroundFrame );

// Удаляем старый фон

backgroundFrame.Dispose( );

backgroundFrame = tmp;

И теперь, мы можем использовать то, что мы использовали выше. Немного изменим для более интересного результата .

// Создать последовательность обработки фильтров

FiltersSequence processingFilter = new FiltersSequence( );

processingFilter.Add( new Difference( backgroundFrame ) );

processingFilter.Add( new Threshold( 15 ) );

processingFilter.Add( new Opening( ) );

processingFilter.Add( new Edges( ) );

// применяем фильтр

Bitmap tmp1 = processingFilter.Apply( currentFrame );

// применяем красный канал

IFilter extrachChannel = new ExtractChannel( RGB.R );

Bitmap redChannel = extrachChannel.Apply( image );

// слияние красного канала с границами движения объекта

Merge mergeFilter = new Merge( );

mergeFilter.OverlayImage = tmp1;

Bitmap tmp2 = mergeFilter.Apply( redChannel );

// заменяем красный канал на исходном изображении

ReplaceChannel replaceChannel = new ReplaceChannel( RGB.R );

replaceChannel.ChannelImage = tmp2;

Bitmap tmp3 = replaceChannel.Apply( image );

Рис.2

Есть другой подход на основе этой идеи. Как в предыдущих случаях, у нас есть исходный кадр и его черно-белая копия и копия фонового кадра. Но давайте попробуем применить фильтр Pixellate к текущему кадру и к фону перед последующей обработкой.

// создаём фильтр

IFilter pixellateFilter = new Pixellate( );

// применяем фильтр

Bitmap newImage = pixellateFilter( image );

Так, у нас есть текущий и фоновый кадры с фильтром Pixellate. Теперь, мы должны приблизить фоновый кадр к текущему кадру, как мы делали прежде. Следующее изменение - основной шаг обработки:

// создаётся последовательность фильтров обработки

FiltersSequence processingFilter = new FiltersSequence( );

processingFilter.Add( new Difference( backgroundFrame ) );

processingFilter.Add( new Threshold( 15 ) );

processingFilter.Add( new Dilatation( ) );

processingFilter.Add( new Edges( ) );

// применяем фильтр

Bitmap tmp1 = processingFilter.Apply( currentFrame );

После слияния tmp1 отображает исходное изображение с красным каналом. В итоге мы получаем:

Рис.3

Может быть, это выглядит не столь совершенным как предыдущее, но у этого подхода есть большая возможность для оптимизации производительности.

Часто бывает так что не требуется, выделять в точности границы объекта и достаточно выделить новый объект в прямоугольник. Это может быть сделано, используя класс BlobCounter библиотеки АForge NET.

BlobCounter blobCounter = new BlobCounter( );

...

// получаем объект из прямоугольников

blobCounter.ProcessImage( thresholdedImage );

Rectangle[] rects = BlobCounter.GetObjectRectangles( );

// создаём картинку для первоначального изображения

Graphics g = Graphics.FromImage( image );

// рисуем каждый прямоугольник

using ( Pen pen = new Pen( Color.Red, 1 ) )

{

foreach ( Rectangle rc in rects )

{

g.DrawRectangle( pen, rc );

if ( ( rc.Width > 15 ) && ( rc.Height > 15 ) )

{

// получаем большие объекты

}

}

}

g.Dispose( );

Рис.4

Объяснение выбранного варианта

Вычисления, связанные с графической обработкой видеопотоков, являются достаточно ресурсоёмкими. В особенности когда у нас имеется несколько видеокамер одновременно сигнализирующих о наличии движения потребность в быстрых вычислениях станет критической. Протестировав все способы приведённые выше я остановился на способе в котором используется класс BlobCounter. Этот способ будет оптимальным в плане производительности.

Используемые средства. AForge.NET Framework

видеонаблюдение безопасность графический информационный

AForge.NET платформа C# с открытым исходным кодом, разработанная для разработчиков и исследователей в областях машинного зрения и искусственного интеллекта - обработка изображений, нейронные сети, генетические алгоритмы, нечеткая логика, обучение машины, робототехника, и т.д.

Платформа состоит из набора библиотек и примеров приложения, которые демонстрируют их функции:

· AForge.Imaging - библиотека обработки изображений и фильтрами;

· AForge. Vision - библиотека машинного зрения;

· AForge. Video - набор библиотек для обработки видеоданных;

· AForge. Neuro - библиотека вычисления нейронных сетей;

· AForge. Genetic - библиотека программирования развития;

· AForge. Fuzzy - нечеткая библиотека вычислений;

· AForge. Robotics - библиотека, оказывающая поддержку некоторых наборов робототехники;

· AForge. MachineLearning - библиотека обучения машины;

· и т.д.

В программном обеспечении, которое должно сигнализировать о наличии движения, используются фильтры находящиеся в библиотеках Imaging и Video

Pixellate - обработка изображения, создаётся эффект изображения с большими пикселями - pixellated изображение. Эффект достигнут, заполняя прямоугольники изображения указанного размера цветом, который является средним тоном краски для соответствующего прямоугольника. Размер прямоугольников, чтобы обработать установлен свойствами PixelWidth и PixelHeight.

Difference - фильтр различия берет два изображения (источник и изображения наложения) того же самого размера, и пиксель форматируют, и производит изображение, где каждый пиксель равняется абсолютной разности между соответствующими пикселями от представленных изображений.

Dilatation - фильтр назначает максимальное значение окружающих пикселей к каждому пикселю изображения результата. Окружающие пиксели, которые должны быть обработаны, определены, структурируя элемент: 1 - чтобы обработать соседа,-1 - чтобы пропустить его.

Фильтр, особенно полезный для обработки бинарного изображения, где это позволяет выращивать отдельные объекты или объекты соединения.

В программном коде происходит постоянное преобразование поступающих кадров всеми представленными фильтрами.

I.Глава. Реализация

Инструментальная схема системы

Рис.5

На рисунке 5 представлена инструментальная схема системы с механизмами слежения за объектами. В случае когда нет возможности использовать механизмы поворота или они не требуются, выгодно использовать камеры cо встроенной технологией wi-fi. Это поможет избежать проблем со шнурами. Правда в этом случае придётся потратится на качественный wi-fi роутер.

Разработка программы

Главная форма, на которой во время работы веб-камеры можно увидеть в каких регионах система определяет наличие движения:

Рис.6

В моей программе есть два класса Form1(сандартный класс) и ImageProcessing (созданный мной).

Для вывода полного списка камер в классе Form1 предусмотрена процедура GetCamList. Она использует классы платформы AForge net.

private VideoCaptureDevice videoSource = null;

Этот класс источника видеосигнала получает видеоданные от локального устройства видеосъемки таких как, USB веб-камера, устройство захвата изображения то, что поддерживает интерфейс DirectShow.

private void getCamList(ComboBox t)

{

try

{

videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);

t.Items.Clear();

if (videoDevices.Count == 0)

throw new ApplicationException();

DeviceExist = true;

foreach (FilterInfo device in videoDevices)

{

t.Items.Add(device.Name);

}

t.SelectedIndex = 0; //make dafault to first cam

}

catch (ApplicationException)

{

DeviceExist = false;

t.Items.Add("No capture device on your system");

}

}

Здесь клонируются кадры и передаются по ссылке в процедуру для дальнейшей обработки в классе ImageProcessing. В итоге изменённый кадр отображается на главной форме приложения в компоненте pictureBox1.

void captureDevice_NewFrame(object sender, NewFrameEventArgs eventArgs)

{

Bitmap image = (Bitmap)eventArgs.Frame.Clone();

Proc.ProcessFrame(ref image);

pictureBox1.Image = image;

}

Основная процедура обработки поступающих кадров:

public void ProcessFrame( ref Bitmap image )

{

max = 0;

if ( backgroundFrame == null )

{

// создаём начальную картинку фона

backgroundFrame = processingFilter1.Apply( image );

//задаём размер

width = image.Width;

height = image.Height;

//закрытие процедуры

return;

}

Bitmap tmpImage;

//применяем первый фильтр последовательности

tmpImage = processingFilter1.Apply( image );

if ( ++counter == 2 )

{

counter = 0;

// структурируем фоновый кадр к текущему

moveTowardsFilter.OverlayImage = tmpImage;

moveTowardsFilter.ApplyInPlace( backgroundFrame );

}

differenceFilter.OverlayImage = backgroundFrame;

// блокируем для применения ряда фильтров

bitmapData = tmpImage.LockBits( new Rectangle( 0, 0, width, height ),

ImageLockMode.ReadWrite, PixelFormat.Format8bppIndexed );

differenceFilter.ApplyInPlace( bitmapData );

thresholdFilter.ApplyInPlace( bitmapData );

blobCounter.ProcessImage( bitmapData );

//получаем прямоугольники

Rectangle[] rects = blobCounter.GetObjectsRectangles();

//снимаем блокировку

tmpImage.UnlockBits( bitmapData );

tmpImage.Dispose( );

pixelsChanged = 0;

if (rects.Length !=0 )

{

// создаём графический объект

Graphics g = Graphics.FromImage( image );

using ( Pen pen = new Pen( Color.Red, 1 ) )

{

int n = 0;

int t = 0;

//рисуем каждый прямоугольник

foreach ( Rectangle rc in rects )

{

g.DrawRectangle( pen, rc );

if ( ( t < 10 ) && ( rc.Width > 30 ) && ( rc.Height > 30) )

{

if ((max < rc.Width * rc.Height))

{

max = rc.Width * rc.Height;

cord_X = rc.X + rc.Width / 2;

cord_Y = rc.Y + rc.Height / 2;

}

cl.pictureBox2.Visible = true;

g.DrawImage( numbersBitmaps[n], rc.Left, rc.Top, 17, 19 );

//n++;

t++;

}

h++;

if (h > 25)

{

h = 0;

// вычисляем скорость каждые 25 кадров

speed = Math.Abs(cord_X - cord_X1) + Math.Abs(cord_Y - cord_Y1);

g.DrawString("Скорость:" + speed + "pix/s", font1, br, f);

r = speed;

cord_X1 = cord_X;

cord_Y1 = cord_Y;

}

g.DrawString("Скорость:" + r + "pix/s", font1, br, f);

if ( calculateMotionLevel )

pixelsChanged += rc.Width * rc.Height;

}

}

g.Dispose( );

}

}

В представленном исходном коде происходит сравнение кадров фонового и текущего. В дальнейшем места различия этих кадров обводятся в красные прямоугольники. Тем самым мы можем увидеть появление новых объектов в видеозаписи. В итоге мы узнаём скорость и направление появившегося объекта.

Направление движения нужно только для того чтобы определить в каком направлении следует повернуться манипулятору если он предусмотрен для видеокамеры.

Данное программное обеспечение не сразу определяет движение, необходимо некоторое время для создания сцены (фонового кадра), поэтому если вы вдруг повесите картину, пройдёт некоторое время прежде чем система войдёт в установившийся режим и перестанет сигнализировать о наличии движения.

class UnmanagedImage;

При помощи этого класса это возможно выделение нового изображения в неуправляемой памяти, просто переместить указатель на неуправляемую память, где изображение сохранено.

Использование неуправляемых изображений наиболее выгодно, когда требуется применить несколько программ для обработки одного изображения. В таком сценарии использовании управляемых изображений в .NET обычно приводит к худшей производительности, потому что каждая подпрограмма должна заблокировать управляемую обработку исходного вида записи изображения, обработать, и затем разблокировать его после того, как обработка изображений сделана. Без блокировки/разблокировки нет никакого способа получить прямой доступ к данным управляемого изображения.

Блок диаграмма:

True false

Результаты

Мною была разработана программа демонстрирующая как информационная система определяет наличие движения. В платформе Aforge net присутствует также библиотека Robotics для управления контроллерами. Были изучены алгоритмы обнаружения движения.

II.Глава. Итог

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

Список используемой литературы

1. Алгоритмы определения движения: http://www.codeproject.com/Articles/10248/Motion-Detection-Algorithms

2. Сайт платформы Aforge net: http://www.aforgenet.com/framework/

3. Системы слежения: http://www.bestreferat.ru/referat-64402.html

4. Примеры использования библиотеки: http://www.codeproject.com/Articles/45735/Laser-Guided-Tic-Tac-Toe-Game-using-Webcam-For-Vis

5. Потоки в C#: http://www.rsdn.ru/article/dotnet/CSThreading1.xml

6. Использование веб-камеры: http://www.aforgenet.com/articles/lego_pan_tilt_camera/

Размещено на Allbest.ru


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.