示例#1
0
        public static AreaOfInterest GetArea(RegistryKey camKey, Guid areaID)
        {
            using (RegistryKey key = camKey.OpenSubKey(areaID.ToString()))
            {
                int       x      = (int)key.GetValue("x");
                int       y      = (int)key.GetValue("y");
                int       width  = (int)key.GetValue("width");
                int       height = (int)key.GetValue("height");
                Rectangle rect   = new Rectangle(x, y, width, height);

                AreaOfInterest area = new AreaOfInterest(
                    areaID,
                    (string)key.GetValue("AreaName"),
                    (AOIType)Enum.Parse(typeof(AOIType), (string)key.GetValue("AOIType")),
                    rect,
                    (int)key.GetValue("OriginalXResolution"),
                    (int)key.GetValue("OriginalYResolution"),
                    (MovementType)Enum.Parse(typeof(MovementType), (string)key.GetValue("MovementType")),
                    GetNotificationOption(key),
                    GetCharacteristics(key)
                    );

                return(area);
            }
        }
示例#2
0
 public static void DeleteArea(string cameraPath, string cameraPrefix, AreaOfInterest area)
 {
     using (RegistryKey camKey = FindCameraKey(cameraPath, cameraPrefix))
     {
         camKey.DeleteSubKey(area.ID.ToString());
     }
 }
示例#3
0
 public static void SaveArea(AreaOfInterest area)
 {
     using (RegistryKey key = FindCameraKey(GetGlobalString("CurrentCameraPath"), GetGlobalString("CurrentCameraPrefix")))
     {
         SaveArea(key, area);
     }
 }
示例#4
0
        public static async Task Publish(string camera, AreaOfInterest area, Frame frame, InterestingObject io)
        {
            bool result = true;

            _loggedError        = false;
            _loggedNotConnected = false;

            if (area != null && frame != null)
            {
                string baseTopic = Storage.GetGlobalString("MQTTMotionTopic");
                baseTopic = baseTopic.Replace("{Camera}", camera);
                baseTopic = baseTopic.Replace("{Area}", area.AOIName);
                baseTopic = baseTopic.Replace("{Motion}", "on");

                string topic = baseTopic;
                topic = topic.Replace("{Object}", io.FoundObject.Label);

                string payload = Storage.GetGlobalString("MQTTMotionPayload");
                payload = payload.Replace("{File}", frame.Item.PendingFile);
                payload = payload.Replace("{Confidence}", ((int)(io.FoundObject.Confidence * 100.0)).ToString());

                if (payload.Contains("{Image}"))
                {
                    payload = payload.Replace("{Image}", LoadImage(frame.Item.PendingFile));
                }

                payload = payload.Replace("{Object}", io.FoundObject.Label);
                payload = payload.Replace("{Motion}", "on");

                await SendToServer(topic, payload).ConfigureAwait(false);
            }
        }
示例#5
0
 public static void SaveArea(string cameraPath, string cameraPrefix, AreaOfInterest area)
 {
     using (RegistryKey camKey = FindCameraKey(cameraPath, cameraPrefix))
     {
         SaveArea(camKey, area);
     }
 }
示例#6
0
 public static void DeleteArea(string cameraPath, string cameraPrefix, AreaOfInterest area)
 {
     if (!string.IsNullOrEmpty(cameraPath) && !string.IsNullOrEmpty(cameraPrefix) && area != null)
     {
         using (RegistryKey camKey = FindCameraKey(cameraPath, cameraPrefix))
         {
             camKey.DeleteSubKey(area.ID.ToString());
         }
     }
 }
示例#7
0
 public static void SaveArea(CameraData cam, AreaOfInterest area)
 {
     using (RegistryKey cameraKey = FindCameraKey(cam.Path, cam.CameraPrefix))
     {
         if (null != cameraKey)
         {
             SaveArea(cameraKey, area);
         }
     }
 }
