![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Приложение а
Цель работы Знакомство с основными принципами и инструментами построения систем обработки видеопотока используемыми в сфере обеспечения безопасности, на основе решения задачи контроля движения в заданных зонах. Задание на работу Вариант №4. Метод выделения движения на основе истории перемещения MHI. Текст программы Полный текст программы приведён в ПРИЛОЖЕНИИ А. Тестовый пример программы Рисунок 2. Обнаружение движения (кисть) Рисунок 3. Обнаружение движения в статически заданной области Заключение Данная работа была выполнена с помощью кроссплатформенной «обёртки» для.NET библиотеки обработки изображений Emgu CV. Мы ознакомились с основными принципами и инструментами построения системы обработки видеопотока, используемыми в сфере обеспечения безопасности, на основе решения задачи контроля движения в заданной зоне. ПРИЛОЖЕНИЕ А Form1.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Windows; using Emgu.CV; using Emgu.CV.Structure; using Emgu.CV.Util; using Emgu.CV.CvEnum; using Emgu.CV.VideoSurveillance; using Emgu.Util; namespace TRY_3 { public partial class Form1: Form { private Capture capture; private MotionHistory motionHistory; private BackgroundSubtractor forgroundDetector;
public Form1() { InitializeComponent();
if (capture == null) { try { capture = new Capture(); motionHistory = new MotionHistory( 1.0, //in second, the duration of motion history you wants to keep 0.05, //in second, maxDelta for cvCalcMotionGradient 0.5); //in second, minDelta for cvCalcMotionGradient
capture.ImageGrabbed += ProcessFrame; capture.Start(); } catch (NullReferenceException excpt) { MessageBox.Show(excpt.Message); } } } static Rectangle zone = new Rectangle(); private Mat segMask = new Mat(); private Mat forgroundMask = new Mat(); private void ProcessFrame(object sender, EventArgs e) { Mat image = new Mat(); capture.Retrieve(image); if (forgroundDetector == null) { forgroundDetector = new BackgroundSubtractorMOG2(); } forgroundDetector.Apply(image, forgroundMask); motionHistory.Update(forgroundMask);
Rectangle[] rects; using (VectorOfRect boundingRect = new VectorOfRect()) { motionHistory.GetMotionComponents(segMask, boundingRect); rects = boundingRect.ToArray(); }
zone.X = 10; zone.Y = 100; zone.Width = 100; zone.Height = 300;
DrawMotion(image, zone, new MCvScalar(255, 255, 255));
double minArea = 10000; foreach (Rectangle comp in rects) { int area = comp.Width * comp.Height; //reject the components that have small area; if (area < minArea) continue; //центр тяжести прямоугольника double x = comp.X + (comp.Width) / 2; double y = comp.Y + (comp.Height) / 2; // if (zone.X < = x & & x < = (zone.X + zone.Width) & & zone.Y < = y & & y < = (zone.Y + zone.Height)) { CvInvoke.Rectangle(image, comp, new MCvScalar(0, 0, 255)); imageBox1.Image = image; MessageBox.Show(" Motion detection!!! "); } else { //Draw each individual motion in blue DrawMotion(image, comp, new MCvScalar(255, 0, 0)); } } imageBox1.Image = image; imageBox2.Image = forgroundMask; }
private static void DrawMotion(IInputOutputArray image, Rectangle motionRegion, MCvScalar color) { CvInvoke.Rectangle(image, motionRegion, color); } } }
|