示例#8
0
 // Copy constructor for an area.
 public AreaOfInterest(AreaOfInterest src)
 {
     ID                  = src.ID; //
     AOIName             = src.AOIName;
     AOIType             = src.AOIType;
     AreaRect            = src.AreaRect;
     OriginalXResolution = src.OriginalXResolution;
     OriginalYResolution = src.OriginalYResolution;
     MovementType        = src.MovementType;
     Notifications       = new AreaNotificationOption(src.Notifications);
     SearchCriteria      = new List <ObjectCharacteristics>(src.SearchCriteria);
 }
示例#9
0
        private void OnActivate(object sender, EventArgs e)
        {
            ListViewItem   item         = areasListView.SelectedItems[0];
            AreaOfInterest area         = (AreaOfInterest)item.Tag;
            AreaOfInterest adjustedArea = new AreaOfInterest(area);

            if (area.OriginalXResolution != BitmapResolution.XResolution || area.OriginalYResolution != BitmapResolution.YResolution)
            {
                // OK, we are editing an area at a resolution we did not create it at.
                // Therefore, we need to adjust the area so we can edit it.

                adjustedArea.AreaRect            = area.GetRect();
                adjustedArea.OriginalXResolution = BitmapResolution.XResolution;
                adjustedArea.OriginalYResolution = BitmapResolution.YResolution;
            }

            using (CreateAOI dlg = new CreateAOI(adjustedArea))
            {
                DialogResult result = dlg.ShowDialog();

                if (dlg.DeleteItem)
                {
                    _areas.Remove(area.ID);
                    areasListView.Items.RemoveAt(areasListView.SelectedIndices[0]);
                    area.Dispose();         // the original area
                    adjustedArea.Dispose(); // the copy
                }
                else if (result == DialogResult.OK)
                {
                    item.Text             = adjustedArea.AOIName; // it may have changed.
                    item.Tag              = adjustedArea;
                    area.AreaRect         = adjustedArea.GetRect();
                    item.SubItems[1].Text = adjustedArea.GetRect().X.ToString();
                    item.SubItems[2].Text = adjustedArea.GetRect().Y.ToString();
                    item.SubItems[3].Text = adjustedArea.GetRect().Width.ToString();
                    item.SubItems[4].Text = adjustedArea.GetRect().Height.ToString();

                    _areas.UpdateArea(adjustedArea);
                    area.Dispose(); // the original, unmodified one
                    _areas.Save();
                }
                else if (result == DialogResult.Yes)
                {
                    // An artificial response indicating we should edit an area of interest
                    EditAreaID = adjustedArea.ID;
                    _areas.UpdateArea(adjustedArea);
                    _areas.Save();
                    area.Dispose(); // the original unmodified one
                    DialogResult = DialogResult.Yes;
                    Close();
                }
            }
        }
示例#10
0
    static int ObjectToAreaOverlap(ImageObject imageObject, AreaOfInterest area)
    {
        int overlap;
        int objectArea = imageObject.ObjectRectangle.Width * imageObject.ObjectRectangle.Height;

        _ = area.GetRect().Width *area.GetRect().Height;
        Rectangle intersect     = Rectangle.Intersect(imageObject.ObjectRectangle, area.GetRect());
        int       intersectArea = intersect.Width * intersect.Height;

        double percentage = (100.0 * intersectArea) / objectArea;

        overlap = (int)Math.Round(percentage);
        return(overlap);
    }
示例#11
0
        public NotificationOptionsDialog(AreaOfInterest area)

        {
            _area = area;
            InitializeComponent();

            int count = 0;

            if (area.Notifications != null && area.Notifications.Urls != null)
            {
                foreach (var urlOptions in area.Notifications.Urls)
                {
                    ListViewItem urlItem = new ListViewItem(new string[] { urlOptions.Url, urlOptions.WaitTime.ToString(), urlOptions.CoolDown.CooldownTime.ToString() });
                    urlsList.Items.Add(urlItem);
                    urlItem.Tag = urlOptions;

                    ++count;
                }

                if (urlsList.Items.Count > 0)
                {
                    urlsList.Items[0].Selected = true;
                    urlsList.Select();
                }

                NoMotionUrlNotify.Text    = area.Notifications.NoMotionUrlNotify;
                NoMotionMQTTCheck.Checked = area.Notifications.NoMotionMQTTNotify;
                UseMQTTBox.Checked        = area.Notifications.UseMQTT;
            }

            count = 0;
            if (area.Notifications.Email != null)
            {
                foreach (var address in area.Notifications.Email)
                {
                    ListViewItem emailItem = new ListViewItem(address);
                    emailsList.Items.Add(emailItem);
                    ++count;
                }

                if (emailsList.Items.Count > 0)
                {
                    emailsList.Items[0].Selected = true;
                    emailsList.Select();
                }
            }

            UseMQTTBox.Checked = area.Notifications.UseMQTT;
        }
示例#12
0
        public static SortedDictionary <Guid, AreaOfInterest> GetAllAreas(string cameraPath, string cameraPrefix)
        {
            SortedDictionary <Guid, AreaOfInterest> areas = new SortedDictionary <Guid, AreaOfInterest>();

            using (RegistryKey camKey = FindCameraKey(cameraPath, cameraPrefix))
            {
                if (null != camKey)
                {
                    foreach (var areaID in camKey.GetSubKeyNames()) // A GUID
                    {
                        AreaOfInterest area = GetArea(camKey, Guid.Parse(areaID));
                        areas.Add(area.ID, area);
                    }
                }
            }

            return(areas);
        }
示例#13
0
        public static void SaveArea(RegistryKey camKey, AreaOfInterest area)
        {
            camKey.DeleteSubKeyTree(area.ID.ToString(), false);

            using (RegistryKey key = camKey.CreateSubKey(area.ID.ToString(), true))
            {
                key.SetValue("x", area.AreaRect.X, RegistryValueKind.DWord);
                key.SetValue("y", area.AreaRect.Y, RegistryValueKind.DWord);
                key.SetValue("width", area.AreaRect.Width, RegistryValueKind.DWord);
                key.SetValue("height", area.AreaRect.Height, RegistryValueKind.DWord);
                key.SetValue("AreaName", area.AOIName, RegistryValueKind.String);
                key.SetValue("AOIType", area.AOIType.ToString(), RegistryValueKind.String);
                key.SetValue("OriginalXResolution", area.OriginalXResolution, RegistryValueKind.DWord);
                key.SetValue("OriginalYResolution", area.OriginalYResolution, RegistryValueKind.DWord);
                key.SetValue("MovementType", area.MovementType.ToString(), RegistryValueKind.String);
                SaveNotificationOption(key, area.Notifications);
                SaveCharacteristcs(key, area.SearchCriteria);
            }
        }
示例#14
0
        public CreateAOI(Rectangle imageRect, Point zoneFocus, int xResolution, int yResolution) // The area on the actual image, not the display image
        {
            InitializeComponent();
            Area = new AreaOfInterest
            {
                ZoneFocus           = zoneFocus,
                OriginalXResolution = xResolution,
                OriginalYResolution = yResolution,
            };

            _rectangle                = imageRect;
            doorButton.Checked        = true;
            anyActivityButton.Checked = true;

            if (imageRect.X < -5000)
            {
                imageRect.X = -5000;
            }

            if (imageRect.Y < -5000)
            {
                imageRect.Y = -5000;
            }

            xNumeric.Value      = imageRect.X;
            yNumeric.Value      = imageRect.Y;
            widthNumeric.Value  = imageRect.Width;
            heighNumeric.Value  = imageRect.Height;
            OriginalXResolution = xResolution;
            OriginalYResolution = yResolution;


            if (!Storage.GetGlobalBool("EmailSetup"))
            {
                MessageBox.Show("In order to set Areas of Interest you must first set your email contact information.  This is a one time only requirement.");
                using (OutgoingEmailDialog dlg = new OutgoingEmailDialog())
                {
                    dlg.ShowDialog();
                }
            }
        }
示例#15
0
        public static async Task Publish(string camera, AreaOfInterest area, Frame frame)
        {
            string baseTopic = Settings.Default.MQTTMotionTopic;

            baseTopic = baseTopic.Replace("{Camera}", camera);
            baseTopic = baseTopic.Replace("{Area}", area.AOIName);
            baseTopic = baseTopic.Replace("{Motion}", "on");

            foreach (InterestingObject io in frame.Interesting)
            {
                string topic = baseTopic;
                topic = topic.Replace("{Object}", io.FoundObject.Label);

                string payload = Settings.Default.MQTTMotionPayload;
                payload = payload.Replace("{File}", frame.Item.PendingFile);
                payload = payload.Replace("{Confidence}", ((int)(io.FoundObject.Confidence * 100.0)).ToString());
                payload = payload.Replace("{Image}", LoadImage(frame.Item.PendingFile));
                payload = payload.Replace("{Object}", io.FoundObject.Label);
                payload = payload.Replace("{Motion}", "on");

                await Publish(topic, payload).ConfigureAwait(false);
            }
        }
示例#16
0
        public CreateAOI(AreaOfInterest area) // The area on the actual image, not the display image
        {
            InitializeComponent();
            Area = area;

            if (area != null)
            {
                _rectangle     = area.AreaRect;
                Area.ZoneFocus = area.ZoneFocus;
                Rectangle rect = area.AreaRect;
                doorButton.Checked        = true;
                anyActivityButton.Checked = true;
                OriginalXResolution       = area.OriginalXResolution;
                OriginalYResolution       = area.OriginalYResolution;

                if (rect.X > 5000)
                {
                    rect.X = 5000;
                }

                if (rect.Y > 3000)
                {
                    rect.Y = 3000;
                }

                if (rect.X < -5000)
                {
                    rect.X = -5000;
                }


                if (rect.Y < -5000)
                {
                    rect.Y = -5000;
                }


                xNumeric.Value     = rect.X;
                yNumeric.Value     = rect.Y;
                widthNumeric.Value = rect.Width;
                heighNumeric.Value = rect.Height;

                aoiNameText.Text = area.AOIName;

                switch (area.AOIType)
                {
                case AOIType.Door:
                    doorButton.Checked = true;
                    break;

                case AOIType.PeopleWalking:
                    peopleWalkingButton.Checked = true;
                    break;

                case AOIType.GarageDoor:
                    garageButton.Checked = true;
                    break;

                case AOIType.Driveway:
                    drivewayButton.Checked = true;
                    break;

                case AOIType.IgnoreObjects:
                    ignoreButton.Checked = true;
                    break;
                }


                switch (area.MovementType)
                {
                case MovementType.AnyActivity:
                    anyActivityButton.Checked = true;
                    break;

                case MovementType.Arrival:
                    arrivingButton.Checked = true;
                    break;

                case MovementType.Departure:
                    departingButton.Checked = true;
                    break;
                }

                if (null != area.SearchCriteria)
                {
                    foreach (ObjectCharacteristics obj in area.SearchCriteria)
                    {
                        ListViewItem item = new ListViewItem(new string[]
                                                             { obj.ObjectType.ToString(),
                                                               obj.Confidence.ToString(),
                                                               obj.MinPercentOverlap.ToString(),
                                                               obj.MinimumXSize.ToString(),
                                                               obj.MinimumYSize.ToString(),
                                                               obj.TimeFrame.ToString() });

                        ObjectsListView.Items.Add(item);

                        item.Tag = obj;
                    }
                }
            }
        }
示例#17
0
        public CreateAOI(AreaOfInterest area) // The area on the actual image, not the display image
        {
            InitializeComponent();
            Area           = area;
            _rectangle     = area.AreaRect;
            Area.ZoneFocus = area.ZoneFocus;
            Rectangle rect = area.AreaRect;

            doorButton.Checked        = true;
            anyActivityButton.Checked = true;
            OriginalXResolution       = area.OriginalXResolution;
            OriginalYResolution       = area.OriginalYResolution;

            if (rect.X < -5000)
            {
                rect.X = -5000;
            }

            if (rect.Y < -5000)
            {
                rect.Y = -5000;
            }


            xNumeric.Value     = rect.X;
            yNumeric.Value     = rect.Y;
            widthNumeric.Value = rect.Width;
            heighNumeric.Value = rect.Height;

            aoiNameText.Text = area.AOIName;

            switch (area.AOIType)
            {
            case AOIType.Door:
                doorButton.Checked = true;
                break;

            case AOIType.PeopleWalking:
                peopleWalkingButton.Checked = true;
                break;

            case AOIType.GarageDoor:
                garageButton.Checked = true;
                break;

            case AOIType.Driveway:
                drivewayButton.Checked = true;
                break;

            case AOIType.IgnoreObjects:
                ignoreButton.Checked = true;
                break;
            }

            switch (area.MovementType)
            {
            case MovementType.AnyActivity:
                anyActivityButton.Checked = true;
                break;

            case MovementType.Arrival:
                arrivingButton.Checked = true;
                break;

            case MovementType.Departure:
                departingButton.Checked = true;
                break;
            }

            if (null != area.SearchCriteria)
            {
                foreach (ObjectCharacteristics obj in area.SearchCriteria)
                {
                    switch (obj.ObjectType)
                    {
                    case ImageObjectType.People:
                        peopleCheck.Checked           = true;
                        peopleConfidenceNumeric.Value = obj.Confidence;
                        peopleMinimumOverlap.Value    = obj.MinPercentOverlap;
                        peopleFramesNumeric.Value     = obj.TimeFrame;
                        peopleMinXNumeric.Value       = obj.MinimumXSize;
                        peopleMinYNumeric.Value       = obj.MinimumYSize;
                        break;

                    case ImageObjectType.Cars:
                        carsCheck.Checked           = true;
                        carsConfidenceNumeric.Value = obj.Confidence;
                        carsOverlapNumeric.Value    = obj.MinPercentOverlap;
                        carsFramesNumeric.Value     = obj.TimeFrame;
                        carsMinXNumeric.Value       = obj.MinimumXSize;
                        carsMinYNumeric.Value       = obj.MinimumYSize;
                        break;

                    case ImageObjectType.Motorcycles:
                        motorcycleCheck.Checked            = true;
                        motorcyclesConfidenceNumeric.Value = obj.Confidence;
                        motorcyclesOverlapNumeric.Value    = obj.MinPercentOverlap;
                        motorcyclesFramesNumeric.Value     = obj.TimeFrame;
                        motorcyclesMinXNumeric.Value       = obj.MinimumXSize;
                        motorcyclesMinYNumeric.Value       = obj.MinimumYSize;
                        break;

                    case ImageObjectType.Trucks:
                        truckCheck.Checked            = true;
                        trucksConfidenceNumeric.Value = obj.Confidence;
                        trucksOverlapNumeric.Value    = obj.MinPercentOverlap;
                        trucksFramesNumeric.Value     = obj.TimeFrame;
                        trucksMinXNumeric.Value       = obj.MinimumXSize;
                        trucksMinYNumeric.Value       = obj.MinimumYSize;
                        break;

                    case ImageObjectType.Bikes:
                        bikeCheck.Checked            = true;
                        bikesConfidenceNumeric.Value = obj.Confidence;
                        bikesOverlapNumeric.Value    = obj.MinPercentOverlap;
                        bikesFramesNumeric.Value     = obj.TimeFrame;
                        bikesMinXNumeric.Value       = obj.MinimumXSize;
                        bikesMinYNumeric.Value       = obj.MinimumYSize;
                        break;

                    case ImageObjectType.Bears:
                        bearsCheck.Checked           = true;
                        bearsConfidenceNumeric.Value = obj.Confidence;
                        bearsOverlapNumeric.Value    = obj.MinPercentOverlap;
                        bearsFramesNumeric.Value     = obj.TimeFrame;
                        bearsMinXNumeric.Value       = obj.MinimumXSize;
                        bearsMinYNumeric.Value       = obj.MinimumXSize;
                        break;

                    case ImageObjectType.Animals:
                        animalsCheck.Checked           = true;
                        animalsConfidenceNumeric.Value = obj.Confidence;
                        animalsOverlapNumeric.Value    = obj.MinPercentOverlap;
                        animalsFramesNumeric.Value     = obj.TimeFrame;
                        animalsMinXNumeric.Value       = obj.MinimumXSize;
                        animalsMinYNumeric.Value       = obj.MinimumXSize;
                        break;
                    }
                }
            }
        }
示例#18
0
 public InterestingObject(AreaOfInterest area, ImageObject found, int overlap)
 {
     Area        = area;
     FoundObject = found;
     Overlap     = overlap;
 }